Опубликовано: 08.04.2026
Введение
Цель этой статьи — познакомить читателя с архитектурой Generative Pretrained Transformer, лежащей в основе современных языковых моделей.
Многие статьи, посвященные этой теме, страдают тем, что либо уходят в сплошную математику, но при этом недостаточно связно описывают общий вид архитектуры, либо описывают архитектуру слишком поверхностно и образно, что опять же не даёт возможности понять конструкцию как целое.
В этой статье я постараюсь дать достаточно подробное описание, что собой представляет «пайплайн» трансформера: как данные со входа проходят по этапам модели и приходят на выход. Я опишу упрощенную схему decoder-only трансформера, пропуская или сокращая те части, которые не принципиальны для понимания общего вида.
Некоторый базовый глоссарий:
- LLM (Large Language Model) — большая языковая модель. Искусственная нейросеть, обученная на огромных массивах текста понимать и генерировать человеческий язык. Её базовая задача — предсказать наиболее вероятное продолжение последовательности (текста).
- Текстовые vs мультимодальные модели — классические LLM работают только с текстом. Однако архитектура, лежащая в их основе, оказалась универсальной: мультимодальные модели используют ту же технологию для обработки изображений, аудио и видео. Достигается это за счет того, что картинка или звук предварительно превращаются в аналогичный формат векторов, что и текстовые токены, после чего модель обрабатывает их своими стандартными слоями.
- Transformer — тип архитектуры нейросети, представленный в 2017 году. В отличие от предыдущих поколений сетей, он способен «смотреть» на весь контекст сразу помощью механизма внимания (attention), что кардинально повысило качество работы с контекстом.
- Decoder-only — архитектурный подход, при котором трансформер состоит только из декодера (блока генерации). Такая модель читает текст строго слева направо и предсказывает следующий токен. На каждом шаге она видит всё, что слева, но не видит того, что справа (так как модель еще не сгенерировала продолжение). Именно эта схема используется в большинстве современных генеративных моделей (GPT, Gemini, Claude).
- GPT (Generative Pretrained Transformer) — как архитектурный паттерн, это синоним понятия decoder-only transformer. Как конкретная реализация — семейство моделей от OpenAI, которое в 2018–2020 годах показало перспективы архитектуры трансформера и положило начало буму ИИ.
- BERT — принципиально иной (энкодерный) тип трансформера. В отличие от GPT, он смотрит на весь текст в обе стороны (bidirectional) и обычно применяется не для генерации текста, а для понимания уже существующих текстов: классификации, поиска ответов в тексте, создания эмбеддингов для поиска.
- Токен — минимальная единица текста, с которой работает модель. Может быть отдельным словом, частью слова, символом, или фрагментом на границе слов. Например, фразу «что она надела» модель может увидеть как
что| она| на|дела. - Эмбеддинг — векторное представление токена, числовой «отпечаток смысла». Такие вектора имеют размерность порядка нескольких сотен или даже тысяч. Например, длина эмбеддинга у Qwen3.5 равна 4096.
Общий вид модели

