# Токен и токенизация

> Токен — минимальная единица текста, с которой работает языковая модель (обычно часть слова); токенизация — разбиение текста на токены и их перевод в числовые идентификаторы.

Источник: https://llmdocs.ru/wiki/tokenization/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Что такое токен**: фрагмент текста из словаря модели — слово, часть слова, символ или байт
- **Основные алгоритмы**: BPE, WordPiece, Unigram
- **Библиотеки**: tiktoken, SentencePiece, Hugging Face Tokenizers
- **Размер словаря**: обычно от 32 тыс. до 256 тыс. токенов
- **Эмпирика для английского**: около 4 символов или 0,75 слова на токен
- **Влияние**: стоимость, скорость, длина контекста, качество на разных языках
**Токен** — минимальная единица текста, с которой работает [языковая модель](https://llmdocs.ru/wiki/llm.md). Обычно это не слово и не буква, а что-то среднее: частое слово целиком, кусок редкого слова, знак препинания или пробел вместе с началом слова. **Токенизация** — процесс разбиения текста на токены и перевода каждого в числовой идентификатор из фиксированного словаря модели. Модель видит только последовательность чисел и генерирует ответ тоже по одному токену.

В токенах измеряется почти всё, что важно на практике: цена запроса к API, размер [контекстного окна](https://llmdocs.ru/wiki/context-window.md), скорость генерации и лимиты.[5]

## Зачем делить на части слов

Есть три очевидных варианта разбиения, и у каждого свои проблемы:

| Единица | Плюсы | Минусы |
|---|---|---|
| Слово | короткие последовательности | огромный словарь, неизвестные слова, опечатки, разные формы слова |
| Символ или байт | маленький словарь, любой текст | очень длинные последовательности, медленно и дорого |
| Часть слова (*subword*) | компромисс: частые слова целиком, редкие — из кусков | разбиение иногда неинтуитивно |

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

## Алгоритмы

**BPE** (*Byte Pair Encoding*) изначально был методом сжатия данных; для нейросетей его адаптировали Рико Зеннрих и коллеги в 2015 году.[1] Обучение начинается со словаря из отдельных символов (в современных вариантах — байтов), затем самая частая пара соседних единиц объединяется в новую, и так тысячи раз, пока словарь не достигнет нужного размера. Байтовый BPE используют модели GPT, Llama и многие другие.

**WordPiece** (BERT) похож на BPE, но выбирает слияния по вероятностному критерию. **Unigram** начинает с большого словаря и удаляет наименее полезные токены. Библиотека **SentencePiece** реализует BPE и Unigram, работая с сырым текстом без предварительного деления на слова, что удобно для языков без пробелов.[2] Обзор алгоритмов — в документации Hugging Face.[4]

## Пример

```python
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](https://llmdocs.ru/wiki/markdown.md) обходится дешевле, чем HTML с той же информацией (см. [Markdown как формат для LLM](https://llmdocs.ru/wiki/markdown-for-llm.md)).

## Практические советы

- Для оценки стоимости и проверки лимитов используйте токенизатор или эндпоинт подсчёта токенов конкретного провайдера, а не правило «слово ≈ токен».[5]
- Убирайте из документов, подаваемых в модель, лишнюю разметку, повторы и служебный текст.
- При нарезке документов для [RAG](https://llmdocs.ru/wiki/rag.md) размер фрагментов задавайте в токенах (см. [Чанкинг документов](https://llmdocs.ru/wiki/chunking.md)).
- Повторяющееся начало запроса выгодно кэшировать — см. [Кэширование промптов](https://llmdocs.ru/wiki/prompt-caching.md).

Связь токенов с текстом обратимая: последовательность идентификаторов однозначно декодируется в исходную строку, включая [любые символы Unicode](https://llmdocs.ru/wiki/unicode-utf8.md) — байтовые токенизаторы при необходимости собирают их из отдельных байтов.

## См. также

- [Большая языковая модель (LLM)](https://llmdocs.ru/wiki/llm.md)
- [Контекстное окно](https://llmdocs.ru/wiki/context-window.md)
- [Эмбеддинг](https://llmdocs.ru/wiki/embedding.md)
- [Кэширование промптов](https://llmdocs.ru/wiki/prompt-caching.md)
- [Unicode и UTF-8](https://llmdocs.ru/wiki/unicode-utf8.md)

## Источники

1. [R. Sennrich, B. Haddow, A. Birch — Neural Machine Translation of Rare Words with Subword Units (BPE, 2015)](https://arxiv.org/abs/1508.07909)
2. [T. Kudo, J. Richardson — SentencePiece (2018)](https://arxiv.org/abs/1808.06226)
3. [openai/tiktoken — GitHub](https://github.com/openai/tiktoken)
4. [Hugging Face — Summary of the tokenizers](https://huggingface.co/docs/transformers/tokenizer_summary)
5. [Anthropic — Token counting](https://docs.anthropic.com/en/docs/build-with-claude/token-counting)
6. [A. Petrov et al. — Language Model Tokenizers Introduce Unfairness Between Languages (2023)](https://arxiv.org/abs/2305.15425)
