← Журнал
Jiva Studio

Самый дешёвый токен — тот, который не отправлен

Вычитка одной лекции языковой моделью стоила 10.9 цента. Теперь стоит 1.5 — в семь раз меньше, и ни цента экономии не пришло от поиска модели подешевле. Всё дело в том, за что именно мы платили модели.

Слушай СадхуEngineeringAILLM

Распознавание речи даёт восемьдесят процентов расшифровки. Оставшиеся двадцать — там, где живёт смысл: границы предложений, знаки препинания и прежде всего имена. Санскритское имя Whisper слышит как три не связанных между собой русских слова. Поэтому каждая сырая расшифровка проходит вычитку языковой моделью, прежде чем попасть к читателю.

По замерам эта вычитка стоила $0.106 за лекцию. В архиве оставалось 3900 лекций — выходило около $400. Не разорительно, но достаточно, чтобы спросить: а на что уходят эти деньги?

Оказалось, не на то. Дальше — что мы там нашли.

Сначала очевидная идея, и почему она не сработала

Первый порыв — взять модель подешевле. Открытые веса стоят долю цены за токен, а задача выглядит механической: исправь орфографию, не пересказывай.

Проверить это нам было чем. Примерно у трети архива есть расшифровка, написанная живым редактором и опубликованная рядом с аудио. Получился эталон: гоним кандидата по сырому распознаванию тех же лекций и меряем, насколько текст стал ближе к редакторскому. Не вкусовщина, а число.

Пять моделей, по три лекции на каждую, один промпт, одна нарезка:

МодельСтруктура ок / бракСнижение WERЦена
gemini-3.1-flash-lite50 / 6−30.7%$0.0914
mistral-small-3.2-24b28 / 28−10.0%$0.0154
qwen3-30b-a3b50 / 6−5.5%$0.0368
gpt-oss-120b51 / 5−3.7%$0.0944
gpt-oss-20b2 / 540%$0.0230

Дешёвые модели дёшевы потому, что почти не делают работу. gpt-oss-20b нарушила контракт ответа в 54 случаях из 56 — она попросту не возвращала тот набор сегментов, который получила. gpt-oss-120b контракт держала безупречно и при этом не поменяла почти ничего: сдвинула ошибку втрое слабее, чем прежняя модель. А поскольку она рассуждает, и рассуждения тарифицируются по выходной ставке, вышло дороже той модели, которую собирались заменить.

Цена за токен — неверный знаменатель. Верный — цена за реально исправленную ошибку, и по нему дешёвые модели оказались самыми дорогими.

Куда на самом деле уходили деньги

Тогда мы перестали смотреть на модели и посмотрели на счёт. У нашей модели вход стоит $0.25 за миллион токенов, выход — $1.50. Выход дороже в шесть раз. Замер по трём лекциям:

вход    85 493 токена   $0.0214   23%
выход   46 710 токенов  $0.0701   77%

Три четверти счёта — то, что модель пишет. А что она пишет?

Контракт тогда требовал строгий JSON: вернуть каждый сегмент чанка с исправленным текстом плюс массив, группирующий сегменты в предложения. Мы разложили настоящий ответ по долям:

Часть ответаДоля
текст, который не изменился30.9%
текст, который изменился30.7%
обвязка {"idx":…,"text":…}30.6%
массив sentences7.8%

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

Просите разницу, а не документ

Решение подсказала любая система контроля версий: возвращай то, что изменилось.

Формат ответа стал построчным. Строка на каждый исправленный сегмент, потом границы предложений:

11|Шри Прабхупада говорил об этом.
13|И потому мы читаем «Бхагавад-гиту».
ENDS
11,14

Пропуск означает «этот сегмент не трогали». Если править нечего, приходит только строка с границами.

Про строку ENDS стоит сказать отдельно — это тот же урок во второй раз.

Границы предложений мы спрашиваем потому, что готовый транскрипт хранится списком предложений с таймингами, а по одной пунктуации их в русском не построить: сокращения и инициалы содержат точку, которая ничего не заканчивает, санскритский стих в кавычках относится к вводящему его предложению, многоточие бывает паузой. Судить об этом должна модель.

Изменилось другое — сколько мы платим, чтобы это суждение услышать. Старый контракт требовал полный состав предложений: [[10,11],[12,13,14]]. А код, который эти данные читал, брал оттуда только последний номер каждой группы, остальное выбрасывал. Предложения — это идущие подряд сегменты, поэтому одни границы восстанавливают всю группировку. Мы покупали данные, которые удаляли сразу по получении; теперь модель присылает 11,14 и ничего сверх того.

