Открыл вчера дашборд по потреблению токенов — и завис.
Смотрю на график и понимаю — что-то не сходится. Задач у ассистента за месяц было плюс-минус столько же, что и в прошлом. А токенов на выходе — больше процентов на десять. Я было решил, что это очередной клиент раскочегарился, полез в разбивку по проектам — нет, у всех понемногу.
Ну.
Полез читать сами ответы модели. И первое, что бросилось в глаза — почти каждый начинается с «Конечно!», «Отличный вопрос!», «С радостью помогу!». А дальше идёт ещё полтора-два предложения про то, как модель собирается ответить. И только потом — собственно ответ.
Я подумал: а сколько я за это плачу?
Простой эксперимент: 500 запросов, один регэксп
Решил не гадать и замерить.
Взял 500 типовых запросов — имитация того, что у нас крутится в проде. Классификация обращений, извлечение полей из документов, ответы на вопросы по регламенту, генерация краткого саммари письма. Прогнал через claude-sonnet-4-5 на одинаковых настройках — temperature=0.2, один и тот же system prompt, который у нас в работе (с поправкой на домен — обезличенный).
И написал скрипт на 30 строк, который парсит выходы модели и считает «мусорные» токены — вступления, похвалы, мета-комментарии про процесс, финальные «Если потребуется уточнение — дайте знать!».
Регэкспы простые, без фанатизма:
FILLER_PATTERNS = [ r"^(Конечно|Безусловно|Разумеется|Хорошо)[,!\.]", r"^(Отлично|Отличный вопрос|Замечательно)[!\.]", r"^(С радостью|С удовольствием)", r"^(Давайте|Позвольте)", r"(Надеюсь,? это (помогло|поможет))", r"(Если (у вас )?(есть|возникнут) (ещё )?вопросы)", r"(Дайте знать,? если)",]
Плюс руками разметил первые 50 ответов — на случай, если регэкспы что-то упустят. Потом померил — регэкспы ловили 94% «мусора», ручная разметка добавляла ещё 6%. Погрешность в нашу пользу — реальные цифры чуть больше моих.
Что получилось
На 500 запросах — 11,3% выходных токенов уходили на вежливость и мета-комментарии.
Разбивка по типам:
|
Что именно |
Доля от «мусора» |
|---|---|
|
Вступительные фразы («Конечно!», «Отлично!») |
28% |
|
Мета-комментарий «сейчас я…» |
34% |
|
Финальные «надеюсь, помогло» |
22% |
|
Переформулировка вопроса в начале |
16% |
Самый жирный кусок — не приветствия, а именно мета-комментарий про сам процесс. Модель как будто подробно рассказывает, как она собирается отвечать, прежде чем ответить. Для чата с пользователем это полезно — он чувствует, что «думают». Для бэкэнд-интеграции, где ответ парсится в JSON — это выброшенные деньги.
Поставил честный тест: взял 100 ответов, руками вырезал весь мусор — оставил только то, за чем ходили. Смысл ответа не терялся ни в одном случае. Ноль.
Три строки, которые это убрали
Подтюнил system prompt. Не переписывал — добавил три строки. Вот что стояло до:
Ты — ассистент для обработки [ДОМЕН]. Отвечай точно,опирайся только на переданный контекст. Если данных нет —честно скажи об этом.
Добавил:
Ты — ассистент для обработки [ДОМЕН]. Отвечай точно,опирайся только на переданный контекст. Если данных нет —честно скажи об этом.Формат ответа:- Никаких вступлений, похвалы вопроса, объяснений «что я сейчас сделаю».- Никаких финальных фраз типа «надеюсь, помог».- Сразу суть. Если нужен список — сразу список. Если число — сразу число.
Прогнал те же 500 запросов второй раз.
«Мусора» осталось 1,8%. Экономия — 9,5% выходных токенов.
Сколько это в деньгах
Я не буду делать вид, что посчитал месячный счёт до копейки — у нас несколько проектов, несколько моделей, расчёт сложный. Но на уровне прикидки:
Если у вас сервис на 2000 запросов в день и средний ответ — 400 токенов на Claude Sonnet 4.5, то 9,5% экономии за месяц — это около 4 200 ₽. Если запросов 20 000 в день — 42 000 ₽. И это не считая того, что контекст на следующем шаге короче — значит дешевле ещё и вход.
Для нашего основного проекта это получилось 4 730 ₽ за первый же месяц после правки. Скрипт — 30 строк. Правка промпта — пять минут. Рентабельность вне конкуренции.
Что сломалось
Честно скажу — не всё прошло гладко.
Два кейса, где я откатил правку:
Первый — клиентский чат. Там «Конечно!» и «Надеюсь, помогло» — часть UX. Без них ответ выглядел сухим и чуть ли не грубым. Пользователи стали писать в фидбек, что бот «какой-то злой». Вернул вежливость — метрика удовлетворённости отползла обратно.
Второй — цепочка с инструментами. У Claude есть привычка в начале описывать, что он собирается делать с tool use. Я это отрезал — и модель начала в половине случаев просто вызывать не тот инструмент. Как будто «проговаривание» помогало ей самой выстроить план. Вернул — стало лучше.
Вывод простой: режь мусор там, где ответ парсит машина, не человек. В живом чате — оставляй.
Что дальше
Следующий заход — то же самое, но по входящим токенам. Там свой зоопарк — пользователи пишут «Здравствуйте, подскажите пожалуйста…» и три строки про погоду. Это всё едет в контекст модели и тоже стоит денег. У меня уже есть гипотеза, что если чистить вход тем же регэкспом, до модели даже доходит, — экономится ещё процентов пять.
Но это уже другая статья.
ссылка на оригинал статьи https://habr.com/ru/articles/1023024/