LLM-роутинг: когда GPT-4 — это перебор
Простой выбор модели по документу, который снизил мой LLM-счёт на 40% без потери качества.
Когда выпускаешь LLM-продукт, первый порыв — дефолтиться на лучшую модель. GPT-4o на всё. Это нормальный дефолт, пока месячный счёт не уходит в четырёхзначные, и ты понимаешь, что половина трафика — это перевод рецептов в PDF, для которых GPT-4o смешно избыточен.
На BookahTranslate я сделал простенький роутер, выбирающий модель по трём сигналам: тип документа, тариф пользователя, объём. Выглядит незатейливо. Работает.
def pick_model(doc: Document, tier: UserTier) -> ModelChoice:
if tier == UserTier.ECONOMY and doc.kind in {
DocKind.TXT, DocKind.PLAIN_PDF
}:
return ModelChoice.GOOGLE_TRANSLATE
if doc.kind == DocKind.SCANNED_PDF:
return ModelChoice.GPT_4O # vision + OCR fusion
if doc.kind == DocKind.LEGAL or doc.has_dense_terminology:
return ModelChoice.CLAUDE_SONNET
if doc.pages > 200 and tier != UserTier.PREMIUM:
return ModelChoice.CLAUDE_HAIKU # bulk дёшево
return ModelChoice.GPT_4O
Почему каждая ветка
- Простые PDF и TXT на тарифе «Эконом»: Google Translate ощутимо дешевле, для рецепта или новости разница в качестве незаметна.
- Сканы: нужна vision-модель. GPT-4o сейчас лучший на OCR + перевод за один проход.
- Юридические / плотная терминология: Claude Sonnet держит консистентность терминов в длинном контексте лучше, чем GPT-4o (по моей A/B-выборке).
- Длинные документы на низких тарифах: Claude Haiku ~в 10 раз дешевле GPT-4o, и просадку качества на простой прозе сложно заметить, если не читать построчно.
От чего я бы предостерёг
Не делайте «умный роутер», который просит LLM выбрать LLM. Я пробовал. Это добавляет latency, costs и ещё один failure mode. Несколько явных веток по дешёвым сигналам (тип файла, число страниц, тариф) — правильный инструмент. Если ты не можешь сформулировать решение в 8 строках Python, ты ещё не понимаешь свой трафик достаточно, чтобы его роутить.
Observability важнее самого роутера
Каждый перевод логирует выбранную модель, токены, latency и quality-флаг (асинхронно ставит мелкий Claude-пасс, который перечитывает результат). Я еженедельно смотрю худший 1%. В 9 случаях из 10 фикс — «отправить этот профиль документа в более сильную модель», а не «улучшить промпт».