Замер на тех же трёх лекциях, каждый вариант против человеческого эталона:

Формат ответаСтруктура ок / бракWER послеЦена
полный JSON (было)50 / 60.119 / 0.074 / 0.066$0.0914
разница, всё ещё JSON55 / 10.116 / 0.077 / 0.060$0.0616
разница строками55 / 10.117 / 0.079 / 0.058$0.0506
строки и только границы56 / 00.108 / 0.074 / 0.059$0.0485

Точность не изменилась, а структурный брак упал до нуля. Модель, которой велено продиктовать 150 сегментов строгим JSON, иногда теряет нить. Модель, которой нужно написать восемь коротких строк, — нет.

В бою, на сотне лекций и 4415 чанках, цена за чанк упала с $0.00527 до $0.00123 — минус 77%. Заодно снизилась и доля обращений к дорогой запасной модели: с 34% чанков до 23%, потому что ответы стали реже нарушать контракт.

Что не сработало, и почему это любопытно

Когда выход укротили, главной статьёй стал вход — 60% счёта. Мы провели прямую через 1043 боевых чанка:

токенов на входе ≈ 1482 + 0.465 × символов расшифровки

Две трети входа — постоянная часть, которую мы пересылали при каждом вызове: системный промпт, шаблон, хвост предыдущего чанка, подсказки глоссария. Ровно то, ради чего существует кэширование промпта.

Кэш отказался. У Gemini минимум для кэша — 1024 токена, а наш системный промпт занимает 558. Часом раньше мы урезали этот промпт на 40% ради экономии — и тем самым надёжно вывели его из-под кэша. Две оптимизации тянут в разные стороны, и честный ответ здесь — взять меньший, но верный выигрыш, а не раздувать промпт обратно ради скидки на слова, которые нам не нужны.

Полцены за терпение

Последний рычаг стоит только времени. Пакетные эндпоинты выполняют запросы на свободных мощностях в течение суток и берут половину обычной ставки. Импорту архива спешить некуда.

Любопытнее другое — как это влияет на скорость. Размер задания почти не важен:

Отправлено чанковВремя
275.9 мин
5214.1 мин
9612.3 мин
17964.1 мин

Решает загруженность очереди, а не объём. Дробить корпус на мелкие партии было бы только хуже: каждое задание отстоит своё ожидание заново.

Три особенности пакетных API стоит знать заранее — все три мы выяснили на своей шкуре:

  • Задание рапортует успех, когда все запросы внутри провалились. Состояние задания отвечает на вопрос «перестало ли оно двигаться», а не «сработало ли». Смотреть надо на счётчики по запросам.
  • Выпавший запрос просто отсутствует в ответах. Никакой ошибки. Найти его можно, вычтя полученные ключи из отправленных.
  • Наша модель не принимает thinkingBudget: 0 — и без него не тратит ни одного токена на рассуждения. Мы сожгли целое задание из 27 запросов на оптимизации, которая была не нужна.

Последнее стоило шести минут и дало общий урок: сначала проверьте, что параметр что-то меняет, потом ставьте его везде.

Ответы адресуются ключом, который задаём мы сами (трек:чанк), поэтому отставших легко подобрать. Всё, что пакет не привёз, вычитывается вживую при разборе, в том же проходе — несколько центов вместо новых суток ожидания. На 3214 чанках живой путь понадобился 22 раза, и ни один чанк не потерялся.

Что вышло в сумме

за лекцию                                      за чанк

$0.1086   полный JSON, синхронно          1×    $0.00527
$0.0544   строками, синхронно           2.0×    $0.00123
$0.0146   строками, пакетом, чанки по 50 7.4×   $0.00075

Десять и девять десятых цента за лекцию превратились в полтора. В семь раз меньше.

На оставшихся 3900 лекциях это с $423 до $57 — а прогон, давший эти числа, 1543 лекции за один вечер, обошёлся примерно в $22.

Ни цента из этой экономии не пришло от модели подешевле. Всё пришло из простого наблюдения: мы платили по самой дорогой ставке в счёте за то, чтобы модель повторила отправленный ей текст, обернула его в знаки, которые мы выбрасывали, и перечислила группы, от которых мы оставляли последний элемент.

Приём работает не только у нас. Когда вызов модели кажется дорогим, полезно спрашивать не «какая модель дешевле», а какая доля ответа несёт то, чего у нас ещё не было — и не выставляет ли выбранный формат счёт за всё остальное.


Часть проекта

Слушай Садху

Открыть проект