Самый дешёвый токен — тот, который не отправлен
Вычитка одной лекции языковой моделью стоила 10.9 цента. Теперь стоит 1.5 — в семь раз меньше, и ни цента экономии не пришло от поиска модели подешевле. Всё дело в том, за что именно мы платили модели.
Распознавание речи даёт восемьдесят процентов расшифровки. Оставшиеся двадцать — там, где живёт смысл: границы предложений, знаки препинания и прежде всего имена. Санскритское имя Whisper слышит как три не связанных между собой русских слова. Поэтому каждая сырая расшифровка проходит вычитку языковой моделью, прежде чем попасть к читателю.
По замерам эта вычитка стоила $0.106 за лекцию. В архиве оставалось 3900 лекций — выходило около $400. Не разорительно, но достаточно, чтобы спросить: а на что уходят эти деньги?
Оказалось, не на то. Дальше — что мы там нашли.
Сначала очевидная идея, и почему она не сработала
Первый порыв — взять модель подешевле. Открытые веса стоят долю цены за токен, а задача выглядит механической: исправь орфографию, не пересказывай.
Проверить это нам было чем. Примерно у трети архива есть расшифровка, написанная живым редактором и опубликованная рядом с аудио. Получился эталон: гоним кандидата по сырому распознаванию тех же лекций и меряем, насколько текст стал ближе к редакторскому. Не вкусовщина, а число.
Пять моделей, по три лекции на каждую, один промпт, одна нарезка:
| Модель | Структура ок / брак | Снижение WER | Цена |
|---|---|---|---|
| gemini-3.1-flash-lite | 50 / 6 | −30.7% | $0.0914 |
| mistral-small-3.2-24b | 28 / 28 | −10.0% | $0.0154 |
| qwen3-30b-a3b | 50 / 6 | −5.5% | $0.0368 |
| gpt-oss-120b | 51 / 5 | −3.7% | $0.0944 |
| gpt-oss-20b | 2 / 54 | 0% | $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% |
массив sentences | 7.8% |
Полезная работа — только вторая строка. Мы платили по самой дорогой ставке в счёте за то, чтобы модель продиктовала нам обратно, слово в слово, ту половину расшифровки, которую сама же признала верной — и попутно обернула каждую строку в скобки и кавычки.
Просите разницу, а не документ
Решение подсказала любая система контроля версий: возвращай то, что изменилось.
Формат ответа стал построчным. Строка на каждый исправленный сегмент, потом границы предложений:
11|Шри Прабхупада говорил об этом.
13|И потому мы читаем «Бхагавад-гиту».
ENDS
11,14
Пропуск означает «этот сегмент не трогали». Если править нечего, приходит только строка с границами.
Про строку ENDS стоит сказать отдельно — это тот же урок во второй раз.
Границы предложений мы спрашиваем потому, что готовый транскрипт хранится списком предложений с таймингами, а по одной пунктуации их в русском не построить: сокращения и инициалы содержат точку, которая ничего не заканчивает, санскритский стих в кавычках относится к вводящему его предложению, многоточие бывает паузой. Судить об этом должна модель.
Изменилось другое — сколько мы платим, чтобы это суждение услышать. Старый
контракт требовал полный состав предложений: [[10,11],[12,13,14]]. А код,
который эти данные читал, брал оттуда только последний номер каждой группы,
остальное выбрасывал. Предложения — это идущие подряд сегменты, поэтому одни
границы восстанавливают всю группировку. Мы покупали данные, которые удаляли
сразу по получении; теперь модель присылает 11,14 и ничего сверх того.
Замер на тех же трёх лекциях, каждый вариант против человеческого эталона:
| Формат ответа | Структура ок / брак | WER после | Цена |
|---|---|---|---|
| полный JSON (было) | 50 / 6 | 0.119 / 0.074 / 0.066 | $0.0914 |
| разница, всё ещё JSON | 55 / 1 | 0.116 / 0.077 / 0.060 | $0.0616 |
| разница строками | 55 / 1 | 0.117 / 0.079 / 0.058 | $0.0506 |
| строки и только границы | 56 / 0 | 0.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% ради экономии — и тем самым надёжно вывели его из-под кэша. Две оптимизации тянут в разные стороны, и честный ответ здесь — взять меньший, но верный выигрыш, а не раздувать промпт обратно ради скидки на слова, которые нам не нужны.
Полцены за терпение
Последний рычаг стоит только времени. Пакетные эндпоинты выполняют запросы на свободных мощностях в течение суток и берут половину обычной ставки. Импорту архива спешить некуда.
Любопытнее другое — как это влияет на скорость. Размер задания почти не важен:
| Отправлено чанков | Время |
|---|---|
| 27 | 5.9 мин |
| 521 | 4.1 мин |
| 961 | 2.3 мин |
| 1796 | 4.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.
Ни цента из этой экономии не пришло от модели подешевле. Всё пришло из простого наблюдения: мы платили по самой дорогой ставке в счёте за то, чтобы модель повторила отправленный ей текст, обернула его в знаки, которые мы выбрасывали, и перечислила группы, от которых мы оставляли последний элемент.
Приём работает не только у нас. Когда вызов модели кажется дорогим, полезно спрашивать не «какая модель дешевле», а какая доля ответа несёт то, чего у нас ещё не было — и не выставляет ли выбранный формат счёт за всё остальное.
Часть проекта
Слушай Садху