Мы живём в эпоху больших языковых моделей — инструментов вроде ChatGPT, Gemini, Claude, которые поражают своими способностями: они пишут тексты, отвечают на сложные вопросы, генерируют код и даже ведут осмысленные диалоги. Но задумывались ли вы, как им удаётся не просто понимать отдельные фразы, но и удерживать смысл длинных документов, многочасовых бесед или даже целых книг?
В статье разберём путь от понимания человеческого восприятия до современных оптимизаций механизма внимания в LLM.
Сложность человеческой речи
Прежде чем погружаться в технические детали, сначала — про масштаб задачи.
За кажущейся легкостью, с которой мы общаемся каждый день, скрывается поразительная сложность. Человеческая речь — результат миллионов лет эволюции. Сейчас мы, не задумываясь, жонглируем грамматическими правилами, улавливаем тончайшие оттенки значений слов — семантику, понимаем слова в зависимости от ситуации — контекста. Мы распознаем иронию, сарказм, читаем между строк, улавливая подтекст. Морфология, синтаксис, семантика, прагматика — все эти слои переплетены в единую ткань речи. Наш мозг выполняет эту колоссальную вычислительную задачу практически мгновенно, позволяя нам не просто обмениваться информацией, но и понимать друг друга на глубоком уровне.
И мы захотели научить машину справляться с этой невероятно сложной задачей.
Эффект коктейльной вечеринки
Представьте: вы на шумной вечеринке. Вокруг играет музыка, смеются люди, ведутся десятки разговоров. Но когда ваш друг начинает что-то рассказывать, ваш мозг автоматически настраивается на его голос, фокусируется именно на этой «частоте». Остальные звуки становятся фоном.
Это явление, известное как «эффект коктейльной вечеринки», — яркая демонстрация одной из способности нашего мозга: внимания.
Что же происходит в этот момент? Мозг не просто пассивно воспринимает все звуки. Он активно управляет своим восприятием. Внимание работает как мощный фильтр: оно не блокирует другие звуки физически, но позволяет нам избирательно усилить релевантный сигнал — голос собеседника — и подавить или проигнорировать все остальное, что мешает пониманию. Мы не пытаемся обработать каждый звук с одинаковой интенсивностью; вместо этого мы динамически распределяем наши когнитивные ресурсы, фокусируясь на том, что важно для текущей задачи — поддержания диалога. Эта способность фокусироваться, отфильтровывать ненужное и сконцентрироваться на главном — не просто трюк восприятия. Это фундаментальный механизм, позволяющий нам ориентироваться в сложном мире, эффективно обрабатывать информацию и не утонуть в ее бесконечном потоке. И именно этот принцип — избирательность, фокусировка на важном — окажется ключевым, когда мы перейдем к тому, как машины учатся понимать язык, особенно когда речь идет о длинных и сложных текстах.
Что такое Attention в нейронных сетях
Подобно человеческому мозгу, большие языковые модели используют механизм внимания (Аttention) для обработки информации.
Вот слово «человек». Само по себе это очень абстрактное понятие:
Что это за человек?
Какие у него характеристики?
В каком он контексте?
Векторное представление одиночного токена «человек» малоинформативно.
Но когда мы читаем: «Загадочный человек в чёрной шляпе медленно шёл по улице», картина меняется. Теперь наш «человек» обретает характеристики:

Каждый токен отправляет «поисковый запрос» к другим токенам в контексте. Другие токены отвечают, насколько они релевантны и полезны. Векторное представление нашего «человека» обогащается информацией от соседних слов.
Механизм работы Attention
Query (запрос) — «что ищет токен».
Key (ключ) — «какую информацию предлагает токен».
Value (значение) — «какой информацией делится токен».

Токен «человек» сравнивает свой запрос с ключами всех остальных токенов и получает от них релевантную информацию.
Проблемы классического Attention
Квадратичная сложность
Здесь начинаются технические сложности. В классическом Аttention каждый токен смотрит на все остальные токены. Для последовательности из n токенов это даёт нам сложность O(n²).
Последствия квадратичной сложности:
Ограниченное контекстное окно (исторически ~16K токенов);
Огромные требования к вычислительным ресурсам;
Невозможность обработки длинных документов;
Высокая стоимость обучения и инференса.
Кэширование как первая оптимизация
Первая важная оптимизация основана на том, что LLM генерируют текст последовательно, токен за токеном, и каждый новый токен смотрит только назад в прошлое, а не в будущее.
Это позволяет кэшировать уже вычисленные ключи (Keys) и значения (Values). Вместо пересчета всего с нуля, мы переиспользуем KV-cache.

PagedAttention: виртуализация памяти для LLM
Проблема фрагментации
Разработчики PagedAttention обнаружили шокирующую статистику: до 50% дорогой видеопамяти тратилось впустую из-за фрагментации.

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

