Большая языковая модель (LLM) решает одну задачу: по началу текста предсказывает распределение вероятностей следующего токена. Всё остальное, от чата до агентов, построено поверх этой операции, повторённой много раз.
Токены, а не слова
Модель не видит буквы и слова. Текст сначала режется токенайзером на токены: куски слов, целые частые слова, знаки препинания, пробелы. У каждого токена есть номер в словаре (обычно 32-260 тысяч записей).
Самый распространённый алгоритм: BPE (byte pair encoding). Начинаем с байтов или символов и много раз склеиваем самую частую пару соседей в новый токен. Частые слова становятся одним токеном, редкие разбиваются на несколько.
"собеседование" -> ["со", "бесед", "ование"] (условный пример)
"the" -> ["the"]
Практические следствия:
- Русский текст обычно дороже английского: тот же смысл занимает больше токенов, потому что словари строили в основном на английских данных.
- Цены, лимиты контекста и скорость считаются в токенах, а не в символах.
- Модель плохо считает буквы в слове: она видит токены, а не символы.
- Числа режутся непредсказуемо, отсюда ошибки в арифметике.
Byte-level BPE работает поверх байтов UTF-8, поэтому у него нет «неизвестного токена»: любой текст можно закодировать.
Эмбеддинги токенов
Номер токена превращается в вектор: строка из таблицы эмбеддингов размера vocab × d_model. К нему добавляется информация о позиции. Современные модели чаще всего используют RoPE (rotary position embedding): позиция кодируется поворотом векторов query и key, и внимание зависит от относительного расстояния между токенами.
Self-attention на пальцах
Каждый слой трансформера состоит из двух блоков: внимание и полносвязная сеть (MLP), оба с residual-связями и нормализацией.
Во внимании для каждого токена считаются три вектора: query (что я ищу), key (что я предлагаю), value (что отдам). Вес связи токена i с токеном j:
attention(Q, K, V) = softmax(Q·Kᵀ / √d_k) · V
Деление на √d_k не даёт скалярным произведениям расти с размерностью и «залипать» softmax в один токен. Многоголовое внимание делает это параллельно в нескольких подпространствах: одна голова может следить за синтаксисом, другая за ссылками на сущности.
В генеративных моделях внимание каузальное: токен смотрит только на себя и предыдущие, будущие закрыты маской. Поэтому модель можно учить предсказывать каждый следующий токен параллельно по всей последовательности.
Decoder-only
Оригинальный трансформер 2017 года был encoder-decoder (перевод). BERT взял только энкодер: двунаправленное внимание, хорош для классификации и эмбеддингов. GPT и почти все современные чат-модели взяли только декодер: каузальное внимание и предсказание следующего токена.
Из-за полного внимания каждый токен сравнивается со всеми предыдущими: вычисления растут квадратично от длины контекста. Это главная причина, почему длинный контекст дорог.
Контекстное окно
Контекстное окно: сколько токенов модель обрабатывает за раз, включая системный промпт, историю, документы и сам ответ. Что не влезло, модель не видит вообще: у неё нет памяти между запросами, «память» чата это просто история, которую клиент отправляет заново.
Даже если окно большое, модель хуже использует информацию из середины длинного контекста (эффект «lost in the middle»). Поэтому RAG и аккуратная сборка контекста остаются нужны и при окнах в сотни тысяч токенов.
Как модель учат
- Предобучение: предсказание следующего токена на триллионах токенов текста и кода. Получается базовая модель: она продолжает текст, но не обязательно выполняет инструкции.
- SFT (supervised fine-tuning): дообучение на парах «инструкция и хороший ответ».
- Выравнивание: RLHF или DPO на предпочтениях людей, чтобы ответы были полезнее и безопаснее.
Знания модели заморожены на дате среза данных. Всё более свежее нужно подавать в контекст.
Почему модель «галлюцинирует»
Модель оптимизирована выдавать правдоподобное продолжение, а не проверенный факт. Если в данных нет ответа, наиболее вероятный текст всё равно будет выглядеть уверенно. Снижают это подачей источников в контекст (RAG), просьбой ссылаться на них, проверками и отказом отвечать при отсутствии данных.
Частые ошибки
- Считать, что модель «помнит» прошлые диалоги. Помнит только то, что лежит в текущем контексте.
- Путать параметры модели (веса) и контекст (то, что подали в запрос).
- Оценивать длину промпта в словах или символах вместо токенов.
- Думать, что большое окно отменяет поиск: дорого, медленно и хуже по качеству на середине.
Что спросят на собесе
- Что такое токен и как работает BPE, почему русский текст дороже.
- Формула внимания и зачем деление на корень из d_k.
- Чем decoder-only отличается от encoder-only (GPT и BERT).
- Почему стоимость внимания квадратична по длине и что такое контекстное окно.
- Этапы обучения: предобучение, SFT, выравнивание. Откуда галлюцинации.