Токен (LLM)
Токен (LLM)
Токен — минимальная единица, на которую языковая модель делит текст перед обработкой. Это не буква, не слово и не слог, а кусок из одного-нескольких символов, полученный по заранее обученному словарю.
История
Слово «token» в компьютерной лингвистике появилось задолго до нейросетей —
ещё в 1950-х, когда статистики считали частоты слов и n-грамм. Тогда токен
означал «одно вхождение слова в тексте» (в противовес type — уникальному
слову). Различие type/token — базовое для корпусной лингвистики,
приписывают ему статью Уиллиса Джона Гейджа середины XX века.
Ключевой момент, породивший современный смысл слова «токен» в LLM, —
1994 год. Филипп Гейдж (Philip Gage) опубликовал в журнале
«C Users Journal» алгоритм под названием Byte Pair Encoding (BPE).
Гейдж придумал его как метод сжатия данных: находишь самую частую пару
байтов, заменяешь на новый символ, повторяешь. Двадцать лет он лежал в
области сжатия и никого особо не интересовал.
В 2015 году исследователи из Эдинбургского университета — Рико Сеннрих,
Барри Хэддоу и Александра Бёрч — в статье «Neural Machine Translation of
Rare Words with Subword Units» переизобрели BPE как способ бороться с
«редкими словами» в машинном переводе. Проблема была такая: словарь
модели фиксирован, а языки бесконечны. Если модель видит «Konferenzverband»
впервые, она не знает, что делать. Идея Сеннрих — заранее разбить всё на
подслова, чтобы «Konferenz» и «verband» встречались часто по отдельности
и модель могла их сложить.
С 2018 года BPE и её вариации стали стандартом. GPT-2 (OpenAI, 2019)
использовал BPE на уровне байтов (byte-level BPE) — это позволило одному
токенизатору работать с любым языком и эмодзи. Claude, Llama, Mistral,
все крупные модели сегодня используют варианты BPE или близкие подходы
(WordPiece, SentencePiece, Unigram).
В 2022 году OpenAI выпустил в открытый доступ библиотеку tiktoken —
эталонную реализацию своего токенизатора. С этого момента разработчики
получили точный инструмент, чтобы посчитать заранее, во что обойдётся
запрос.
Anthropic не публикует свой токенизатор целиком, но предоставляет через
API счётчик токенов (count_tokens). Устройство близко к GPT-4-подобному,
но словарь свой.
Что это такое
Языковая модель не работает с текстом напрямую. Внутри неё всё —
матричные операции над числами. Значит, перед тем как модель что-то
поймёт, текст надо превратить в последовательность чисел. Токенизатор —
это программа-переводчик между текстом и числами.
Токен — это элемент словаря токенизатора. Словарь фиксирован при
обучении: обычно 50 000–200 000 токенов. У каждого токена есть свой
целочисленный id. Токенизатор делает две операции:
- Encode: текст → массив id.
- Decode: массив id → текст.
Разбиение — не по буквам, не по словам, а по «часто встречающимся
кускам». Английское «hello» может стать одним токеном (id=15496 в
tiktoken cl100k_base). А слово «prestidigitation» — уже четырьмя, потому
что редкое. Русское «привет» скорее всего разобьётся на 3-4 токена, а
«необыкновенный» — на 5-7.
Грубая эмпирика для английского: 1 токен ≈ 4 символа ≈ 0,75 слова.
Для русского — примерно вдвое хуже: 1 токен ≈ 2 символа ≈ 0,3–0,5
слова. Причина простая: корпус, на котором обучали большинство
токенизаторов, преимущественно английский. Русские подслова редки —
значит, редкие идут в словарь как более мелкие куски.
Ключевое отличие от похожих вещей:
- vs Слово: слово — единица человеческого языка. Токен — единица
словаря токенизатора. Между ними нет строгой связи. - vs Символ: символ — минимальная единица текста (Unicode
codepoint). Токен обычно длиннее, но не всегда: точка «.» — один
символ и один токен. - vs Байт: байт — минимальная единица хранения. В byte-level BPE
токены строятся из байтов, но токен обычно объединяет несколько байтов
в один id. - vs JWT-токен: другая история. JWT — это токен доступа в
безопасности (уже разбирали в отдельной статье). Общее только слово.
Аналогии из жизни
Купюры в кассе. Кассир не принимает произвольную сумму — только
дискретные номиналы: 100, 500, 1000, 5000. Хочешь заплатить 1700 —
собираешь из купюр: 1000 + 500 + 100 + 100. Токены похожи: модель
видит текст только как комбинацию «купюр» из своего словаря.
- Где ломается: купюры одинаковой длины (одна бумажка), а токены разной.
«Hello» — одна купюра, «привет» — четыре разного номинала. И купюры
не вложены (тысяча не «состоит из» сотни), а токены вложены: «run»,
«running», «runs», «runner» — четыре разных id, но у человека они
из одного корня. Модель об этом заранее не знает.
Слоги. Кажется, что токен — это слог. «При-вет» на два слога, значит
на два токена? Но токенизатор про фонетику не знает, он про статистику.
«Привет» скорее всего будет «пр» + «ив» + «ет» или что-то похожее —
разбиение не совпадает со слогами.
- Где ломается: слоги — свойство языка, задаются правилами
произношения. Токены — свойство корпуса и алгоритма BPE, задаются
частотами. Одно и то же слово в разных языках разбивается по-разному,
даже если пишется одинаково.
Морфемы (корень + суффикс + окончание). Кажется удобной аналогией:
«running» = «run» + «ning» — почти корень плюс окончание. Иногда
токенизатор действительно так режет. Но чаще — нет.
- Где ломается: морфология требует лингвистического анализа.
Токенизатор смотрит только на частоты байтов. Он может разрезать
«неопределённо» на «не» + «определ» + «ённо», а может на «неопре» +
«делё» + «нно» — как попало, лишь бы куски были из словаря.
Как это работает
Возьмём BPE — самый распространённый алгоритм.
Шаг 1. Обучение токенизатора (один раз, до тренировки модели).
Собирают огромный корпус текста — терабайты. Разбивают каждое слово на
отдельные символы. Считают частоту всех пар соседних символов. Находят
самую частую пару — например, «t» + «h» встречается 500 миллионов раз.
Объединяют её в новый символ «th» и записывают в словарь. Повторяют:
теперь ищут самую частую пару уже с учётом «th». Через 50 000 –
200 000 итераций получают словарь.
Псевдокод:
vocab = набор всех уникальных символов
while len(vocab) < 100000:
pairs = count_pairs(корпус) # частоты пар соседних символов
best_pair = argmax(pairs)
vocab.add(merge(best_pair))
corpus = apply_merge(корпус, best_pair)
Итог — файл с двумя вещами: (1) сам словарь (id → строка),
(2) правила слияния в порядке применения.
Шаг 2. Encode при работе модели.
Пришёл текст «Привет, мир». Токенизатор:
- Разбивает на байты (в byte-level BPE) или Unicode-символы.
- Применяет правила слияния из обученного файла по порядку.
- На выходе — массив id:
[136, 8817, 47420, 11, 3907](числа
выдуманные, для примера).
Шаг 3. Модель.
Каждый id превращается в embedding — вектор из 4096-16384 чисел
(зависит от модели). Дальше эти вектора идут через слои трансформера
(attention, feed-forward), и модель предсказывает следующий токен —
то есть распределение вероятностей по всему словарю. Выбирает один id
(или семплирует).
Шаг 4. Decode.
Выбранный id превращается обратно в строку и приклеивается к ответу.
Потом всё повторяется: новый вход = старый вход + новый токен.
Важная деталь: пробелы. В большинстве токенизаторов пробел не
отдельный токен, а часть следующего слова. Токен « hello» (с ведущим
пробелом) и токен «hello» (без пробела) — это разные id. Поэтому «Hello
world» и «Hello world» (с двумя пробелами) кодируются по-разному, и
модель по-разному их поймёт.
Специальные токены. В словарь входят не только куски текста, но и
служебные метки: <|start|>, <|end|>, <|user|>, <|assistant|>.
Через них модель понимает, где чья реплика в диалоге. Их нельзя ввести
как обычный текст — токенизатор их экранирует.
ASCII-схема полного цикла:
"Привет, мир"
│
▼
[Tokenizer.encode]
│
▼
[136, 8817, 47420, 11, 3907] ← массив id токенов
│
▼
[Embedding lookup]
│
▼
матрица векторов [5, 4096]
│
▼
[Transformer 96 слоёв]
│
▼
вероятности по словарю [100000]
│
▼
argmax или sampling → id=7891
│
▼
[Tokenizer.decode]
│
▼
" Здравствуй"
Где встречается в обычной жизни
- «Лимит 200k токенов» в ChatGPT/Claude. Это про контекстное окно —
сколько текста модель может держать в голове одновременно. 200k
токенов ≈ 500 страниц английского текста или ≈ 250 страниц русского. - Оплата AI-подписки съедает лимит быстрее, чем ты писал по-русски.
Причина не в жадности сервиса, а в токенизации: тот же смысл на
русском занимает больше токенов. - Ошибка «context length exceeded». Ты закинул в модель длинную
переписку, а она ответила отказом. Значит, твой ввод + история
превысили лимит в токенах, не в символах. - Autocomplete в VS Code / Cursor. Copilot предсказывает не букву,
а следующий токен. Поэтому подсказка может «сама дописать» слово
целиком, а иногда обрубается на середине. - Ответ модели обрывается на середине предложения. У ответа есть
параметрmax_tokens(обычно 4096 или 8192). Достиг лимита — обрыв,
даже если модель хотела сказать больше.
Где встречается в IT и бизнесе
- Бюджетирование AI-продукта. Считать надо не запросы и не
пользователей, а токены. Тариф API у OpenAI и Anthropic указан как
«$3 за 1 миллион входных токенов, $15 за 1 миллион выходных». Если
один запрос — 5000 входных + 500 выходных, легко вычислить стоимость
тысячи запросов в месяц. - RAG-системы (retrieval-augmented generation). Документы
разбиваются на «чанки» (chunks) — обычно 500–1000 токенов каждый.
Токенизатор используется для точной резки, чтобы не превысить лимит
контекста при склейке. - Fine-tuning модели. Стоимость обучения тоже в токенах: сколько
токенов в датасете × сколько проходов × коэффициент. Один датасет
из тысячи диалогов может стоить от $100 до $10 000. - Prompt caching (кэш промптов). Anthropic и OpenAI умеют
запоминать префикс запроса и не пересчитывать его. Разбиение на
кэш-блоки идёт по токенам, а не по символам. Значит, если два запроса
начинаются одинаково с точностью до токена — кэш сработает.
Одна лишняя буква — кэш промазал. - Мониторинг стоимости в проде. У каждого запроса к LLM в логах
сохраняютinput_tokens,output_tokens,cache_read_tokens,
cache_write_tokens. Из этих цифр строится дашборд «сколько мы
тратим на AI в день».
Кто пользуется
- OpenAI: собственный BPE-токенизатор в библиотеке
tiktoken.
Словарьcl100k_base(100 256 токенов) для GPT-3.5/GPT-4,
o200k_base(200 019 токенов) для GPT-4o и новее. - Anthropic Claude: свой токенизатор, ~100k словарь. Публично
недоступен, но есть API-эндпоинтcount_tokens. - Google Gemini: SentencePiece-based, размер словаря близок к 256k.
- Meta Llama: SentencePiece (Llama 1/2), tiktoken-подобный (Llama 3),
словарь 32k → 128k. - Mistral, Cohere, DeepSeek: тоже BPE-варианты, свои словари.
Масштаб: OpenAI обрабатывает, по разным оценкам, около 100 миллиардов
токенов в сутки на своих API. Точной цифры компания не раскрывает —
искать в отчётах SemiAnalysis и The Information.
Альтернативы и конкуренты
- Character-level токенизация. Каждый символ — свой токен.
- Плюсы: универсально, ничего не «выходит из словаря», нет проблем с
редкими языками. - Минусы: последовательности длинные (в 4-5 раз), модель работает
медленнее, а «понимать» смысл сложнее. - Word-level токенизация (было до 2015).
- Плюсы: интуитивно, совпадает с человеческим восприятием.
- Минусы: словарь бесконечен, редкие слова не влезают, для морфологически
богатых языков (русский, финский) катастрофа. - WordPiece (Google, BERT).
- Плюсы: близок к BPE, статистически обоснован (не просто «самая
частая пара», а «максимум правдоподобия»). - Минусы: чуть сложнее реализация, разница с BPE на практике невелика.
- SentencePiece (Google, T5, Llama).
- Плюсы: не требует пре-токенизации (не делит текст на слова заранее),
поэтому одинаково хорошо работает для языков без пробелов —
китайского, японского, тайского. - Минусы: тяжелее интегрируется в старые пайплайны.
- Unigram Language Model (Google, тоже SentencePiece).
- Плюсы: вероятностный подход, при кодировании можно выбирать «лучший»
разбор из нескольких. - Минусы: сложнее, чем BPE, выигрыш в качестве маргинальный.
Когда НЕ стоит использовать
- Задачи character-level (побуквенный анализ). Если модель должна
находить опечатки, работать с транслитом, обрабатывать имена собственные
с искажениями — токенизация мешает. «Пpивет» с латинской «p» токенизатор
разберёт совсем иначе, чем «Привет». - Работа с редкими языками. Если корпус для обучения токенизатора
почти не содержал, скажем, тайского или тамильского, то каждый символ
станет отдельным токеном. Стоимость обработки таких текстов вырастает
в 4-8 раз. - Задачи с точной длиной. Если пишешь SEO-текст с ограничением
«160 символов» — токены тебе не помогут. Токенизация про смысл, а не
про символы.
Связанные понятия
- Embedding — числовой вектор фиксированной размерности, в который
превращается id токена перед подачей в модель. - Context window — максимальное число токенов, которое модель
может обработать за один раз (в 2026 году: 128k–2M). - BPE (Byte Pair Encoding) — доминирующий алгоритм построения
словаря токенов. - Vocabulary size — размер словаря токенов (обычно 32k–256k).
- Attention — механизм, через который каждый токен «смотрит» на
все остальные в контексте. - Perplexity — метрика качества языковой модели, измеряется в
вероятностях предсказания следующего токена. - Prompt caching — оптимизация, при которой префикс запроса
запоминается и не пересчитывается. - max_tokens — параметр API, ограничивающий длину ответа модели.
Литература и источники
- Sennrich, Haddow, Birch. «Neural Machine Translation of Rare Words
with Subword Units», 2015 (arXiv:1508.07909) — первая статья про BPE
в NLP, читать обязательно. - Andrej Karpathy. «Let's build the GPT Tokenizer» — двухчасовая
лекция на YouTube (2024). Строит токенизатор с нуля, объясняет
каждый шаг. Лучший источник для интуиции. - Hugging Face Course, глава «Tokenizers» — huggingface.co/learn/nlp-course/
chapter6, есть перевод на русский. - OpenAI Tiktoken (github.com/openai/tiktoken) — исходники и примеры.
Есть онлайн-визуализатор на platform.openai.com/tokenizer, где можно
вставить текст и увидеть разбиение. - Wikipedia: «Byte pair encoding» — короткая статья с корректной историей.
- Gage, Philip. «A New Algorithm for Data Compression», C Users Journal,
1994 — оригинальная статья, искать в архивах Dr. Dobb's / C Users
Journal.
Где встретилось у меня
Вчера в логах Claude Code слово «токен» и «token» суммарно всплывали
почти сотню раз — при обсуждении лимитов контекста, стоимости запросов
к API Anthropic, prompt caching. Стало любопытно, что именно измеряется
этими токенами и почему у русского языка они «дороже» английского.
Краткое резюме
- Токен — единица словаря, на которую токенизатор режет текст перед
подачей в модель. Не буква, не слово, чаще ~4 символа для английского
и ~2 для русского. - Стандартный алгоритм построения словаря — BPE (byte pair encoding),
придуман для сжатия в 1994 году, применён к NLP в 2015-м. - Всё, что мы платим за LLM, считается в токенах: контекст, ответ,
дообучение, кэш. - Русский текст = в 1,5-2 раза больше токенов, чем тот же смысл
по-английски. Причина — доминирование английского в обучающих
корпусах. - Ошибка «context length exceeded» и обрыв ответа на середине — это
всегда про токены, не про символы.