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

Материал из llmdocs — справочник разработчика
Токен и токенизация
Что такое токенфрагмент текста из словаря модели — слово, часть слова, символ или байт
Основные алгоритмы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 — байтовые токенизаторы при необходимости собирают их из отдельных байтов.

См. также

Источники

  1. R. Sennrich, B. Haddow, A. Birch — Neural Machine Translation of Rare Words with Subword Units (BPE, 2015)
  2. T. Kudo, J. Richardson — SentencePiece (2018)
  3. openai/tiktoken — GitHub
  4. Hugging Face — Summary of the tokenizers
  5. Anthropic — Token counting
  6. A. Petrov et al. — Language Model Tokenizers Introduce Unfairness Between Languages (2023)