Мы живём в эпоху больших языковых моделей — инструментов вроде 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 квадратичный. Есть KV-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 позволяют эффективнее расходовать память во время обучения и инференса.
Возможно, скоро все оптимизации станут настолько обычными, что разработчики будут использовать их «из коробки», даже не задумываясь о сложности происходящего под капотом.