Книга: Инжиниринг искусственного интеллекта
Назад: КНИГА 1. Инженерия LLM: от токена до двойника
Дальше: 1.2 Эмбеддинги

ГЛАВА 1. КАК РАБОТАЕТ ГЕНЕРАТИВНАЯ ЯЗЫКОВАЯ МОДЕЛЬ: ОТ ЗАПРОСА К ОТВЕТУ

«Люди - это нейронные сети. Всё, что можем делать мы, способны делать и машины» - Джеффри Хинтон, ученый-информатик, первопроходец в области глубокого обучения



1.1 Токен

Токен - это минимальная единица текста, на который алгоритм разбивает предложение, чтобы с ним работать. Это и единица измерения стоимости и скорости. Название подчеркивает, что это «замена» реальному тексту в цифровом мире, своего рода жетончик, который обозначает кусочек смысла.



Почему не «слово» или «символ»?

Термин «токен» выбран потому, что он шире и абстрактнее, чем «слово». Токенами становятся не только слова, но и знаки препинания, цифры, пробелы (иногда) или части слов (сабворды). Например, в предложении «Привет! Как дела?» токенами будут: [Привет] , [!] , [Как] , [дела] , [?] . Восклицательный знак - это не слово, но это важный токен.



Математическая абстракция: Для нейросети токен - это, в конечном итоге, просто индекс (число) из словаря. Назвать это «словом» было бы некорректно, так как модель оперирует числами, а не лингвистическим понятием «слова».



Итак, токен - это не просто слово, а абстрактный «жетончик смысла». Но как именно текст превращается в эти жетончики? За это отвечает следующий компонент - токенизатор.



Токенизация (Tokenization)

разделение текста на единицы обработки. Когда вы отправляете сообщение, модель не видит буквы или слова в человеческом понимании. Текст проходит через токенизатор (tokenizer) - алгоритм, который разбивает строку на минимальные единицы, называемые токенами (tokens). Существует несколько алгоритмов: BPE (используется в GPT и RoBERTa), WordPiece (BERT) и SentencePiece (LLaMA, T5, XLNet).



BPE, WordPiece и SentencePiece - в чём разница?



Токенизатор - это не «чёрный ящик». Это алгоритм, который решает одну задачу: если слова нет в словаре, на какие кусочки его разрезать? Три популярных подхода - BPE, WordPiece и SentencePiece.



BPE (Byte Pair Encoding)



Как работает

Находит самую частую пару символов в тексте, склеивает её в новый токен. Повторяет, пока словарь не достигнет нужного размера.



Пример

В тексте часто встречается a b → склеиваем в ab. Потом ab c → в abc. И так далее.

+ Простой, понятный, работает для европейских языков.

Требует предварительной разбивки на слова (пробелы - отдельные специальные символы). Плох для языков без пробелов (китайский, японский, тайский).



Где используется

GPT, RoBERTa.



WordPiece



Как работает

Тот же принцип склейки, но выбирает не самую частую пару, а ту, которая максимально увеличивает вероятность (правдоподобие) языковой модели.



Разница с BPE

BPE выбирает пару по частоте. WordPiece - по приросту вероятности модели (то, что лучше помогает предсказывать следующий токен).

+ Даёт чуть более «умные» токены, чем BPE.

Тоже требует разбивки на слова. Сложнее в реализации.



Где используется

BERT.



SentencePiece



Что это

Не алгоритм, а библиотека, которая умеет две вещи:

· Работать с сырым текстом (без предварительной разбивки на слова по пробелам).

· Использовать внутри либо BPE, либо Unigram (третий алгоритм).



Главная фишка

Пробел в SentencePiece - обычный символ, как и все остальные. Поэтому он не требует «знать», где границы слов. Это важно для языков без пробелов (китайский, японский, тайский).

+ Универсален, работает с любыми языками.

Требует отдельного шага - обучения токенизатора на корпусе (хотя это делается один раз).



Сравнительная таблица







Что важно для инженера





Если вы работаете с английским и европейскими языками

BPE или WordPiece дадут почти одинаковый результат. Разница заметна только на гранях.





Если ваша модель мультиязычная или работает с китайским/японским

вам нужен SentencePiece. Без него пробелы будут мешать, а слова без пробелов - резаться в случайные кусочки.





SentencePiece сегодня - стандарт для open-source LLM (LLaMA, Qwen, DeepSeek). BPE и WordPiece сегодня используют реже (GPT-2, BERT - уже не передний край), но понимать их полезно для чтения старых статей и спецификаций.





Токен может быть:

· целым словом («кот», «человек»);

· частью слова («нейро», «сеть»);

· отдельным символом («!», «?»).





Выбор стратегии - инженерное решение, у которого нет идеального варианта, только компромиссы.





Целые слова

интуитивно понятно, но словарь разрастается до миллионов токенов (неэффективно), а модель не сможет обработать слово, которого не видела в обучении (проблема OOV - out of vocabulary).





Части слов (сабворды)

золотая середина. Словарь фиксированного размера (32K–256K), редкие слова собираются из кусочков, модель может обрабатывать новые слова. Минус: иногда нарезка выглядит нелогичной («нейро» + «сети» вместо «нейросети»).





Отдельные символы

словарь крошечный (десятки/сотни токенов), нет проблемы OOV, но длинные тексты превращаются в очень длинные последовательности, что замедляет обработку и усложняет поиск смысловых связей.





Большинство современных моделей выбирают компромиссный вариант - сабворды (BPE, SentencePiece, WordPiece).





Как это работает технически

Токенизатор анализирует статистику встречаемости символов и их сочетаний в обучающем корпусе. Часто встречающиеся последовательности объединяются в один токен. Это позволяет держать размер словаря (обычно 32 000–256 000 токенов) фиксированным, но при этом кодировать любой текст.





Как токен получает свой номер (и почему спецсимволы - особенные)

Может показаться, что числа, которыми обозначаются токены, назначаются случайно. Но это не так. У токенизатора есть строгая логика, и она подчиняется одной цели: сделать словарь максимально эффективным.





Алгоритм работает следующим образом





Токенизатор начинает с базового алфавита. Каждому символу - букве, цифре, знаку препинания - присваивается начальный номер. Это «фундамент» словаря. Никто не спрашивал разрешения у запятой или точки с запятой - они получили свои номера по умолчанию, потому что без них текст рассыпается.

Затем токенизатор «смотрит» на обучающий корпус (миллиарды текстов) и ищет самые частотные пары уже существующих токенов.

Самую частотную пару он «склеивает» в новый токен и присваивает ему следующий свободный номер.

Процесс повторяется тысячи раз. С каждым шагом словарь пополняется новыми токенами, которые собраны из более мелких кусочков.





Два важных нюанса про спецсимволы





Первый: пробелы

В большинстве токенизаторов пробел - это не «пустота», а полноправный символ, который получает свой номер. Когда токенизатор «склеивает» пары, он может объединить пробел со следующим словом. Именно поэтому в некоторых моделях токен « Как» (с пробелом в начале) существует отдельно - это наследие того, что на каком-то шаге пробел и слово «Как» встретились вместе достаточно часто.





Второй: пунктуация

Знаки препинания (точка, запятая, восклицательный знак) - это отдельные токены с самого начала. Они никогда не «склеиваются» со словами, если только модель специально не обучена на текстах без пробелов после знаков (а такое бывает). Поэтому в примере выше восклицательный знак «!» остался самостоятельным токеном номер 67, хотя мог бы теоретически приклеиться к слову «Привет».





Что в итоге?

Цифра 3245 - это не случайный индекс, а история: этот токен был «склеен» на каком-то шаге из двух более мелких, которые встретились вместе достаточно часто, чтобы заслужить собственное место в словаре. А цифра 67 (восклицательный знак) - это «первокирпичик», который был заложен в фундамент ещё до начала склеивания.





Чтобы увидеть этот процесс в действии, давайте проследим, как одна и та же фраза выглядит глазами человека и глазами модели. Разница окажется разительной.









Но токенизация работает по-разному не только для человека и машины, но и для разных человеческих языков. Английский, русский и китайский «весят» в токенах совершенно по-разному.





Токенизация разных языков

Токенизаторы обычно обучаются на смеси языков, но английский в ней доминирует. Это создаёт перекос:





Английский

Частотные слова становятся одним токеном. Коэффициент токенизации (токенов на слово) - 1.0-1.5.





Русский

Из‑за развитой морфологии слово часто разбивается на корень и окончание. Коэффициент - 1.5-2.0.





Японский/Китайский

Иероглифы кодируются посимвольно. Коэффициент - 2.0-3.0.





Практическое следствие

При прочих равных, работа с русским текстом обходится дороже в токенах, чем с английским. Эти коэффициенты - не просто академические цифры. Для инженера они прямо переводятся в деньги.





Важное уточнение: это не потому, что английский «лучше».





Глядя на эти цифры, легко сделать неверный вывод: мол, английский - самый «экономный» язык, а русский и тем более китайский - «расточительные». Это не так.

