COMRAD404 / GLOSSARY

BPE (Byte Pair Encoding)

Byte Pair Encoding

BPE (Byte Pair Encoding) — способ субсловной токенизации, где словарь строится через слияние частых пар. Объясняем механику, применение в LLM и проверку токенов через tiktoken, Hugging Face и SentencePiece.

TL;DR

BPE — метод субсловной токенизации, который строит словарь, многократно сливая самые частые соседние пары единиц.

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 описано так: модель стартует с символов, затем объединяет самую частую пару и повторяет это, пока не достигнет целевого размера словаря. Это и есть базовая схема, на которую стоит опираться, когда вы читаете документацию или отлаживаете токенизацию.

Корпус текстов
   ↓
Начальный набор единиц (символы)
   ↓
Подсчёт самых частых соседних пар
   ↓
Слияние самой частой пары в новый субтокен
   ↓
Повтор шага много раз
   ↓
Итоговый словарь субслов
   ↓
Разбиение новых строк по выученным слияниям
  1. Собирается корпус. Алгоритм смотрит на реальные тексты, а не на заранее выписанный словарь.
  2. Задаётся начальный алфавит. В quicktour Hugging Face отправная точка — символы.
  3. Считаются частые пары. Например, если два соседних элемента постоянно идут вместе, их имеет смысл превратить в новый элемент.
  4. Пара сливается. После этого словарь уже содержит не только исходные символы, но и новый субсловный фрагмент.
  5. Процесс повторяется. Слияния продолжаются, пока не будет достигнут целевой размер словаря.
  6. Новый текст разбивается по выученным правилам. Поэтому одно и то же слово не обязано быть одним токеном: оно может распасться на несколько знакомых частей.

В экосистеме 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 — когда вы смотрите на текстовую часть мультимодальных пайплайнов, где токенизация тоже имеет значение.

Источники

Вопросы и ответы

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 токенов.

Источники

SOURCES

Вопросы и ответы

FAQ
BPE и токен — это одно и то же?

Нет. BPE — это метод построения токенизации, а токен — результат разбиения текста по этой токенизации.

Почему одно слово может разбиться на несколько частей?

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

Можно ли заранее угадать число токенов без конкретной модели?

Надёжно — нет. Для OpenAI-сценария проверка из официального cookbook — выбрать кодировку через encoding_for_model(...), затем вызвать encode(text) и посчитать длину списка через len(...).

Чем отличаются 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 токенов.

Читайте также

LINKS