Месяц считал реальную цену LLM-ассистента: вы платите не за токены, а за мусор в контексте

Я месяц вёл журнал каждого вызова своего рабочего LLM-ассистента — не «на глазок», а по логам. Задача была простая и скучная: понять, сколько он реально стоит. Ответ меня удивил настолько, что решил выложить цифры целиком. Спойлер: модель почти ни при чём.

Почему я вообще полез в логи

У меня ассистент гоняет рутину в нескольких проектах: разбор почты, черновики ответов, сортировка задач. Подписка на «готовое решение» стоила бы $30–40 в месяц на пользователя, и я хотел понять — а не дешевле ли собрать то же самое на прямых API-вызовах.

Первый заход «по тарифам» дал картинку, которая меня успокоила: GPT-4o — $2,50 за миллион входных токенов и $10 за миллион выходных; Claude Sonnet — $3 / $15. На бумаге месяц работы выглядел почти бесплатным.

Реальность оказалась примерно в четыре раза дороже бумаги. И вот почему.

Цифра первая: 4,2 миллиона токенов на вход — и половина из них мусор

За месяц ассистент обработал 1017 задач. Итого 4 180 000 входных токенов и 610 000 выходных. По прайсу GPT-4o это $10,45 на входе и $6,10 на выходе — $16,55 за месяц. Звучит скромно.

Но когда я разложил эти 4,2 миллиона по категориям, выяснилось: 2,1 миллиона — это один и тот же контекст, который пересылался в каждом новом витке диалога. Системный промпт, история, список правил. Я платил за то, чтобы модель в сотый раз прочитала свой собственный вчерашний ответ.

Вот реальный фрагмент из лога (токены посчитаны по usage-полю ответа API):

```

request #812 prompt_tokens=41280 completion_tokens=214

request #813 prompt_tokens=41602 completion_tokens=198

request #814 prompt_tokens=41971 completion_tokens=205

```

Три соседних вызова — и на каждый ушло по 40 с лишним тысяч токенов на входе, хотя полезной новой информации там на пару сотен. Это и есть дыра, в которую утекает бюджет.

Цифра вторая: 38% стоимости — это повторные запросы после ошибок

Я посчитал вызовы, которые закончились ретраем: таймаут, пустой ответ, сбой парсера JSON, повторная отправка той же задачи. Их набралось 389 из 1017. То есть каждый третий запрос я платил дважды, а иногда и трижды.

По деньгам: из $16,55 итогового счёта примерно $6,30 — это чисто переплата за то, что я не выставил нормальный таймаут и не валидировал ответ перед следующей итерацией. Модель здесь ни в чём не виновата — она честно отвечала. Виновата обвязка вокруг неё.

Цифра третья: тот же объём работы на дешёвой модели дал бы $2,10 — но я не стал переходить

Ради честности прогнал контрольную неделю на лёгкой модели (Gemini Flash, $0,10 / $0,40). Счёт упал до $2,10 в пересчёте на тот же объём — в семь с половиной раз дешевле. Но качество разбора почты просело настолько, что на ручную вычитку я потратил больше времени, чем сэкономил на токенах.

Вывод, который я не планировал делать: оптимизация стоимости — это не «взять модель подешевле». Это сначала вычистить пайплайн, а уже потом смотреть на прайс.

Где на самом деле теряются деньги

После месяца журналирования у меня сложилась простая иерархия, куда уходит бюджет LLM-ассистента:

1. Контекст-мусор — пересылка неизменной истории в каждом витке. У меня это половина всех входных токенов.

2. Ретраи и повторы — каждый третий вызов оплачивается дважды.

3. Отсутствие кэша — платформы отдают prompt caching со скидкой до 90%, я первое время его не включал.

4. И только на четвёртом месте — собственно тариф модели.

Забавно, что именно тариф — то, на что все смотрят в первую очередь, — в моём случае отвечал за меньшую часть счёта. Консенсус «бери модель подешевле и радуйся» здесь просто не работает.

Что изменилось после чистки

Я включил prompt caching, выставил жёсткие таймауты, валидацию ответа перед ретраем и обрезал системный контекст до минимума. Тот же объём работы (те же ~1000 задач) на той же GPT-4o теперь стоит $9,70 вместо $16,55 — минус 41% без смены модели.

Это, кстати, и есть мой главный тезис, с которым можно спорить в комментариях: инструмент не проблема — проблема пайплайн вокруг него. Модель не дорогая и не дешёвая, она просто честно жрёт всё, что вы ей подаёте. И если в контексте мусор — вы платите за мусор.

Возражения принимаю: особенно интересно, у кого на реальном проде доля контекст-мусора заметно ниже моих 50%, и чем вы этого добились.