Как мы снизили расходы на LLM в 2.3 раза без падения качества
2026-03-20 · Мария Петрова
Как мы снизили расходы на LLM в 2.3 раза без падения качества
В конце прошлого года месячный счёт за LLM-инференс у одного из наших клиентов перевалил за $38k/мес. К марту мы довели его до $16.5k без потерь качества на eval-сете. Разбираем, что сработало.
1. Prompt caching — самая большая победа
Anthropic и OpenAI поддерживают кеширование префиксов промпта. Если у вас длинный system prompt (инструкции + few-shot примеры + документы), и он повторяется из запроса в запрос — вы платите за него один раз в 5 минут, а не на каждый запрос.
В нашем случае system prompt был ~4.5k токенов. После включения prompt caching стоимость одного запроса упала на ~62%.
response = client.messages.create(
model="claude-3-sonnet-20240229",
system=[
{"type": "text", "text": FEW_SHOT_BLOCK, "cache_control": {"type": "ephemeral"}},
],
messages=[{"role": "user", "content": user_msg}],
)
2. Routing между моделями по сложности задачи
Не все задачи требуют топовой модели. Мы построили маленький роутер (по сути — логистическая регрессия на 12 фичах запроса), который отправляет простые кейсы в Haiku, сложные — в Sonnet.
| Класс задачи | Модель | Доля трафика |
|---|---|---|
| Простые (FAQ, template) | Haiku | 58% |
| Средние (classification, extraction) | Sonnet | 34% |
| Сложные (reasoning, multi-turn) | Opus | 8% |
Итоговая средняя стоимость упала в 3.1 раза при сохранении качества (measured on holdout eval).
3. Укорачивание output через max_tokens и структурированный вывод
Раньше модель «писала сочинения» даже на yes/no задачи. Жёсткий max_tokens и tool calling с JSON schema убрали эту болезнь: output с 180 токенов в среднем упал до 35.
4. Batch API для офлайн-задач
Всё, что не требует realtime (ночные пересчёты, backfill, отчёты), переехало в batch API со скидкой 50%. Это ~18% нашего трафика.
5. Агрессивный трим контекста в RAG
Retrieval возвращал top-10 документов, в модель шли top-10. Заменили на top-5 + reranker, quality не упало, токенов на вход стало в 2 раза меньше.
6. Мониторинг на уровне запроса, а не модели
Дашборд по стоимости на каждый prompt_id. Видно, что один невинный prompt жрёт 40% бюджета — идёшь и оптимизируешь именно его. До этого оптимизировали «в среднем по больнице» — неэффективно.
Итоговая раскладка
| Оптимизация | Вклад в экономию |
|---|---|
| Prompt caching | 32% |
| Model routing | 28% |
| Batch API | 12% |
| Output trimming | 9% |
| RAG context trim | 11% |
| Прочее (retry logic, dedup) | 8% |
Вывод
Большая часть экономии — не про «взять модель подешевле», а про убрать лишнее. Кеш работает бесплатно, роутинг окупается за неделю, а дашборды по prompt-level cost стоит завести ещё до того, как начнёте оптимизировать.
← Ко всем постам