Токенизация
Нейросети, и LLM в том числе, — это сплошная арифметика над выученными числами, поэтому сначала текст нужно превратить в числа. Токенизатор режет текст на кусочки и выдаёт каждому номер (ID) из фиксированного словаря. Букв модель не видит. Токенизатор GPT-4o, например, режет Hello world! на Hello, ·world и ! (· обозначает пробел), и модель получает только их номера — список [13225, 2375, 0].
Где резать?
Очевидных вариантов три. Отдельные символы дают крошечный словарь, но предложение превращается в длинную цепочку кусочков, а каждый лишний токен — это лишняя работа для модели и лишнее место в контекстном окне. Целые слова дают короткие последовательности, но тогда в словаре должны быть все слова, формы, имена и опечатки, какие только могут встретиться. LLM используют компромисс между этими крайностями — подслова.
Компромисс, на котором работают все современные LLM: частые слова целиком, редкие — из многоразовых кусочков. Так режет токенизатор GPT-4o; русский текст он дробит мельче английского.
Подсловные токены дают словарь разумного размера (от 50 000 до 200 000 записей): частые слова вроде ·the или ·привет — это один токен, а редкие собираются из частей. «Неизвестных» слов не бывает: в худшем случае слово рассыпается на отдельные байты.
Под токенами — байты
Компьютеры хранят текст в виде байтов в кодировке UTF-8. Латинская буква занимает один байт, кириллическая — два, китайский иероглиф — три, эмодзи — четыре. Это удобная отправная точка: любой текст на любом языке — это последовательность всего из 256 возможных значений байта.
D0BAD0BED1822063617420F09F9088- 1 байт: ASCII (латиница, цифры)
- 2 байта: é, кириллица, греческий, арабский…
- 3 байта: китайский, японский, хинди…
- 4 байта: эмодзи и редкие символы
Этот байтовый приём появился в GPT-2, и с тех пор его использует почти каждый токенизатор LLM (токенизаторы SentencePiece, как в первых Llama, достигают того же «откатом к байтам» — byte fallback). Цена в том, что токен не всегда равен целому символу: GPT-4o тратит на четырёхбайтовый эмодзи 🐈 два токена, и ни одна из половинок сама по себе символом не является.
Byte-pair encoding
Большинство токенизаторов LLM обучаются алгоритмом byte-pair encoding (BPE) — «кодированием пар байтов». Он умещается в один абзац:
- Начинаем со словаря из отдельных символов (настоящие токенизаторы — из 256 возможных байтов).
- Предварительно режем текст простым правилом (слова, числа, знаки препинания, пробел приклеивается к следующему слову), чтобы слияния никогда не пересекали эти границы.
- Считаем все пары соседних токенов в большом обучающем тексте.
- Самую частую пару сливаем в новый токен и добавляем его в словарь.
- Повторяем, пока словарь не вырастет до нужного размера.
Посмотрите, как это работает на игрушечном корпусе — крошечном наборе обучающих текстов. Корпус здесь английский — так проще увидеть, как из повторяющихся кусочков вырастают est, ·low и ·wid.
- ·low×4
- ·lower×2
- ·newest×4
- ·wider×2
- ·widest×3
- ·lowest×1
- e + s8
- s + t8
- l + o7
- o + w7
- w + e7
- · + l7
Начинаем с отдельных символов. «·» обозначает пробел перед словом. Длина корпуса — 96 токенов.
Чтобы токенизировать новый текст, токенизатор повторяет слияния в том порядке, в каком их выучил. Поэтому слово slowest, которого не было в обучении, всё равно режется на осмысленные части: ·, s, low, est. Пробел и s остались порознь, потому что в игрушечном корпусе нет ни одного слова на s. Токенизатор GPT-4o, обученный на несравнимо большем тексте, знает ·slow как один токен и режет это слово всего на ·slow и est.
Настоящий токенизатор
Вот настоящий токенизатор GPT-4o (o200k_base, около 200 000 токенов), работающий прямо в вашем браузере. Попробуйте примеры или вставьте свой текст.
Не все языки платят одинаково
Слияния токенизатора выучиваются на его обучающем тексте, а он в основном английский. Поэтому английские слова получают длинные токены-слова, а другие языки режутся мельче. Модели тарифицируются, ограничиваются и замедляются в пересчёте на токены, так что одно и то же сообщение на разных языках стоит по-разному.
Скачок от GPT-3 к GPT-4o впечатляет: русское предложение сжимается с 81 токена до 27, а предложение на хинди — со 125 до 33. У большого словаря есть и цена: каждому токену нужна своя строка выученных чисел в таблице эмбеддингов (глава 3). Но для многоязычного текста это окупается многократно. Для русскоязычного пользователя это вполне практичный вопрос: тот же запрос на русском обходится дороже и быстрее съедает контекстное окно.
Почему токенизация объясняет странности
Несколько знаменитых причуд LLM — это артефакты токенизатора, а не провалы в рассуждениях:
- Орфография и подсчёт букв. Слово
strawberryприходит в модель одним–тремя кусками, а не десятью буквами:·strawberryв середине предложения иstrawberryв начале текста (токенизатор GPT-4o). Чтобы сосчитать буквыr, модели нужно помнить, что лежит внутри каждого куска. С русскими словами то же самое:приветв начале текста — этопр+ивет. - Арифметика. Токенизаторы GPT-4 и GPT-4o режут числа на куски до трёх цифр, считая слева. В
1234567 + 89модель видит1234567и89: единицы, которые нужно сложить, 7 и 9, стоят в кусках разной длины, и разряды при сложении не выстраиваются в столбик. - Языки. Языкам, которых мало в обучающих данных токенизатора, нужно больше токенов на слово, поэтому они обрабатываются медленнее и дороже.
- Пробелы в начале.
·котикот— разные токены. Пробел принадлежит слову, которое идёт после него.
Исследователи регулярно пробуют. Байтовые модели читают сырые байты UTF-8 напрямую, без словаря, — ценой последовательностей примерно вчетверо длиннее. Новые архитектуры, например Byte Latent Transformer от Meta, на лету объединяют байты в фрагменты переменной длины и тратят больше вычислений (арифметической работы) там, где текст труднее предсказать. По состоянию на 2026 год массовые LLM всё ещё используют токенизаторы в духе BPE.
Токенизаторы резервируют несколько ID, которые никогда не встречаются в обычном тексте, — например <|endoftext|> или маркеры чата вроде <|im_start|>. Чат-модель видит беседу как один длинный поток токенов, в котором реплики разделены такими маркерами.
Итоги
- Токенизатор переводит текст в список целых чисел и обратно.
- BPE строит словарь, раз за разом сливая самую частую пару токенов.
- Он работает с байтами UTF-8, поэтому закодировать можно любой текст, даже незнакомый.
- Современные словари содержат 100–200 тысяч токенов; один токен — это около 4 символов английского текста и меньше для большинства других языков.
- Многие странности — неверный подсчёт букв, неуклюжая арифметика, более дорогой неанглийский текст — следуют из того, как разрезан текст, а не из рассуждений модели.
Дальше эти целочисленные ID превращаются в то, с чем сеть действительно умеет считать, — в векторы.