1. Архитектура современных LLM: от механизмов внимания в трансформерах до процессов токенизации
Когда современная языковая модель генерирует эссе, пишет код или отвечает на сложный технический вопрос, она не оперирует смыслами, идеями или даже словами в человеческом понимании. На фундаментальном уровне такие системы, как GPT-4, Claude 3.5 или Llama 3, выполняют одну строго детерминированную математическую задачу: вычисляют вероятность появления следующего фрагмента текста на основе предыдущих. Вся магия «интеллекта» рождается из того, насколько сложный контекст модель способна учесть при расчете этой вероятности. Чтобы понять, как именно инженерам удалось научить матрицы предсказывать осмысленный текст, необходимо разобрать путь данных внутри нейросети: от сырого текста до финального распределения вероятностей.
Токенизация: алфавит языковых моделей
Нейросети не умеют работать с буквами напрямую. Они принимают на вход только числа. Первым этапом взаимодействия текста с моделью является токенизация — процесс нарезки входной строки на базовые единицы, называемые токенами, и присвоение каждому токену уникального числового идентификатора (ID).
Современные LLM (Large Language Models) не используют пословную токенизацию, так как это потребовало бы бесконечного словаря для всех возможных словоформ, опечаток и неологизмов. Посимвольная токенизация тоже неэффективна: символ несет слишком мало смысла, а длина последовательности для обработки возрастает многократно. Индустрия пришла к компромиссу — субмодельным алгоритмам, самым популярным из которых является BPE (Byte-Pair Encoding).
Алгоритм BPE работает по принципу частотного сжатия. Изначально словарь состоит из базовых символов (байтов). Затем алгоритм сканирует огромный обучающий корпус текста и находит самую частую пару соседних символов. Например, если e и r часто стоят рядом, они объединяются в новый токен er. На следующем шаге er может объединиться с t, образуя ert, и так далее. Процесс повторяется, пока словарь не достигнет заданного размера (обычно от 50 000 до 200 000 токенов).
В результате частые слова становятся едиными токенами. Слово «apple» может быть одним токеном. А вот редкое слово или опечатка, например «unbelievablly», разобьется на части: «un», «believ», «abl», «ly».
Этот механизм объясняет многие известные ограничения LLM. Например, модели часто плохо справляются с задачами на подсчет букв в слове или анаграммами. Если слово «strawberry» представлено в словаре модели как один неделимый токен с ID 45902, модель физически не «видит» его внутреннего состава и не знает, сколько в нем букв «r», пока не задействует дополнительные вычислительные ресурсы для посимвольного анализа. Аналогичная проблема возникает с числами: если числа бьются на токены непредсказуемо (например, 3801 как «38» и «01», а 3802 как «3», «80», «2»), модели крайне сложно научиться арифметике в столбик.
Эмбеддинги: перевод чисел в геометрию смыслов
Получив последовательность ID токенов, модель должна понять их смысл. Числовой ID — это просто индекс в словаре, он не содержит информации о том, что токен «собака» (ID 104) по смыслу ближе к токену «щенок» (ID 890), чем к токену «холодильник» (ID 5002).
Для решения этой задачи используется слой эмбеддингов (Embeddings). Это гигантская таблица поиска (lookup table), где каждому токену из словаря соответствует плотный вектор фиксированной размерности (в современных моделях это от 4096 до 12288 чисел).
Векторное пространство обучается таким образом, чтобы семантически близкие понятия находились геометрически рядом. Если мы возьмем векторы слов и измерим косинусное расстояние между ними, то угол между векторами «король» и «монарх» будет минимальным. Более того, эти пространства улавливают сложные смысловые отношения, что выражается в классическом примере векторной арифметики:
Здесь — это многомерный вектор соответствующего слова. Вычитая гендерный компонент «мужчина» и добавляя «женщина», мы смещаемся в ту область многомерного пространства, где находится концепт королевы.
!Визуализация семантического пространства и векторной арифметики
Однако у статических эмбеддингов есть фатальный недостаток: они не учитывают контекст. Токен «замок» получит один и тот же вектор независимо от того, идет ли речь о дверном замке или о средневековом строении. Чтобы решить проблему многозначности и связать слова друг с другом, архитектуре потребовался новый механизм.
Трансформер: отказ от последовательной обработки
До 2017 года стандартом для работы с текстом были рекуррентные нейронные сети (RNN) и их вариации (LSTM). Они читали текст строго слева направо, слово за словом, обновляя свое внутреннее скрытое состояние. Это создавало две проблемы. Во-первых, модель забывала начало длинного предложения к моменту, когда дочитывала его до конца (проблема исчезающего градиента). Во-вторых, последовательная природа алгоритма делала невозможным параллельное вычисление на GPU: нельзя обработать пятое слово, пока не обработано четвертое.
Публикация статьи «Attention Is All You Need» исследователями из Google перевернула индустрию. Архитектура Transformer отказалась от рекуррентности. Она принимает всю последовательность токенов одновременно и обрабатывает их параллельно.
Оригинальный Трансформер состоял из двух частей: Энкодера (читает исходный текст) и Декодера (генерирует перевод). Современные генеративные модели (GPT, Claude, Llama) — это архитектуры Decoder-only. Они состоят из стопки одинаковых слоев-декодеров, задача которых — постепенно обогащать векторы токенов контекстом, чтобы на выходе последнего слоя предсказать следующий токен.
Поскольку Трансформер читает все слова одновременно, он изначально не знает порядка слов. Фразы «кот съел мышь» и «мышь съела кота» для базового слоя выглядели бы одинаково. Чтобы сохранить информацию о порядке, к эмбеддингу каждого токена перед началом обработки прибавляется позиционное кодирование (Positional Encoding) — специальный вектор, содержащий математическую подпись позиции токена в последовательности.
Механизм внутреннего внимания (Self-Attention)
Сердце Трансформера — механизм внутреннего внимания. Именно он позволяет модели динамически изменять вектор слова «замок» в зависимости от того, стоят ли рядом слова «ключ» или «рыцарь».
Для каждого токена в последовательности модель создает три новых вектора путем умножения исходного эмбеддинга на три разные обучаемые матрицы весов:
Процесс вычисления внимания можно сравнить с поиском в архиве. Токен формирует Запрос (), который сравнивается с Ключами () всех остальных токенов в предложении. Сравнение происходит через скалярное произведение векторов: чем больше векторы совпадают, тем выше итоговый балл (attention score).
Формула механизма внимания выглядит следующим образом:
Разберем каждый элемент:
!Матрица внутреннего внимания в предложении
Если мы обрабатываем фразу «Банк выдал кредит, хотя банк реки был размыт», механизм внимания для первого слова «Банк» выдаст высокие веса для токенов «выдал» и «кредит». Вектор первого «Банка» впитает в себя часть значений этих финансовых терминов. Для второго слова «банк» высокие веса получат «реки» и «размыт». В результате, на выходе из слоя внимания, у нас будут два совершенно разных вектора для двух одинаковых слов. Контекст растворился в геометрии.
Multi-Head Attention (Многоголовое внимание)
Одного механизма внимания недостаточно. Токену нужно одновременно обращать внимание на разные аспекты текста: грамматику (какое слово является сказуемым к этому подлежащему?), семантику (какой это тип объекта?), тональность (это сарказм?).
Поэтому Трансформер использует Multi-Head Attention. Исходный вектор токена расщепляется на несколько частей (голов), например, на 32 или 64 головы. Каждая голова имеет свои собственные матрицы для создания и выполняет операцию внимания независимо. Одна голова может выучить связи между местоимениями и существительными, другая — следить за закрытием кавычек в коде. В конце результаты работы всех голов конкатенируются (склеиваются) обратно в единый вектор.
Внутренняя анатомия слоя: сети прямого распространения
Механизм внимания — это способ перемещения информации между токенами. Но где модель хранит свои фактические знания? Где записано, что столица Франции — Париж, а print() в Python выводит текст на экран?
После того как векторы обогатились контекстом через Self-Attention, они проходят через полносвязную нейронную сеть прямого распространения (Feed-Forward Network, FFN). В архитектуре Трансформера FFN применяется к каждому токену индивидуально и независимо.
!Архитектура блока Декодера Трансформера
FFN состоит из двух линейных преобразований с нелинейной функцией активации (чаще всего используется GELU или SwiGLU) между ними. Первый слой FFN обычно расширяет размерность вектора в 4 раза (например, с 4096 до 16384), а второй слой сжимает его обратно до 4096.
Исследователи интерпретируют FFN как гигантскую память типа «ключ-значение» (Key-Value memory). Первый, расширяющий слой действует как детектор паттернов: он проверяет наличие определенных концепций во входящем векторе (например, «видит ли вектор запрос о столицах Европы?»). Если паттерн найден, активируются определенные нейроны. Второй, сжимающий слой действует как генератор ответа: он добавляет в вектор токена нужную информацию (векторное представление концепта «Париж»).
Чтобы сигнал не затухал при прохождении через десятки таких слоев (в GPT-3 их 96, в более новых моделях счет идет на сотни), используются Residual Connections (остаточные связи). Вектор, входящий в блок внимания или FFN, прибавляется к вектору, выходящему из него. Это позволяет информации беспрепятственно течь от первых слоев к последним. Также применяется Layer Normalization — нормализация значений вектора, предотвращающая неконтролируемый рост чисел.
Генерация: от векторов обратно к словам
Пройдя через все слои Трансформера, вектор последнего токена в последовательности содержит в себе квинтэссенцию всего предшествующего контекста. Теперь эту многомерную математическую репрезентацию нужно превратить в конкретное предсказание.
Вектор последнего токена умножается на матрицу, обратную слою эмбеддингов. Эта операция проецирует вектор размерности 4096 в вектор размером со весь словарь модели (например, 100 000 значений). Полученные сырые числа называются логитами (logits). Каждый логит соответствует одному токену из словаря и показывает степень уверенности модели в том, что именно этот токен должен идти следующим.
Чтобы превратить логиты в вероятности, к ним применяется функция softmax. На выходе получается распределение, где сумма всех вероятностей равна 100%. Например:
На этом этапе вступает в игру параметр температуры (Temperature), с которым часто сталкиваются пользователи API. Температура математически масштабирует логиты до применения softmax. При температуре 1.0 распределение остается оригинальным. При температуре близкой к 0, разрыв между вероятностями искусственно увеличивается, и модель почти всегда выбирает самый вероятный токен (жадный поиск, детерминированный ответ). При высокой температуре (например, 0.8 или 1.2) вероятности сглаживаются, давая шанс менее очевидным токенам, что делает текст более креативным, но повышает риск галлюцинаций.
Выбранный токен добавляется к исходной последовательности, и весь этот колоссальный вычислительный процесс — от токенизации до финального softmax — запускается заново для предсказания следующего шага. Авторегрессионная природа современных LLM означает, что модель пишет текст точно так же, как мы читаем: шаг за шагом, опираясь на всё, что было сказано ранее. Понимание этой механики является ключом к эффективному промпт-инжинирингу и разработке сложных систем, где контекст модели нужно контролировать программно, что станет основой для нашей работы с Model Context Protocol в дальнейших главах.