Языковая модель читает входной поток токен за токеном. На рисунке слева показан этот поток токенов, направленный снизу вверх. Языковая модель как бы проматывает мимо себя ленту, на которой находятся токены. Несколько токенов модель «уже увидела» и в данный момент видит очередной токен — для неё он является «текущим», «последним», «актуальным».
Текущий увиденный токен посредством входной матрицы преобразуется в векторное представление, называемое эмбеддинг.
Это векторное представление проходит через множество слоёв трансформера, в каждом из которых производится чтение вектора, обработка, получение некоторого нового вектора и суммирование его к исходному вектору. Затем результат подаётся на следующий слой. В схеме показано как это происходит:
- Блок Self-attention читает вектор, обрабатывает, суммирует результат к исходному, что отмечено знаком «плюс» на диаграмме.
- Затем аналогично поступает блок FFN.
- Затем еще один блок self-attention.
- Затем еще один блок FFN.
- И так далее.
Совокупность из блока Self-attention и блока FFN называется одиночным слоем трансформера. Языковая модель состоит из множества таких слоёв. Типично в компактных моделях, доступных для запуска на потребительском оборудовании, — порядка пары десятков слоёв; в крупных облачных моделях — многие десятки или 100+.
Таким образом проходя по слоям, вектор обогащается «смыслом» и из вектора текущего токена в начале этой цепи превращается в векторное представление следующего токена к концу этой цепи.
После всех слоёв вектор попадает на матрицу Unembedding, которая конвертирует этот «смысловой вектор» в массив чисел, описывающих уровень сходства вектора для всех возможных токенов модели. Затем тот массив чисел нормализуется функцией Softmax, чтобы получить вероятности относительно единицы.
Если модель в данный момент генерирует текст, то далее используется механизм выборки токена (Sampling), чтобы выбрать один из наиболее вероятных токенов в качестве следующего. На этом этапе в генерацию текста вносится элемент случайности, используя генератор случайных чисел, а также параметры Temperature, Top-k и Top-p. Регулируя эти параметры, можно получать более стабильные или более «креативные» и изменчивые результаты. После этого выбранный токен подаётся модели на вход и становится её текущим токеном. Так пошагово модель генерирует токены один за другим.
Если же модель не генерирует текст, а просто читает уже существующий текст перед тем как начать отвечать (читает промпт), то всё, что выше было сказано относительно матрицы Unembedding и далее — не актуально. Модель читает информацию токен за токеном и пропускает через свои слои, чтобы заполнить KV-cache. (Подробнее про кэш будет ниже.) Когда модель прочитала текст, она начинает генерировать его продолжение.
Генерация обычно продолжается, пока модель не сгенерирует специальный токен конца текста, который означает «конец хода, я закончила отвечать», либо пока не сработает внешнее ограничение на число сгенерированных токенов.
Residual stream (остаточный поток)
Описанный выше процесс прибавления значения к значению вектора предыдущего шага формирует понятие остаточный поток (residual stream). На рисунке этот поток обозначен утолщенной линией. Это понятие — весьма важное для понимания архитектуры LLM.
- Это вектор, который «протягивается» сквозь все слои трансформера и представляет собой сумму эмбеддинга токена и выходов всех промежуточных вычислений. Все блоки Self-attention и FFN читают из этого потока и дописывают в него, а не перезаписывают его.
- Остаточный поток — это линейный канал: все слои просто прибавляют к нему свои выходы. Поэтому его можно мыслить как «память» или «шину данных», через которую слои обмениваются сигналами.
- Ограниченная «пропускная способность»: у каждого слоя гораздо больше «вычислительных размерностей» (нейронов FFN, голов внимания), поэтому слои вынуждены сжимать информацию и передавать её в суперпозиции в этом относительно узком канале.
- В mechanistic interpretability используется подход Logit Lens: поскольку информация в остаточном потоке линейна и просто аддитивно накапливается, мы можем взять вектор из середины сети (например, после 10-го слоя из 40) и применить к нему финальную матрицу Unembedding, чтобы посмотреть, о чем модель «думает» на данном слое.
Почему в этом потоке чередуются блоки Self-attention и FFN:
- Блок self-attention связывает смысл с контекстом — со всеми токенами, которые модель видела до текущего.
- Блок FFN работает как подобие ассоциативной памяти модели: видя некоторый «смысл-ключ», FFN реагирует на него и вносит в поток «смысл-значение» извлеченное из своей «памяти». Именно такую функциональную интерпретацию для этого блока дают некоторые работы. Если же описывать более абстрактно, этот блок вносит «нелинейный фактор» в вычисления, что позволяет модели формировать «глубокие и тонкие» взаимосвязи смыслов. Простое перемножение матриц без использования нелинейных функций на это было бы не способно.
Можно сказать, что модель чередует фазы «оглянись и сравни новую информацию с уже увиденной» и «обдумай, что это означает».
Self-attention
Механизм self-attention (самовнимание) - это ключевая инновация, после которой начался бум развития ИИ. Не буду лишний раз углубляться в истоки этого прорыва. Думаю, все знают, что поворотной точкой стала публикация работы «Attention Is All You Need» исследовательского центра Google.
Здесь я не буду подробно описывать сам механизм и математику вычислений, потому что цель — дать общий вид устройства модели.
Когда очередной вектор поступает в блок Self-attention, внутри него используются предобученные матрицы Wq, Wk и Wv, чтобы получить из входного вектора векторы Q, K и V. Значение Q нам требуется только на данном шаге вычислений, а вот значения K и V потребуются не только для текущего, но и для всех последующих. Поэтому они записываются в блок, обозначенный на рисунке как KV-cache.
Таким образом в этот кэш записывается информация о каждом значении остаточного потока, которые «увидел» блок самовнимания, но не напрямую, а в виде векторов K и V.
Исходя из всех увиденных значений K и V и текущего значения Q, блок формирует своё выходное значение. Именно таким образом модель учитывает весь увиденный ранее контекст, а не просто текущий токен.
Точная математика, как я уже говорил, за пределами данного обзора, но я кратко опишу, что это означает структурно:
- K — это «ключ», «на что я откликаюсь».
- V — это «значение», «что я могу дать».
- Q — это «запрос», «что меня интересует».
На каждом новом шаге блок Self-attention формирует очередной запрос Q, чтобы посмотреть, насколько предыдущие шаги работы модели, сохраненные в KV-кэше, «откликаются» на этот запрос через их ключи. А затем использует предоставленные значения V пропорционально силе «отклика» каждого.
(Весьма занятно, хотя математически весьма закономерно, что текущий обрабатываемый вектор также проверяется на то, «как я откликаюсь, и что я могу дать» — модель проверяет «все увиденные значения, в том числе и текущее», а не «все увиденные до этого».)
FFN (Feedforward Network)
Feedforward Network, также известная как MLP: многослойный перцептрон. Это собственно то, что вы можете увидеть в любой базовой статье на тему того, «что такое искусственная нейросеть»: en.wikipedia.org/wiki/Feedforward neural network.
В нашем случае FFN принимает на вход вектор из остаточного потока, пропускает через свои слои и на выходе формирует вектор той же размерности. Внутри FFN используются нелинейные функции активации нейронов. В подробности здесь я погружаться не буду.
Position Encoding
Чтобы модель учитывала порядок, в котором идут токены, информация о порядке и дистанциях между токенами должна как-то кодироваться. В настоящее время во многих моделях используется RoPE — Rotary Positional Embedding. Его суть в том, что векторы Q и K поворачиваются на угол, пропорциональный порядковому номеру токена. Это происходит непосредственно внутри каждого блока Self-attention. С каждым следующим токеном векторы текущего токена поворачиваются всё дальше. Это позволяет модели «чувствовать расстояние» между токенами.
Чтобы отобразить это на схеме, я нарисовал там блок Position Encoding, который подаёт информацию на вход каждого блока Self-attention. По сути в нашей диаграмме его можно осмыслить как простой счётчик, который указывает насколько нужно повернуть векторы. Если этот блок не рисовать, то нужно держать в уме, что блоки Self-attention хранят внутри себя изменяемое на каждом шаге состояние — число пройденных шагов. А так мы это состояние вынесли на схеме в отдельный видимый блок.
Итого
- Модель отталкивается от текущего («последнего увиденного») токена, пропускает его через пайплайн остаточного потока и приходит к следующему токену. Этот процесс повторяется итеративно.
- Блоки Self-attention нужны для того, чтобы соотнести текущий смысл со смыслами всех предыдущих шагов.
- Сами «смыслы предыдущих шагов» хранятся в KV-cache, который растёт пропорционально длине обработанного текста.
- Еще одним состоянием, которое меняется от шага к шагу, является информация о позиции токена. Способ кодирования этой информации в разных моделях может быть разным, но в наше время часто используется RoPE. Наличие этого изменяемого состояния указано на схеме отдельным блоком.
- На генерацию влияет механизм рандомизированной выборки токенов: чтобы модель давала вариативные результаты, перед выдачей очередного токена используется сэмплирование с рандомизацией. Глубина рандомизации регулируется специальными параметрами.
- KV-cache, позиционное кодирование и генератор псевдослучайных чисел для выборки токенов — это изменяемые состояния модели в ходе генерации, и это единственные изменяемые состояния.
- Блоки FFN работают как аналог заполненной во время обучения ассоциативной памяти, через которую модель «видит ключ и вспоминает что-то важное относительно этого ключа».
Также важно упомянуть оценки времени работы и затрат памяти:
- KV-cache растёт линейно от количества обработанных токенов, таким образом затраты по памяти выглядят как
O(n)от количества токенов. - На каждом шаге блок внимания производит вычисления с учётом всех предыдущих шагов, таким образом затраты по времени на обработку одного токена также представляют собой
O(n)от количества обработанных токенов. Остальные блоки модели имеют константное время работы. - Как следствие предыдущего, суммарное время работы — квадратично от числа токенов (длины генерации):
O(n*n). При небольшой длине генерации квадратичная зависимость может быть не заметна, так как блоки внимания, в которых она проявляется, составляют только одну из частей общего конвеера вычислений. Зависимость более похожа на линейную. При существенной длине генерации, квадратичность становится заметна.
Что важное упущено в схеме, но потребуется, если вы захотите погрузиться далее
- Внутри каждого блока Self-attention работает не один механизм внимания, а несколько параллельных, результаты которых затем комбинируются через отдельную матрицу. Это называется multi-head attention.
- Значения блоков Self-attention и FFN проходят нормализацию перед суммированием в остаточный поток. Я не стал указывать это на диаграмме, оставив это «внутренней кухней» блоков.
- Какая именно функция активации нейронов используется внутри FFN — весьма важно для качества модели. Но так как мы тут не погружались в детали относительно FFN, я не стал упоминать конкретных функций.
- При использовании MoE (Mixture-of-Experts) в каждом слое блок FFN является не монолитным («плотным», dense), а представляет собой множество отдельных «экспертов»: специализированных перцептронов, из которых для обработки токена выбирается только часть. А вот Self-attention остаётся плотным всегда.
- Хотя я и писал выше, что модель на этапе чтения промпта (prefill) обрабатывает информацию «токен за токеном», на самом деле на этапе prefill модель смотрит «на все токены промпта сразу» и заполняет весь KV-cache разом. Однако это чисто математическая, внутренняя разница. С точки зрения ментальной модели — результат тот же самый. O-большое по времени работы также аналогичное: время обработки промпта квадратично от его длины.
- Вместо блоков Self-attention могут использоваться иные способы работы с сохранённым состоянием. Сейчас активно развивается направление гибридных моделей, где часть слоёв имеет блоки Self-attention, а часть слоёв - иной механизм работы с состоянием, например, Mamba-2. При использовании Mamba-2 нет KV-кэша, который растёт линейно от длины обработанного текста, а вместо этого хранимое состояние имеет фиксированный размер. В классической реализации трансформера мы сохраняем в память всё, а потом на каждом шаге берём только то, что актуально. В блоках Mamba-2 модель на каждом шаге взвешивает, «насколько сильно требуется обновить память: на что-то важное мы сейчас смотрим, или на несущественное».
Смотрите также: