Token
Токен — это единица входных данных, которую обрабатывает модель, например часть слова или фрагмент изображения. Как токенизаторы делят текст, что такое визуальные токены и сколько они стоят.
Токен — базовая единица входных и выходных данных, которую обрабатывает модель ИИ: слово, часть слова, символ или байт в тексте либо фрагмент пикселей изображения. Прежде чем трансформер сможет прочитать предложение или изображение, токенизатор разбивает входные данные на токены и сопоставляет каждому целочисленный ID, а модель ищет соответствующий эмбеддинг. Количество токенов определяет и объём данных, с которым может работать модель, и стоимость обработки: контекстное окно измеряется в токенах, большие языковые модели (LLMs) генерируют текст по одному токену за раз, а коммерческие API взимают плату за входные и выходные токены.
Токен, токенизация и родственные термины#
- Токенизация: процесс разбиения исходных данных на токены. Токен — одна единица результата этого процесса.
- Словарь и ID токенов: словарь токенизатора — фиксированный набор известных ему токенов, каждому из которых назначен целочисленный ID. В BERT используется 30,522 токена, в GPT-2 — 50,257, в Llama 3 — 128,256, а в Gemma 3 — около 262,000.
- Специальные токены: маркеры структуры последовательности, например токены начала и конца текста и заполнения, а также токен
[CLS], итоговый эмбеддинг которого BERT использует для классификации. - Эмбеддинги: обучаемые векторы, которые первый слой модели получает по ID каждого токена и которые передают значение токена в сеть.
Текстовые токены#
Словарь, состоящий из целых слов, не может охватить все имена, опечатки и новые термины, а последовательности из отдельных символов становятся слишком длинными. Поэтому современные токенизаторы используют подслова: частые слова становятся отдельными токенами, а редкие разбиваются на повторно используемые части. Кодирование пар байтов (BPE), адаптированное Sennrich и коллегами для нейронного машинного перевода в 2016 году, начинает с отдельных символов и многократно объединяет самую частую соседнюю пару, пока словарь не достигнет нужного размера. Модели GPT применяют BPE к байтам, поэтому можно кодировать любой текст, в том числе код и эмодзи. WordPiece (используемый в BERT) и модель Unigram из SentencePiece — родственные методы разбиения на подслова. Токенизатор BPE из CLIP, загруженный отсюда, из Hugging Face Hub, показывает, как слова разбиваются на части:
from transformers import AutoTokenizer
# Load CLIP's byte-pair-encoding (BPE) tokenizer from the Hugging Face Hub
tokenizer = AutoTokenizer.from_pretrained("openai/clip-vit-base-patch32")
for text in ["bus", "double-decker bus", "unhappiness", "Ultralytics"]:
tokens = tokenizer.tokenize(text)
print(f"{text!r} -> {tokens} -> {tokenizer.convert_tokens_to_ids(tokens)}")«bus» — это один токен с ID 2840, слово «unhappiness» разбивается на un и happiness, а редкое слово «Ultralytics» — на три части: ultr, aly и tics. Суффикс </w> обозначает конец слова в словаре CLIP из 49,408 токенов, а текстовый энкодер CLIP обрабатывает не более 77 токенов в запросе.
Визуальные токены#
Визуальный трансформер (ViT), представленный в статье An Image Is Worth 16x16 Words, разбивает изображение на патчи фиксированного размера — 16 × 16 пикселей в ViT-B/16 — и преобразует каждый патч в эмбеддинг. Поэтому изображение размером 224 × 224 превращается в 196 токенов. Позиционные эмбеддинги указывают, откуда взят каждый патч, а дополнительный токен класса собирает информацию для классификации. Обычно это преобразование реализуется с помощью свёртки, шаг которой равен размеру её ядра:
import torch
# ViT-B/16 patch embedding: a 16x16 convolution with stride 16 turns each patch into one 768-dim token
patch_embed = torch.nn.Conv2d(3, 768, kernel_size=16, stride=16)
for size in (224, 448):
image = torch.rand(1, 3, size, size)
tokens = patch_embed(image).flatten(2).transpose(1, 2) # (batch, tokens, dims)
print(f"{size}x{size} image -> {tuple(tokens.shape)}")Изображение размером 224 × 224 даёт 196 токенов по 768 значений, а увеличение его сторон до 448 пикселей даёт 784 токена — в четыре раза больше. Самовнимание сравнивает каждый токен со всеми остальными, поэтому увеличение числа токенов вчетверо означает примерно шестнадцатикратный рост вычислительных затрат на внимание. Именно поэтому модели высокого разрешения используют внимание в окнах, как в Swin Transformer, или объединяют похожие токены с помощью слияния токенов.
Модели компьютерного зрения и языка передают визуальные токены из энкодера изображений в LLM вместе с текстовыми токенами. Так один трансформер обрабатывает оба типа токенов и выдаёт ответ по одному текстовому токену за раз:
Почему важно количество токенов#
- Ограничения контекста: запрос, найденные документы или изображения и сгенерированный ответ должны помещаться в контекстное окно модели.
- Стоимость и задержка: API отдельно оценивают входные и выходные токены, а время генерации увеличивается с количеством выходных токенов, поскольку для декодирования каждого токена нужен отдельный шаг, считывающий KV-кэш модели.
- Языки и форматы: токенизаторы, обученные преимущественно на английском языке, разбивают другие языки, код и длинные числа на большее количество токенов на слово. Поэтому обработка того же содержимого стоит дороже и быстрее заполняет контекстное окно.
- Задачи на уровне символов: модель видит подсловные токены, поэтому ей сложнее, чем кажется, выполнять задачи, зависящие от отдельных букв, например считать буквы в слове или переставлять их в обратном порядке.
Примеры применения в реальных условиях#
- Генерация текста: LLM присваивает вероятность каждому токену своего словаря, выбирает один из них, добавляет его в последовательность и повторяет процесс. Методы выборки, например ядерная выборка, помогают выбирать из наиболее вероятных токенов.
- Генерация изображений: авторегрессионные модели изображений предсказывают дискретные визуальные токены из обучаемого кодбука, созданного с помощью векторного квантования, так же, как LLM предсказывает слова.
- Детекция с открытым словарём: YOLOE-26 — версия YOLOE Университета Цинхуа на основе YOLO26 в пакете Ultralytics — находит объекты по названиям классов, введённым текстом. Метод
set_classes()токенизирует каждое название с помощью токенизатора BPE из CLIP, текстовый энкодер MobileCLIP2 от Apple преобразует токены в эмбеддинг, а модель сопоставляет эти эмбеддинги с областями изображения. Поэтому она может обнаружить по одному лишь текстовому описанию «двухэтажный автобус» — класс, которого нет в наборе данных COCO.










