Почему русский текст считается в токенах иначе, чем английский

Одна и та же фраза на русском и английском стоит по-разному не потому, что кто-то накручивает счётчик, а потому, что токенизатор режет кириллицу иначе.

4 мин · · Обновлено · модели · разработка

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

Что вообще режется на токены

Любая модель в каталоге — что claude-opus-5-5, что gpt-5.6-sol, что glm-5.3 — не читает текст по буквам и не по словам. Внутри стоит токенизатор (обычно вариант BPE, byte-pair encoding), который режет входной текст на куски по словарю, обученному на огромном корпусе текстов. Этот словарь — конечный список: у большинства современных моделей это несколько десятков или сотен тысяч токенов. Частые в обучающих данных последовательности символов получают отдельный токен, редкие — распадаются на более мелкие куски, иногда вплоть до отдельных байтов.

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

Как это проверить самому

Не нужно верить на слово — можно измерить прямо сейчас, без единого списания с баланса. Эндпоинт POST /v1/messages/count_tokens считает токены бесплатно, без похода к модели:

bash
curl https://api.zukko.pro/v1/messages/count_tokens \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "messages": [{"role": "user", "content": "Explain how database indexing works"}]
  }'
bash
curl https://api.zukko.pro/v1/messages/count_tokens \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "messages": [{"role": "user", "content": "Объясни, как работает индексация в базах данных"}]
  }'

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

Почему это не мелочь

Раз оплата идёт за токены, а не за символы или слова, одна и та же смысловая единица текста на русском в среднем обходится дороже. Это особенно заметно на:

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

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

Стриминге и обрывах ответа. Если ответ модели обрывается на середине из-за max_tokens, для русского текста это происходит раньше по объёму «смысла», чем ожидалось бы по аналогии с английским — стоит закладывать max_tokens с запасом именно для русскоязычных ответов.

Промптах с инструментами для агентов. Если системный промпт и описания инструментов написаны по-русски, а не по-английски, тот же самый набор инструкций займёт больше токенов контекста — на длинных агентных цепочках это может ощутимо приблизить разговор к границе контекста (1,000,000 токенов у Claude и GPT, 128K у GLM) раньше, чем при английской формулировке того же самого смысла.

Разные модели — разные токенизаторы

У моделей Claude, GPT-линейки и GLM — разные токенизаторы, обученные на разных пропорциях языков в исходных данных. Поэтому нет единого универсального коэффициента «русский текст всегда в X раз дороже английского» — соотношение отличается от модели к модели и от текста к тексту (короткие бытовые фразы и специализированный технический текст с терминами токенизируются по-разному). Единственный надёжный способ узнать точное число для вашего конкретного текста и вашей конкретной модели — прогнать его через count_tokens перед тем, как считать бюджет на большую партию запросов.

Что с этим делать на практике

Если вы считаете стоимость проекта заранее (например, обработка тысяч обращений пользователей на русском одной из моделей каталога), не берите оценку токенов «на глаз» по количеству слов или символов — прогоните репрезентативную выборку реальных текстов через count_tokens для нужной модели и постройте оценку от фактических цифр. Это бесплатно, не требует похода к модели и займёт меньше времени, чем потом разбираться, почему бюджет разошёлся с прогнозом в полтора раза.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.

Почему русский текст занимает больше токенов, чем английский · Zukko