BPE (Byte Pair Encoding) — это семейство методов субсловной токенизации, в котором словарь строится итеративным слиянием самых частых соседних пар единиц. На практике BPE нужен затем, чтобы представлять текст не только целыми словами и не только одиночными символами, а повторяющимися частями слов, которые модель уже умеет узнавать.
Канонический академический источник для BPE-подобных субсловных единиц в машинном переводе — статья ACL 2016 Neural Machine Translation of Rare Words with Subword Units Сеннриха, Хэддоу и Бёрча. По состоянию на 2026-08-15 актуальные подтверждённые реализации и документация в этом пакете источников — Hugging Face Tokenizers, OpenAI tiktoken и Google SentencePiece.
Английский термин: Byte Pair Encoding. Также встречается: BPE, BPE-токенизация, субсловная токенизация; в инструментах отдельно встречаются byte-level BPE и режим model_type=bpe.
Простыми словами
Грубо говоря, BPE можно представить как способ собрать «словарь кусочков». Сначала система знает только самые маленькие элементы, затем смотрит, какие соседние куски чаще всего стоят рядом, и делает из них новый, более крупный фрагмент.
Если в текстах постоянно встречаются одинаковые части слов, BPE не хранит каждое слово целиком. Вместо этого она учится повторно использовать удачные фрагменты. Поэтому редкое или новое слово можно разложить на знакомые части, а не считать полностью неизвестным.
Как это работает
В официальном quicktour Hugging Face обучение BPE описано так: модель стартует с символов, затем объединяет самую частую пару и повторяет это, пока не достигнет целевого размера словаря. Это и есть базовая схема, на которую стоит опираться, когда вы читаете документацию или отлаживаете токенизацию.
Корпус текстов
↓
Начальный набор единиц (символы)
↓
Подсчёт самых частых соседних пар
↓
Слияние самой частой пары в новый субтокен
↓
Повтор шага много раз
↓
Итоговый словарь субслов
↓
Разбиение новых строк по выученным слияниям
- Собирается корпус. Алгоритм смотрит на реальные тексты, а не на заранее выписанный словарь.
- Задаётся начальный алфавит. В quicktour Hugging Face отправная точка — символы.
- Считаются частые пары. Например, если два соседних элемента постоянно идут вместе, их имеет смысл превратить в новый элемент.
- Пара сливается. После этого словарь уже содержит не только исходные символы, но и новый субсловный фрагмент.
- Процесс повторяется. Слияния продолжаются, пока не будет достигнут целевой размер словаря.
- Новый текст разбивается по выученным правилам. Поэтому одно и то же слово не обязано быть одним токеном: оно может распасться на несколько знакомых частей.
В экосистеме Hugging Face это отражено прямо в API: есть модель tokenizers.models.BPE и тренер BpeTrainer. Для обучения доступны параметры vocab_size, min_frequency, special_tokens, limit_alphabet, initial_alphabet, continuing_subword_prefix, end_of_word_suffix и max_token_length. Если вы работаете не с теорией, а с собственной токенизацией, именно эти ручки и определяют практическое поведение.
Важно и то, как модель хранится. В документации Hugging Face BPE загружается из vocab.json и merges.txt. В SentencePiece при model_type=bpe обучение записывает файлы <model_prefix>.model и <model_prefix>.vocab. То есть под одним термином BPE вы встретите близкую идею, но разные форматы артефактов и разные API.
Где применяется
BPE особенно важен там, где вам нужно не «прочитать текст глазами», а точно понять, как конкретная библиотека превратит его в токены.
| Инструмент | Что подтверждено источниками | Практический смысл |
|---|---|---|
| Hugging Face Tokenizers | Есть реализация tokenizers.models.BPE, обучение через BpeTrainer, загрузка из vocab.json и merges.txt; по состоянию на 2026-08-15 на странице релизов указан выпуск v0.23.1 |
Подходит, если вы обучаете или настраиваете собственный BPE-токенизатор |
| tiktoken | README описывает библиотеку как fast BPE tokeniser for OpenAI’s models; есть модельно-зависимый выбор кодировки через encoding_for_model(...) и получение токенов через encode(text) |
Подходит, если вам нужно проверять разбиение и считать токены под конкретную модель OpenAI |
| SentencePiece | Документация поддерживает model_type=bpe; обучение пишет <model_prefix>.model и <model_prefix>.vocab; по состоянию на 2026-08-15 на странице релизов указан выпуск v0.2.2 |
Подходит для субсловной предобработки сырого текста, включая мультиязычные сценарии |
- Подсчёт токенов в приложениях. В OpenAI Cookbook текущая проверочная схема — взять
tiktoken.encoding_for_model("gpt-4o-mini"), затем вызватьencoding.encode(text)и посчитать длину черезlen(...). - Обучение собственного токенизатора. В Hugging Face вы управляете размером словаря, минимумом частоты и спецтокенами через
BpeTrainer. - Предобработка мультиязычных корпусов. В SentencePiece можно обучать
model_type=bpeпрямо на сыром тексте и затем использовать сохранённые файлы модели и словаря. - Отладка поведения модели. Если вы обсуждаете, почему метрика вроде Perplexity или стратегия декодирования вроде Beam Search ведут себя не так, как ожидалось, начинать часто приходится именно с токенизации.
Практическая оговорка: по Hugging Face в этом пакете подтверждены документы на ветке main, а не снимок конкретной стабильной документации под каждую закреплённую сборку. Если вы пините версию библиотеки, сверяйте поведение ещё и со страницей релизов.
Практический пример
Самый полезный для практики сценарий — не пытаться «угадать» BPE на глаз, а проверить, как конкретная модель кодирует конкретную строку. Для OpenAI-совместимого сценария подтверждённый путь выглядит так:
import tiktoken
text = "BPE помогает разбивать редкие слова на повторяющиеся части."
encoding = tiktoken.encoding_for_model("gpt-4o-mini")
token_ids = encoding.encode(text)
token_count = len(token_ids)
print(token_ids)
print(token_count)
Что вы получите:
- список целых идентификаторов токенов;
- их количество для выбранной кодировки модели.
Что важно не перепутать:
- те же символы могут дать другое разбиение для другой модели или другой кодировки;
- без вызова
encoding_for_model(...)нельзя надёжно говорить о «правильном» числе токенов для модели OpenAI; - конкретные числа в выводе здесь не фиксируются, потому что они зависят от используемой кодировки.
Если же вы строите собственный пайплайн, аналогичный уровень проверки нужен и для Hugging Face, и для SentencePiece: термин BPE общий, но фактическое разбиение всегда определяется конкретной обученной моделью токенизации.
Чем отличается от других реализаций и подходов
Ниже — учебное сравнение, которое помогает не смешивать идею BPE с более грубыми способами разбивки текста и с конкретными библиотеками.
| Подход | Базовая единица | Как формируется словарь | Что происходит с новым словом |
|---|---|---|---|
| Пословная разбивка | Целое слово | Словарь состоит из словарных форм или встреченных слов | Если нужного слова нет, само слово как единица уже проблемно использовать без дополнительных правил |
| Посимвольная разбивка | Отдельный символ | Достаточно набора символов | Любое слово всегда можно представить как последовательность символов |
| BPE | Субслово, выученное из частых пар | Стартует с символов и расширяется повторяющимися слияниями до целевого размера словаря | Новое слово обычно раскладывается на знакомые части, а не обязано быть одной цельной единицей |
Если сравнивать уже не идеи, а реализации, то различия такие:
- Hugging Face BPE — это явная модель
BPEплюс отдельныйBpeTrainerи форматvocab.json+merges.txt. - tiktoken — это быстрый BPE-токенизатор для моделей OpenAI с модельно-зависимым выбором кодировки через
encoding_for_model(). - SentencePiece BPE — это режим
model_type=bpe, который пишет файлы.modelи.vocab; после загрузкиSentencePieceProcessorнеизменяем.
Ограничения и заблуждения
- Заблуждение: «BPE = один фиксированный стандарт». В источниках здесь есть каноническая академическая работа и несколько актуальных реализаций, но нет единой универсальной формальной спецификации для всех библиотек и моделей.
- Заблуждение: «одно слово = один токен». Для BPE это неверно по самой идее субсловной токенизации: слово может делиться на несколько частей.
- Заблуждение: «достаточно знать термин BPE, чтобы заранее знать число токенов». На практике кодировка зависит от конкретной реализации и, в случае tiktoken, от конкретной модели.
- Ограничение реализации. В SentencePiece документировано, что
SentencePieceProcessorпосле загрузки неизменяем и не поддерживает on-the-fly modification токенов. - Ограничение документации. По Hugging Face верифицированные docs в этом пакете находятся на ветке main; поведение закреплённой версии надо дополнительно сверять с релиз-нотами.
- Ограничение производительности и внутренних деталей. Даже внутри одной библиотеки детали реализации меняются: в changelog tiktoken для v0.13.0 отдельно отмечено изменение Branch byte pair encoding для исправления производительности на необычном вводе.
Практический вердикт: если вы считаете токены, обучаете собственный токенизатор или пытаетесь понять, почему модель режет текст именно так, BPE нужно знать обязательно. Но для точной работы опирайтесь не на абстрактное определение, а на конкретную библиотеку, конкретную модель и конкретные файлы токенизатора.
Редакционное ограничение: этот материал опирается только на академическую статью и официальные open-source docs/репозитории из пакета источников. Здесь сознательно не разбираются коммерческие тарифы, хостинговые условия и полная матрица платформенной поддержки.
Связанные термины и инструменты
BPE редко существует в изоляции. В реальной работе вы быстро выходите на соседние темы:
- Perplexity (перплексия) — когда нужно интерпретировать качество модели на уровне токенов.
- Beam Search — когда после токенизации вас интересует стратегия выбора последовательности.
- Temperature (параметр генерации) — когда важно понять, как меняется распределение при генерации токенов.
- CLIP — когда вы смотрите на текстовую часть мультимодальных пайплайнов, где токенизация тоже имеет значение.
Источники
- Neural Machine Translation of Rare Words with Subword Units – ACL Anthology
- Models · Hugging Face
- Trainers · Hugging Face
- Quicktour — tokenizers documentation
- Releases · huggingface/tokenizers · GitHub
- tiktoken/README.md at main · openai/tiktoken · GitHub
- openai-cookbook/examples/How_to_count_tokens_with_tiktoken.ipynb at main · openai/openai-cookbook · GitHub
- tiktoken/CHANGELOG.md at main · openai/tiktoken · GitHub
- sentencepiece/doc/options.md at master · google/sentencepiece · GitHub
- sentencepiece/doc/special_symbols.md at master · google/sentencepiece · GitHub
- Releases · google/sentencepiece · GitHub
Вопросы и ответы
BPE и токен — это одно и то же?
Нет. BPE — это способ построить токенизацию, а токен — результат разбиения текста по этой токенизации.
Почему одно слово может разбиться на несколько частей?
Потому что BPE работает на уровне субслов. Если слово не закрепилось в словаре как одна единица, оно будет представлено последовательностью знакомых фрагментов.
Можно ли заранее угадать число токенов без конкретной модели?
Надёжно — нет. Верифицированный путь для OpenAI-сценария — выбрать кодировку через encoding_for_model(...), затем вызвать encode(text) и посчитать длину списка.
Чем отличаются Hugging Face BPE, tiktoken и SentencePiece BPE?
Идея субсловного разбиения общая, но API и артефакты различаются. Hugging Face использует модель BPE и файлы vocab.json/merges.txt, tiktoken делает модельно-зависимый выбор кодировки, а SentencePiece работает через model_type=bpe и сохраняет .model/.vocab.
Можно ли менять токены SentencePiece «на лету» после загрузки модели?
По документации — нет. SentencePieceProcessor после загрузки неизменяем и не поддерживает on-the-fly modification токенов.