Алексей Маркин рабочий журнал

ищет по заголовкам и тексту записей и заметок

запись 3 сентября 2026 г. · 5 мин
Все статьи

Почему кириллица стоит дороже

Один и тот же текст на русском обходится в заметно большее число токенов, чем на английском. Разбираю, откуда берётся разница, во что она обходится и что с ней делать.

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

Причина не в модели и не в тарифе. Причина в том, что токенизатор считает байты.

Что происходит внутри

Современные токенизаторы работают не с буквами, а с байтами UTF-8. Это сделано осознанно: байтовый алфавит конечен и мал, в нём ровно 256 символов, и любой текст на любом языке гарантированно разложится без «неизвестного символа».

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

Здесь и появляется разница. В UTF-8 латинская буква занимает один байт, кириллическая — два. А в обучающих корпусах английского текста на порядки больше, чем русского, поэтому частые английские последовательности успели слиться в длинные токены, а русские — нет.

латиницаsystem6 букв → 6 байт → 1 токенкириллицасистема6 букв → 12 байт → несколько токеновразница копится на каждом слове запроса и каждом слове ответа
рис. 1 Одно и то же слово в байтовом BPE. Латиница: один байт на букву, частая последовательность слилась в один токен. Кириллица: два байта на букву, слияния короче — токенов больше.

Точное соотношение зависит от модели и от текста: у моделей с большими словарями и заметной долей русского в обучении разрыв меньше, у старых и «англоцентричных» — больше. Единственный способ узнать своё число — прогнать свой текст через токенизатор своей модели. Чужие цифры здесь бесполезны: они измеряли не ваш корпус.

Во что это обходится

Разница ударяет в три места сразу, и второе обычно недооценивают.

Деньги. Тарификация идёт по токенам, значит один и тот же текст стоит дороже. Насколько именно — я сначала написал «вдвое», повторив общее место, а потом измерил, и оказалось сложнее.

Три пары абзацев одинакового смысла, токены посчитаны и нормированы на длину текста в знаках:

ТокенизаторРусскийАнглийскийМножитель на знак
cl100k_base (прошлое поколение)106472.13×
o200k_base (нынешнее)64471.29×

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

Наценка не исчезла — «контекст» это по-прежнему два токена против одного у context. Но решение вроде «переписать весь интерфейс на английский ради экономии» на 1.29× выглядит уже не так, как на 2.13×.

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

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

Задержка. Генерация идёт токен за токеном. Ответ на русском физически дольше набирается, даже если по смыслу он такой же длины.

Что с этим делать

Порядок мер — по отношению эффекта к трудозатратам.

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

Включить кеширование префикса. У крупных провайдеров повторяющееся начало промпта тарифицируется дешевле. Работает только при стабильном префиксе: любая переменная в начале обнуляет попадание. Отсюда простое правило — всё изменчивое в конец.

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

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

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

Условие несогласия

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

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

Что остаётся неудобным

Соотношение меняется при смене модели, и меняется непредсказуемо. Переход на новую версию может внезапно удешевить русский текст или наоборот, и заметить это можно только по счёту, потому что в анонсах о токенизаторе пишут редко.

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