中文翻译暂不可用,显示俄语原文。

Что такое "lost in the middle" и как это связано с attention sink?

Краткий тезис

Lost in the middle — это феномен, при котором большие языковые модели (LLM) лучше запоминают информацию из начала и конца длинного контекста, но хуже — из середины. Это напрямую связано с attention sink (скоплением внимания на первых токенах) и recency bias (предпочтением последних токенов). Понимание этого эффекта критически важно для проектирования RAG-систем, так как неправильный порядок чанков может снизить качество ответа. Решения включают переупорядочивание контекста, retrieval|contextual retrieval, Attention|multi-query attention и иерархическое суммирование (RAPTOR).


1. Определение lost in the middle

Lost in the middle — это эмпирически наблюдаемый эффект, впервые систематически описанный в статье Liu et al. (2023) «Lost in the Middle: How Language Models Use Long Contexts». Суть: если в промпт подаётся длинный контекст (например, несколько документов), модель с высокой вероятностью извлечёт факты, расположенные в самом начале или в самом конце контекста, и с низкой — из середины.

Это не баг, а следствие архитектуры трансформера и механизма self-attention. Внимание модели неравномерно распределяется по позициям токенов, что приводит к двум основным эффектам: attention sink (первые токены) и recency bias (последние токены). Вместе они создают «провал» в середине.


2. Экспериментальное подтверждение (статья Liu et al.)

Авторы провели серию экспериментов с разными LLM (GPT-3.5-Turbo, Llama 2, MPT) на задаче multi-document question answering. В контекст помещалось от 10 до 30 документов, и модель должна была ответить на вопрос, ответ на который содержался ровно в одном документе. Позиция этого документа варьировалась.

Результаты:

Позиция релевантного документаТочность (примерно)
1-й (начало)~80%
5-й (середина)~40%
Последний (конец)~75%

График зависимости точности от позиции имеет U-образную форму. Эффект усиливается с ростом общего числа документов и длины контекста.


3. Механизм attention sink (первые токены)

Attention sink — это явление, при котором модель выделяет непропорционально много внимания первым токенам последовательности, даже если они не несут смысловой нагрузки (например, специальные токены <s>, <bos> или первые слова). Это связано с тем, что в начале последовательности ещё нет предшествующего контекста, и модель «впитывает» информацию в эти позиции как в резервуар.

В работе Xiao et al. (2023) «Efficient Streaming Language Models with Attention Sinks» показано, что attention sink возникает из-за того, что softmax-нормализация внимания вынуждена распределять вес между всеми токенами, и первые токены получают избыточный вес, так как они «видят» все последующие.

В контексте lost in the middle это означает: если релевантный документ находится в середине, он конкурирует с attention sink на первых позициях и recency bias на последних, и проигрывает.


4. Recency bias (последние токены)

Recency bias — это склонность модели лучше запоминать информацию, расположенную ближе к концу контекста. Это естественное свойство рекуррентных и трансформерных архитектур: последние токены имеют наибольшее количество обновлений скрытого состояния и «видят» весь предыдущий контекст через attention.

В трансформерах последние токены могут агрегировать информацию из всего контекста, но при этом они также подвержены эффекту «забывания» середины из-за ограниченной ёмкости внимания и численной точности.


5. Связь lost in the middle и attention sink

Lost in the middle — это макроскопический эффект, наблюдаемый на уровне использования контекста моделью. Attention sink — один из микроскопических механизмов, который его вызывает. Дополнительно вклад вносит recency bias. Вместе они формируют U-образную кривую точности.

Формально можно записать распределение внимания по позициям как:

Attention(позиция i) ≈ α · δ(i = 1) + β · δ(i = N) + γ · f(i)

где α — вес attention sink, β — вес recency bias, γ — равномерная компонента, а f(i) — некоторая функция, затухающая к середине. Для длинных контекстов α и β доминируют.


6. Влияние на RAG-системы

В RAG контекст формируется из нескольких чанков, полученных от retriever. Если порядок чанков не оптимизирован, релевантный чанк может оказаться в середине и быть проигнорирован LLM. Это приводит к:

  • Hallucination (модель выдумывает ответ, не найдя факта)
  • Неполным ответам (модель использует менее релевантные чанки из начала/конца)
  • Снижению faithfulness (верности фактам)

Особенно критично для Agentic RAG, где агент может многократно обращаться к контексту и принимать решения на основе извлечённой информации.


7. Решение: переупорядочивание контекста

