Как модель разбивает русский текст на токены

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

Что такое токен и почему модель не видит буквы

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

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

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

Как 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 токенов, плюс системная подсказка и ответ. При лимите в несколько тысяч токенов такой запас уже стоит проверять заранее, а не после ошибки.

Приёмы сокращения без потери смысла:

  • Убирайте повторы и вводные обороты, оставляйте факты и действия.
  • Заменяйте длинные редкие формы на частые, если смысл сохраняется.
  • Делите документ на части и обрабатывайте их по очереди.
  • Сравнивайте русский и английский вариант промпта, когда лимит критичен.

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

Частые вопросы

Почему одна и та же фраза на русском занимает больше токенов, чем на английском?

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

Можно ли пересчитать слова в токены по коэффициенту?

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

Что будет, если текст не помещается в контекст?

Модель обрежет или отклонит запрос. Поэтому заранее сравните сумму токенов текста, системной подсказки и ожидаемого ответа с лимитом контекста. Если запас мал, сократите текст или разбейте его на части.

Влияет ли токенизация на качество ответа?

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