Разница в коэффициентах - не лингвистическая данность, а исторический артефакт. Подавляющее большинство токенизаторов обучались на корпусах, где доминировал английский. Они «настроены» на его частотности, на его типичные сочетания символов. Русский, китайский, арабский и другие языки просто «подсели» в этот словарь, который под них не оптимизирован.





Теоретически ничто не мешает создать токенизатор, который будет экономичнее для китайского, чем для английского. Если взять корпус, где 90% текстов - на китайском, и обучить BPE или SentencePiece на нём, иероглифы начнут «склеиваться» в осмысленные частотные пары, а английские слова, наоборот, будут дробиться на части. Коэффициенты поменяются местами.





Практически это уже происходит. Китайские модели (Qwen, DeepSeek) используют токенизаторы, оптимизированные под китайский и английский одновременно, с балансировкой словаря. Русскоязычные модели (GigaChat, YandexGPT) тоже имеют свои особенности токенизации, хотя часто дообучаются поверх «английских» словарей. В специализированных моделях разница в «весе» между языками может быть сведена к минимуму или даже обращена в пользу локального языка.





Вывод для инженера





Если вы строите систему под русский язык и используете «английскую» модель - да, вы будете платить больше за токены. Но это не проклятие языка, а вопрос выбора инструмента. Существуют модели и токенизаторы, где русский «весит» столько же, сколько английский (к примеру, GigaChat и Saiga (адаптированная LLaMA)), а в некоторых случаях - даже меньше. Просто их нужно знать и уметь выбирать.





Давайте теперь посмотрим, как знание о токенах помогает считать бюджет.





Токенизация и опечатки: как модель видит ошибки

Мы только что разобрали, как токенизатор превращает текст в числа. Но что происходит, если в тексте есть опечатка? Для человека слово «следуюет» - это очевидная ошибка, мы её автоматически исправляем и понимаем смысл. Для модели всё иначе.





Посмотрим на примере





Слово: "следуюет" (опечатка, должно быть "следует")

Токены: [сле] [дую] [ет] или [с] [ле] [ду] [ю] [ет] (зависит от токенизатора)

Индексы: [1245] [7890] [3456]





Для модели это просто три числа: 1245, 7890, 3456. Она не знает, что это «неправильное слово». Она видит последовательность токенов, которые могут быть редкими (если опечатка встречается редко) или, наоборот, часто встречаться в корпусе (если люди часто делают эту ошибку).





Два сценария





Сценарий 1: Редкая опечатка





Если слово «следуюет» встречается в обучающих данных редко, токены, на которые оно разобьётся, будут иметь низкую вероятность. Модель может не понять контекст или дать странный ответ. Но если вокруг достаточно контекста, она может догадаться по соседним словам.





Сценарий 2: Частая опечатка





Если ошибка распространена (например, «вообщем» вместо «в общем»), токенизатор может даже выделить для неё отдельный токен. Такое слово становится для модели таким же «нормальным», как и правильный вариант. Она будет обрабатывать его как обычное слово, не подозревая, что это ошибка.

Я, как человек, увидел слово «следуюет» и автоматически сопоставил его с известным мне словом «следует», проигнорировав лишнюю букву «ю». У меня есть ментальная модель языка и знание, что такой ошибки быть не должно.

Модель же видит последовательность токенов. Если эта последовательность достаточно часто встречалась в обучении, она воспримет её как допустимый вариант. Если редко - может «растеряться». Но у неё нет «чувства правильности» - только статистика.





Практический вывод для инженера





При построении систем, которые общаются с пользователями, важно учитывать:

· Токенизатор не исправляет опечатки, он просто кодирует их

· Если ваш продукт работает с неграмотными текстами (чаты, соцсети), стоит подумать о предобработке - нормализации опечаток до токенизации

· Некоторые модели специально дообучают на текстах с ошибками, чтобы они лучше понимали реальных пользователей





Пример предобработки





Вход: "следуюет заменить"

Шаг 1: нормализация опечаток (опционально) → "следует заменить"

Шаг 2: токенизация → [сле] [дует] [за] [ме] [нить]





Без нормализации модель получит редкую последовательность токенов и может ответить хуже. С нормализацией - стандартную последовательность, с которой она училась работать.





Расход токенов и бюджет





Это критически важно для

· расчёта стоимости API (Application Programming Interface)2;

· планирования длины контекста (один и тот же текст на русском займёт больше токенов);

· выбора модели.





Итак, мы превратили текст в последовательность чисел-токенов. Но сами по себе эти числа - просто индексы, они ничего не говорят модели о смысле слов. Чтобы наделить их значением, нужен следующий шаг - эмбеддинги.





Назад: КНИГА 1. Инженерия LLM: от токена до двойника
Дальше: 1.2 Эмбеддинги