Что такое токен и как языковая модель «читает» текст
Модель не видит буквы и не видит слова в привычном нам смысле. Она видит числа. Разбираемся, что такое токен, почему «привет» и «приветик» — это разное число кусочков и зачем это знать любому, кто пользуется ChatGPT.
Прежде чем модель скажет хоть слово, текст превращается в россыпь чисел — и от того, как именно он рубится на кусочки, зависит больше, чем кажется.
Языковая модель не работает с буквами и не работает со словами. Она работает с токенами — короткими кусочками текста, каждому из которых сопоставлено число.
Машина не умеет читать буквы
Когда вы печатаете в чате «Расскажи про космос», вам кажется, что модель читает это как человек: слово за словом, буква за буквой. На самом деле первое, что происходит с вашим текстом, — его разбивают на токены. Токен — это не обязательно слово и не обязательно буква. Это просто частый кусочек текста, который алгоритм решил считать единым «кирпичиком».
Зачем вообще дробить? Нейросеть внутри — это огромная математическая функция. Она умеет складывать и перемножать только числа. Поэтому любой текст сначала нужно перевести в числа. Самый наивный способ — дать каждому слову свой номер. Но слов в языке сотни тысяч, к ним добавляются опечатки, имена, новые словечки. Словарь распухнет до бесконечности, а незнакомое слово вообще нельзя будет закодировать.
Золотая середина: кусочки слов
Поэтому придумали разбивать текст на подслова. Частые слова («что», «и», «дом») получают по одному токену. Редкие слова распадаются на знакомые куски. Слово «приветик» может стать двумя токенами: привет и ик. А выдуманное «кварглбормс» — горсткой совсем мелких обрывков.
Аналогия: представьте конструктор. Если у вас есть готовая деталь «крыша домика» — собрать домик быстро. Но если попадётся что-то странное, вы соберёте это из мелких универсальных кубиков. Так и токенизатор: часто встречающееся хранит целиком, всё остальное собирает из обломков.
Откуда берётся словарь токенов
Список токенов не придумывают вручную. Его «выращивают» на огромном корпусе текстов алгоритмом вроде Byte Pair Encoding. Идея простая до гениальности: начинаем с отдельных символов и раз за разом склеиваем самую частую соседнюю пару в новый токен. Сначала склеится т+ь, потом с+я, и постепенно из символов вырастут слоги, приставки, целые слова. Когда словарь дорастает до нужного размера (обычно десятки тысяч токенов) — процесс останавливают.
Почему это важно знать вам
Во-первых, за токены платят. Стоимость запроса к модели считается не в словах и не в символах, а в токенах — и на входе, и на выходе. Длинный диалог, который вы тянете часами, с каждым сообщением тащит за собой всю предыдущую переписку, и она тоже считается.
Во-вторых, токенизация объясняет странности. Спросите модель, сколько букв «р» в слове «трактор» — она может ошибиться. Почему? Потому что слово пришло к ней как пара токенов-чисел, а не как цепочка отдельных букв. Она буквально не видит буквы по отдельности — ей приходится «вспоминать» их написание, а не считать напрямую.
В-третьих, языки кодируются неодинаково. Английский текст обычно укладывается в меньшее число токенов, чем русский: английский был представлен в обучающих данных богаче, и для него нашлось больше удобных целых кусков. Поэтому одна и та же мысль по-русски может стоить заметно дороже в токенах.
| Текст | Примерно токенов |
| «кот» | 1 |
| «котёнок» | 2–3 |
| «supercalifragilistic» | 6–8 |
| «🦄» | 2–4 |
Грубая прикидка своими руками
Точную токенизацию делает конкретный токенизатор модели, но для оценки порядка величины годится и грубое правило: на английском это примерно один токен на четыре символа. Проверим на простом примере.
text = "Hello, how are you today?"
chars = len(text)
approx_tokens = round(chars / 4)
print(f"Символов: {chars}")
print(f"Примерно токенов: {approx_tokens}")Запомните главное: модель не читает текст так, как вы. Она видит поток чисел-токенов. И всё дальнейшее — внимание, контекст, генерация — происходит уже над этими числами, а не над живыми словами.