Самый простой способ — явно поместить наиболее релевантные чанки в начало или конец контекста. Для этого используется re-ranking после retrieval: сначала получаем топ-k чанков, затем сортируем их по убыванию релевантности и помещаем самый релевантный первым (или последним, в зависимости от эмпирики).

Пример кода на Python:

def reorder_chunks(chunks, query, reranker):
    # chunks: list of (text, score) from retriever
    # reranker: модель для переранжирования (например, cross-encoder)
    scores = reranker.predict([(query, chunk[0]) for chunk in chunks])
    sorted_chunks = sorted(zip(chunks, scores), key=lambda x: x[1], reverse=True)
    # помещаем лучший чанк в начало
    return [chunk for chunk, _ in sorted_chunks]

Недостаток: не решает проблему полностью, если контекст очень длинный (десятки чанков).


8. Решение: contextual retrieval

Contextual retrieval — это техника, при которой каждый чанк дополняется кратким контекстом (например, названием документа, соседними предложениями) перед подачей в LLM. Это помогает модели лучше понять, где находится информация, и снижает эффект lost in the middle.

Другой вариант — in-context learning с явными указателями: «Информация, которая вам нужна, находится в третьем документе». Но это требует дополнительной разметки.


9. Решение: multi-query attention

Multi-query attention (или parallel context processing) — подход, при котором LLM обрабатывает несколько частей контекста параллельно, а затем агрегирует результаты. Например, можно разбить контекст на сегменты, каждый сегмент подать в модель отдельно (с одинаковым вопросом), а затем объединить ответы через голосование или дополнительный LLM-раунд.

Это напоминает ensemble retrieval, но на уровне генерации. Реализация может быть дорогой (множественные вызовы LLM), но повышает устойчивость к lost in the middle.


10. Решение: RAPTOR и иерархическое суммирование

RAPTOR (Recursive Abstractive Processing for Tree-Organized Retrieval) — метод, при котором документы сначала кластеризуются, затем для каждого кластера генерируется суммаризация, и так рекурсивно строится дерево. При запросе retrieval идёт по дереву, а в контекст попадают как листовые чанки, так и суммаризации верхних уровней.

Это позволяет модели видеть «общую картину» (суммаризации) и детали (листья), причём суммаризации обычно помещаются в начало контекста, что даёт им преимущество attention sink. Таким образом, lost in the middle смягчается за счёт иерархической структуры.


11. Практические рекомендации

ПодходСложностьЭффективностьКогда использовать
ПереупорядочиваниеНизкаяСредняяВсегда как baseline
Contextual retrievalСредняяВысокаяКогда чанки короткие или много документов
Multi-query attentionВысокаяОчень высокаяКритически важные задачи, высокие требования к точности
RAPTORВысокаяВысокаяБольшие корпуса с иерархической структурой

Дополнительно: можно комбинировать подходы, например, переупорядочивание + RAPTOR.


12. Пет-проект для закрепления

Задача Создать простой RAG-пайплайн, который демонстрирует эффект lost in the middle, и реализовать одно из решений.

Инструменты Python, LangChain, FAISS, OpenAI API (или локальная модель), библиотека для эмбеддингов (sentence-transformers).

Шаги:

  1. Создать тестовый корпус из 20 коротких текстов (по 1-2 предложения), каждый содержит уникальный факт (например, «Цвет неба — голубой», «Столица Франции — Париж» и т.д.).
  2. Для каждого запроса (например, «Какая столица Франции?») вручную указать релевантный документ.
  3. Реализовать retrieval (BM25 или эмбеддинги), получить топ-10 чанков.
  4. Сформировать контекст, поместив релевантный чанк на разные позиции (1-я, 5-я, 10-я, 15-я, 20-я).
  5. Для каждой позиции отправить запрос в LLM и оценить, вернула ли модель правильный факт.
  6. Построить график точности от позиции.
  7. Реализовать переупорядочивание (re-ranking) и повторить эксперимент — убедиться, что точность выровнялась.

Ожидаемый результат Вы увидите U-образную кривую на шаге 6 и её сглаживание после переупорядочивания. Это наглядно подтвердит теорию.


13. Связь с другими вопросами

ВопросТема
2Как решаете проблему lost in the middle при работе с длинными контекстами?
5Как оцениваете качество retrieval'а в RAG-системе?
3Какие стратегии chunking'а вы знаете и когда какую применяете?
7Как уменьшаете latency RAG-системы?
10Что такое Self-RAG и когда его использовать?
1Как бы вы спроектировали RAG-систему для 10 000 документов с разной структурой?

14. Навигация


Навигация