• Русский
  • Токенизация

    Нейросети, и LLM в том числе, — это сплошная арифметика над выученными числами, поэтому сначала текст нужно превратить в числа. Токенизатор режет текст на кусочки и выдаёт каждому номер (ID) из фиксированного словаря. Букв модель не видит. Токенизатор GPT-4o, например, режет Hello world! на Hello, ·world и ! (· обозначает пробел), и модель получает только их номера — список [13225, 2375, 0].

    Где резать?

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

    Рисунок 2.1 · Три способа разрезать одно предложение
    Токенизаторы·режут·невероятно·длинные·слова
    12токенов

    Компромисс, на котором работают все современные LLM: частые слова целиком, редкие — из многоразовых кусочков. Так режет токенизатор GPT-4o; русский текст он дробит мельче английского.

    Переключайте способы и сравнивайте число кусочков. Подслова — это то, как режет это предложение настоящий токенизатор GPT-4o: частые слова остаются целыми, редкие собираются из частей.

    Подсловные токены дают словарь разумного размера (от 50 000 до 200 000 записей): частые слова вроде ·the или ·привет — это один токен, а редкие собираются из частей. «Неизвестных» слов не бывает: в худшем случае слово рассыпается на отдельные байты.

    Под токенами — байты

    Компьютеры хранят текст в виде байтов в кодировке UTF-8. Латинская буква занимает один байт, кириллическая — два, китайский иероглиф — три, эмодзи — четыре. Это удобная отправная точка: любой текст на любом языке — это последовательность всего из 256 возможных значений байта.

    Рисунок 2.2 · Каждый символ — от одного до четырёх байтов
    кD0BA
    оD0BE
    тD182
    ·20
    c63
    a61
    t74
    ·20
    🐈F09F9088
    9символов15байт UTF-8
    • 1 байт: ASCII (латиница, цифры)
    • 2 байта: é, кириллица, греческий, арабский…
    • 3 байта: китайский, японский, хинди…
    • 4 байта: эмодзи и редкие символы
    Введите что угодно. Каждая плашка — один символ и его байты UTF-8 в шестнадцатеричной записи (по основанию 16, байт — от 00 до FF). Байтовый токенизатор начинает с этих 256 значений, поэтому для незнакомого текста он всегда может откатиться к сырым байтам.

    Этот байтовый приём появился в GPT-2, и с тех пор его использует почти каждый токенизатор LLM (токенизаторы SentencePiece, как в первых Llama, достигают того же «откатом к байтам» — byte fallback). Цена в том, что токен не всегда равен целому символу: GPT-4o тратит на четырёхбайтовый эмодзи 🐈 два токена, и ни одна из половинок сама по себе символом не является.

    Byte-pair encoding

    Большинство токенизаторов LLM обучаются алгоритмом byte-pair encoding (BPE) — «кодированием пар байтов». Он умещается в один абзац:

    1. Начинаем со словаря из отдельных символов (настоящие токенизаторы — из 256 возможных байтов).
    2. Предварительно режем текст простым правилом (слова, числа, знаки препинания, пробел приклеивается к следующему слову), чтобы слияния никогда не пересекали эти границы.
    3. Считаем все пары соседних токенов в большом обучающем тексте.
    4. Самую частую пару сливаем в новый токен и добавляем его в словарь.
    5. Повторяем, пока словарь не вырастет до нужного размера.

    Посмотрите, как это работает на игрушечном корпусе — крошечном наборе обучающих текстов. Корпус здесь английский — так проще увидеть, как из повторяющихся кусочков вырастают est, ·low и ·wid.

    Рисунок 2.3 · Обучение BPE-токенизатора
    Корпус (слово × частота)
    • ·low×4
    • ·lower×2
    • ·newest×4
    • ·wider×2
    • ·widest×3
    • ·lowest×1
    Самые частые пары
    1. e + s8
    2. s + t8
    3. l + o7
    4. o + w7
    5. w + e7
    6. · + l7
    Словарь · 11
    deilnorstw·
    ·slowest
    1/15

    Начинаем с отдельных символов. «·» обозначает пробел перед словом. Длина корпуса — 96 токенов.

    На каждом шаге сливается самая частая соседняя пара. Корпус становится короче в токенах, а словарь растёт. Введите новое слово внизу — и увидите, как его разрежут уже выученные слияния.

    Чтобы токенизировать новый текст, токенизатор повторяет слияния в том порядке, в каком их выучил. Поэтому слово slowest, которого не было в обучении, всё равно режется на осмысленные части: ·, s, low, est. Пробел и s остались порознь, потому что в игрушечном корпусе нет ни одного слова на s. Токенизатор GPT-4o, обученный на несравнимо большем тексте, знает ·slow как один токен и режет это слово всего на ·slow и est.

    Настоящий токенизатор

    Вот настоящий токенизатор GPT-4o (o200k_base, около 200 000 токенов), работающий прямо в вашем браузере. Попробуйте примеры или вставьте свой текст.

    Рисунок 2.4 · Настоящие токенизаторы GPT
    Каждая цветная плашка — один токен; наведите курсор, чтобы увидеть его ID, или переключитесь на «ID токенов» — именно это получает модель. Переключайте кодировки: новые словари больше, поэтому тому же тексту нужно меньше токенов — особенно коду и неанглийским языкам. Обычный английский текст выходит примерно по 4–5 символов на токен, русский — заметно меньше.

    Не все языки платят одинаково

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

    Рисунок 2.5 · Одно предложение, пять языков, три токенизатора
    Число токенов в настоящих словарях GPT-3, GPT-4 и GPT-4o. Каждый новый словарь больше и многоязычнее, поэтому разрыв сокращается, но не исчезает: в GPT-4o это русское предложение всё ещё требует примерно в 1,5 раза больше токенов, чем английское.

    Скачок от GPT-3 к GPT-4o впечатляет: русское предложение сжимается с 81 токена до 27, а предложение на хинди — со 125 до 33. У большого словаря есть и цена: каждому токену нужна своя строка выученных чисел в таблице эмбеддингов (глава 3). Но для многоязычного текста это окупается многократно. Для русскоязычного пользователя это вполне практичный вопрос: тот же запрос на русском обходится дороже и быстрее съедает контекстное окно.

    Почему токенизация объясняет странности

    Несколько знаменитых причуд LLM — это артефакты токенизатора, а не провалы в рассуждениях:

    • Орфография и подсчёт букв. Слово strawberry приходит в модель одним–тремя кусками, а не десятью буквами: ·strawberry в середине предложения и st raw berry в начале текста (токенизатор GPT-4o). Чтобы сосчитать буквы r, модели нужно помнить, что лежит внутри каждого куска. С русскими словами то же самое: привет в начале текста — это пр + ивет.
    • Арифметика. Токенизаторы GPT-4 и GPT-4o режут числа на куски до трёх цифр, считая слева. В 1234567 + 89 модель видит 123 456 7 и 89: единицы, которые нужно сложить, 7 и 9, стоят в кусках разной длины, и разряды при сложении не выстраиваются в столбик.
    • Языки. Языкам, которых мало в обучающих данных токенизатора, нужно больше токенов на слово, поэтому они обрабатываются медленнее и дороже.
    • Пробелы в начале. ·кот и кот — разные токены. Пробел принадлежит слову, которое идёт после него.
    Можно ли обойтись без токенизации?

    Исследователи регулярно пробуют. Байтовые модели читают сырые байты UTF-8 напрямую, без словаря, — ценой последовательностей примерно вчетверо длиннее. Новые архитектуры, например Byte Latent Transformer от Meta, на лету объединяют байты в фрагменты переменной длины и тратят больше вычислений (арифметической работы) там, где текст труднее предсказать. По состоянию на 2026 год массовые LLM всё ещё используют токенизаторы в духе BPE.

    Специальные токены

    Токенизаторы резервируют несколько ID, которые никогда не встречаются в обычном тексте, — например <|endoftext|> или маркеры чата вроде <|im_start|>. Чат-модель видит беседу как один длинный поток токенов, в котором реплики разделены такими маркерами.

    Итоги

    • Токенизатор переводит текст в список целых чисел и обратно.
    • BPE строит словарь, раз за разом сливая самую частую пару токенов.
    • Он работает с байтами UTF-8, поэтому закодировать можно любой текст, даже незнакомый.
    • Современные словари содержат 100–200 тысяч токенов; один токен — это около 4 символов английского текста и меньше для большинства других языков.
    • Многие странности — неверный подсчёт букв, неуклюжая арифметика, более дорогой неанглийский текст — следуют из того, как разрезан текст, а не из рассуждений модели.

    Дальше эти целочисленные ID превращаются в то, с чем сеть действительно умеет считать, — в векторы.