Токен и токенизация
| Что такое токен | фрагмент текста из словаря модели — слово, часть слова, символ или байт |
|---|---|
| Основные алгоритмы | BPE, WordPiece, Unigram |
| Библиотеки | tiktoken, SentencePiece, Hugging Face Tokenizers |
| Размер словаря | обычно от 32 тыс. до 256 тыс. токенов |
| Эмпирика для английского | около 4 символов или 0,75 слова на токен |
| Влияние | стоимость, скорость, длина контекста, качество на разных языках |
Токен — минимальная единица текста, с которой работает языковая модель. Обычно это не слово и не буква, а что-то среднее: частое слово целиком, кусок редкого слова, знак препинания или пробел вместе с началом слова. Токенизация — процесс разбиения текста на токены и перевода каждого в числовой идентификатор из фиксированного словаря модели. Модель видит только последовательность чисел и генерирует ответ тоже по одному токену.
В токенах измеряется почти всё, что важно на практике: цена запроса к API, размер контекстного окна, скорость генерации и лимиты.[5]
Зачем делить на части слов
Есть три очевидных варианта разбиения, и у каждого свои проблемы:
| Единица | Плюсы | Минусы |
|---|---|---|
| Слово | короткие последовательности | огромный словарь, неизвестные слова, опечатки, разные формы слова |
| Символ или байт | маленький словарь, любой текст | очень длинные последовательности, медленно и дорого |
| Часть слова (subword) | компромисс: частые слова целиком, редкие — из кусков | разбиение иногда неинтуитивно |
Подсловная токенизация позволяет модели обработать любое слово — даже выдуманное или с опечаткой, — собрав его из известных фрагментов, и при этом держать последовательности короткими.
Алгоритмы
BPE (Byte Pair Encoding) изначально был методом сжатия данных; для нейросетей его адаптировали Рико Зеннрих и коллеги в 2015 году.[1] Обучение начинается со словаря из отдельных символов (в современных вариантах — байтов), затем самая частая пара соседних единиц объединяется в новую, и так тысячи раз, пока словарь не достигнет нужного размера. Байтовый BPE используют модели GPT, Llama и многие другие.
WordPiece (BERT) похож на BPE, но выбирает слияния по вероятностному критерию. Unigram начинает с большого словаря и удаляет наименее полезные токены. Библиотека SentencePiece реализует BPE и Unigram, работая с сырым текстом без предварительного деления на слова, что удобно для языков без пробелов.[2] Обзор алгоритмов — в документации Hugging Face.[4]
Пример
import tiktoken # токенизатор моделей OpenAI; у других моделей свои словари
enc = tiktoken.get_encoding("o200k_base")
for text in ["Hello, world!", "Привет, мир!", "PostgreSQL"]:
ids = enc.encode(text)
print(len(ids), [enc.decode([i]) for i in ids])
Вывод показывает, как текст режется на фрагменты: частые английские слова обычно занимают один токен, а редкие слова и названия делятся на несколько. Точное разбиение зависит от модели: у каждой свой словарь, поэтому один и тот же текст для разных моделей — разное число токенов.[3]
Языки и токены
Словарь строится по обучающим данным, где больше всего английского текста и кода. Поэтому английский токенизируется экономнее всего — в среднем около четырёх символов на токен, — а русский и другие языки на кириллице, а также языки со своими письменностями требуют заметно больше токенов на тот же смысл. Это означает более высокую цену, меньший эффективный контекст и более медленную генерацию для этих языков.[6] Новые модели расширяют словари и добавляют больше многоязычных данных, сокращая разрыв.
Особенности и подводные камни
- Пробелы входят в токены. Токены «мир» и « мир» (с пробелом) — разные, поэтому лишние пробелы и переводы строк меняют разбиение.
- Числа нередко режутся на группы цифр, что исторически затрудняло моделям арифметику.
- Подсчёт букв. Модель не видит отдельных символов внутри токена, поэтому ей трудно сказать, сколько букв «р» в слове, или написать слово задом наперёд.
- Специальные токены отмечают границы сообщений, роли в диалоге, начало и конец текста; их нельзя подделать обычным текстом.
- Код и форматирование. Отступы, повторяющиеся символы и разметка тоже стоят токенов; компактный Markdown обходится дешевле, чем HTML с той же информацией (см. Markdown как формат для LLM).
Практические советы
- Для оценки стоимости и проверки лимитов используйте токенизатор или эндпоинт подсчёта токенов конкретного провайдера, а не правило «слово ≈ токен».[5]
- Убирайте из документов, подаваемых в модель, лишнюю разметку, повторы и служебный текст.
- При нарезке документов для RAG размер фрагментов задавайте в токенах (см. Чанкинг документов).
- Повторяющееся начало запроса выгодно кэшировать — см. Кэширование промптов.
Связь токенов с текстом обратимая: последовательность идентификаторов однозначно декодируется в исходную строку, включая любые символы Unicode — байтовые токенизаторы при необходимости собирают их из отдельных байтов.
См. также
Источники
- R. Sennrich, B. Haddow, A. Birch — Neural Machine Translation of Rare Words with Subword Units (BPE, 2015)
- T. Kudo, J. Richardson — SentencePiece (2018)
- openai/tiktoken — GitHub
- Hugging Face — Summary of the tokenizers
- Anthropic — Token counting
- A. Petrov et al. — Language Model Tokenizers Introduce Unfairness Between Languages (2023)