Расчёт потребления памяти
Для современной модели KV-cache на один токен требует:
2 вектора × 5120 размерность × 40 слоев × 2 байта (FP16) = 800 КБ/токен
При резервировании под 2000 токенов: 1.6 ГБ видеопамяти только на один запрос!

Решение через виртуализацию
PagedAttention применил подход из операционных систем — виртуализацию памяти:
Логическое представление: [Токен1][Токен2][Токен3][Токен4]...
Физическое размещение: [Блок A][Блок C][Блок B][Блок D]...

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

Выделение происходит по мере необходимости.
Блоки можно переиспользовать между запросами.

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

Такой подход позволяет при параллельном сэмплировании переиспользовать одинаковые начальные последовательности, а различающиеся части отображать в разные блоки. Для этого мы используем vLLM. Это первое решение, которое использует PagedAttention. Мы тоже этим пользуемся — это решает проблему с пропускной способностью.
Infinite Attention: обработка длинных контекстов
Далее рассмотрим, что происходило с обработкой длинных контекстов.
На заре нейросетей было ограничение где-то в 16 тысяч токенов. Постепенно допустимое число токенов возрастало.

Сейчас у топовых моделей контекстное окно может достигать 200 тысяч токенов. Однако, напомню, что attention квадратичный. Есть value cache, который немного снижает это ограничение, но всё равно нужны новые идеи.
Концепция сегментированного внимания
Google предложил элегантное решение, вдохновленное тем, как люди читают книги. Мы же не пытаемся держать в голове все главы одновременно. Мы читаем по одной главе, запоминаем суть, и переходим к следующей.


Алгоритм работы:
Сегментация: длинная последовательность делится на сегменты ограниченного размера.
Локальный attention: внутри каждого сегмента работает классический attention.
Сжатие в память: после обработки сегмента остается «сжатое» представление.
Преемственность: следующий сегмент может обращаться к памяти предыдущих.
Эта идея (которая, кстати, представлена в OpenSource) позволяет обрабатывать контексты практически неограниченной длины, сохраняя линейную сложность.
Есть и другие подходы, о них дальше.
RAG vs Cache-Augmented Generation
Классический RAG
Retrieval Augmented Generation стал стандартом для подключения внешних знаний:
База знаний разбивается на чанки.
Каждый чанк векторизуется.
По запросу ищутся релевантные чанки.
Найденная информация подставляется в контекст.

У RAG есть ограничения:
Сложности с таблицами и структурированными данными.
Дополнительная инфраструктура.
Потенциальная потеря контекста между чанками.
Agentic RAG
Альтернативный подход для небольших баз знаний. Мы описываем модели и что знаем про предметную область, и даём ей возможность самой понять, в какой документ заглянуть:


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

Преимущества:
Использование нативных механизмов LLM
Отсутствие потери контекста
Простота реализации
Переиспользование кэша между запросами
Cache-Augmented Generation
Есть ещё идея — использовать key-value кэш. Если база знаний небольшая, мы её векторизуем, запоминаем, и переиспользуем кэш от запроса к запросу. Это позволяет использовать нативные механизмы attention. Модель сама извлекает нужные токены. Это хорошая идея, и, возможно, она получит больше распространения. Подход называется cache-augmented generation. Он нативный, но работает только с небольшими базами знаний. Если документов много — становится затратно.

Преимущества CAG:
Скорость для повторных запросов
Снижение нагрузки
Экономия ресурсов
Недостатки CAG: кэш требует места и может устаревать.
DeepSeek V3: революция в сжатии KV-cache
DeepSeek поставил вопрос ребром: а действительно ли нам нужны все 5120 чисел для эффективного представления ключей и значений?
Ответ оказался: нет! Они вспомнили про латентные пространства из автокодировщиков.

Процесс:
Сжатие: keys и values проецируются в латентное пространство (5120 → 64 размерности)
Кэширование: сохраняются только сжатые представления
Восстановление: при необходимости векторы восстанавливаются одним матричным умножением
Результат: сокращение потребления видеопамяти в 80 раз без существенной потери качества!
Экономический эффект тоже существенный: пропускная способность повысилась на 600%, значительно снизилось стоимость обучения (хвастались, что DeepSeek V3 обучили за $5 млн), а требования к инфраструктуре существенно ниже.
Выводы
Эволюция механизма attention демонстрирует зрелость области машинного обучения. Современные модели способны обрабатывать огромные контексты благодаря таким техникам, как Infini-Attention. А PagedAttention и Multi-head Latent Attention позволяют эффективнее расходовать память во время обучения и инференса .
Возможно, скоро все оптимизации станут настолько обычными, что разработчики будут использовать их «из коробки», даже не задумываясь о сложности происходящего под капотом.