Русский текст почти всегда даёт больше токенов, чем тот же смысл по-английски, потому что кириллица хуже представлена в словарях токенизаторов. Возьмите ровно тот текст, который собираетесь отправить, прогоните его через токенизатор своей модели и сравните полученное число с лимитом контекста. Не пересчитывайте слова в токены «на глаз»: для русского коэффициент обычно около двух токенов на слово, но у каждой модели он свой.
Что такое токен и почему модель не видит буквы
Токен — это кусок текста, который модель обрабатывает как одну единицу. Это не буква и не обязательно слово: токеном может быть часть слова, знак препинания, пробел вместе с началом следующего слова. Токенизатор — программа перед моделью, которая разбивает строку на известные ей фрагменты и заменяет каждый номером из своего словаря.
Дальше модель работает не с текстом, а с номерами. Каждый номер превращается в вектор, и уже по этим векторам модель предсказывает следующий токен. Поэтому вопрос «сколько токенов в тексте» — это вопрос о том, на сколько знакомых кусков разбила строку конкретная программа, а не о длине строки в символах.
Словарь токенизатора — список всех фрагментов, которые он умеет распознавать целиком. Чем чаще фрагмент встречался в обучающих данных, тем вероятнее он попадёт в словарь и станет одним токеном. Английские слова в словарях многих моделей представлены гуще, чем русские, и это главная причина разницы в расходе.
Как BPE-токенизатор режет русское слово
Большинство современных моделей используют подсловную токенизацию, чаще всего Byte-Pair Encoding, BPE — алгоритм, который начинает с мелких единиц и постепенно склеивает самые частые пары. Сначала текст разбивается на байты или символы, затем алгоритм многократно объединяет пары, которые часто стоят рядом в обучающем корпусе. Так появляются куски длиннее одного символа.
Разберём слово «токенизация». Если целиком в словаре его нет, токенизатор ищет самый длинный известный кусок с начала слова. Допустим, это «токен». Остаток «изация» тоже делится: «иза» может быть известна, «ция» тоже. В итоге слово распадается на три-четыре токена вместо одного.
Английское «tokenization» при англоцентричном словаре часто укладывается в один-два токена, потому что встречалось в обучающих данных гораздо чаще. Русские приставки, суффиксы и окончания создают много форм одного слова, и каждая редкая форма собирается из мелких кусков. Частая форма вроде «токен» обойдётся дешевле, чем редкая «токенизированный».
Сколько токенов в русской фразе: пример
Возьмём короткую фразу «Привет, как дела?». У моделей с англоцентричным словарём она обычно занимает около 6–8 токенов: запятая и вопросительный знак часто идут отдельными токенами, а «Привет» может делиться на части. Английское «Hi, how are you?» у тех же моделей нередко укладывается примерно в 5 токенов.
На короткой фразе разница почти незаметна. На длинном документе она накапливается: русская инструкция на 1000 слов при коэффициенте около 2 токенов на слово даст порядка 2000 токенов, а не 1000. Точное число зависит от модели и версии токенизатора, поэтому его считают, а не берут из общей таблицы.
Вот как примерно выглядит сравнение по смыслу одинаковых фраз:
| Фраза | Язык | Типичное число токенов |
|---|---|---|
| Привет, как дела? | русский | около 6–8 |
| Hi, how are you? | английский | около 5 |
| Инструкция на 1000 слов | русский | порядка 2000 |
| Инструкция на 1000 слов | английский | примерно 1300–1500 |
Цифры в таблице — ориентир для оценки, а не норматив. Проверяйте их токенизатором той модели, в которую отправляете текст: у другой модели или другой версии словаря результат будет иным.
Почему кириллица дороже латиницы
Причина первая — дисбаланс обучающих данных. Английского текста в корпусах обычно больше, поэтому английские слова и их части чаще попадают в словарь целиком. Русские слова реже встречаются в готовом виде и чаще собираются из подслов.
Причина вторая — байтовое кодирование. Многие токенизаторы работают на уровне байтов UTF-8. Латинская буква занимает один байт, кириллическая — два. Если готового куска для русского слова в словаре нет, оно собирается из байтовых фрагментов, и каждый фрагмент становится отдельным токеном. Отсюда типичное наблюдение: русский текст даёт примерно в 1,5–2 раза больше токенов, чем тот же смысл по-английски.
Что это меняет на практике:
- Лимит контекста. Длинный русский документ может не поместиться туда, где английский той же длины помещается.
- Цена. Тариф за токены означает, что русский запрос обходится дороже при том же объёме смысла.
- Скорость. Больше токенов на входе и выходе — дольше генерация.
Качество ответа тоже может зависеть от разбиения: если модель редко видела русские куски в обучающих данных, ей труднее предсказывать следующие. Но это уже свойство конкретной модели, а не языка вообще.
Словари, байтовый fallback и мультиязычность
Токенизаторы бывают трёх типов. Словесные делят текст по словам, но плохо справляются с опечатками и редкими формами. Символьные работают по символам, дают много токенов и длинные последовательности. Подсловные, к которым относится BPE и SentencePiece, — компромисс: частые слова идут целиком, редкие делятся на знакомые части.
Байтовый fallback — запасной механизм, который спасает редкие символы. Если токенизатор встретил символ, которого нет в словаре, он не ломается, а кодирует его на уровне байтов. Поэтому русский текст, эмодзи или редкий знак всё равно обработаются, просто займут больше токенов.
У разных моделей разные словари и правила разбиения. Один и тот же русский абзац у модели A и модели B даст разное число токенов. Поэтому «среднее по больнице» для расчёта лимита контекста не годится: считайте токенизатором именно той модели, в которую отправляете текст. Для OpenAI это библиотека tiktoken, для моделей на Hugging Face — токенизатор из библиотеки transformers, привязанный к конкретной модели.
Как посчитать токены своего текста
Порядок простой и проверяемый. Возьмите ровно тот текст, который отправите, без правок «на глаз». Прогоните его через токенизатор выбранной модели и запишите число. Прибавьте запас на системную подсказку и ожидаемый ответ — их тоже считайте токенизатором. Сравните сумму с лимитом контекста модели.
Если сумма с запасом меньше лимита — текст помещается. Если близко к лимиту или превышает — сократите текст или разбейте на части. Например, инструкция на 1000 русских слов даст около 2000 токенов, плюс системная подсказка и ответ. При лимите в несколько тысяч токенов такой запас уже стоит проверять заранее, а не после ошибки.
Приёмы сокращения без потери смысла:
- Убирайте повторы и вводные обороты, оставляйте факты и действия.
- Заменяйте длинные редкие формы на частые, если смысл сохраняется.
- Делите документ на части и обрабатывайте их по очереди.
- Сравнивайте русский и английский вариант промпта, когда лимит критичен.
Когда стоит выбирать английский промпт: если вы упираетесь в лимит контекста или цену, а модель одинаково хорошо понимает оба языка. Когда русский важнее: если в тексте есть точные формулировки, названия, юридические или технические термины, которые при переводе теряют смысл. Решение зависит от задачи, а не от языка как такового.
Частые вопросы
Почему одна и та же фраза на русском занимает больше токенов, чем на английском?
Потому что русские слова хуже представлены в словарях токенизаторов. Они чаще делятся на подслова и байтовые фрагменты, а английские слова чаще идут целиком. Точное соотношение зависит от модели и текста.
Можно ли пересчитать слова в токены по коэффициенту?
Можно только для грубой оценки. Для русского текста ориентир — около двух токенов на слово, но у каждой модели свой словарь. Для расчёта лимита считайте токенизатором именно своей модели.
Что будет, если текст не помещается в контекст?
Модель обрежет или отклонит запрос. Поэтому заранее сравните сумму токенов текста, системной подсказки и ожидаемого ответа с лимитом контекста. Если запас мал, сократите текст или разбейте его на части.
Влияет ли токенизация на качество ответа?
Может влиять: если модель редко видела русские куски в обучающих данных, ей труднее предсказывать следующие. Но это свойство конкретной модели, а не языка вообще. Проверяйте на своих задачах.