Skip to content

Lost in the Middle 中间迷失

五层读懂一个词。这次拆的是:Lost in the Middle--LLM 长上下文的一个硬伤。模型对文档开头和结尾的信息记得好,对中间的信息记得差——呈现 U 型准确率曲线。不是上下文不够长,而是注意力有位置偏差。RoPE 解了「能看多远」的问题,Lost in the Middle 暴露了「看清了没」的真相。


L1 · 一句话点破

Lost in the Middle = LLM 注意力偏爱两端、忽略中间。无论上下文是 4k 还是 128k,模型对**开头(Primacy Bias)和结尾(Recency Bias)**的信息提取准确率高,中间信息准确率断崖式下跌(U 型曲线)。原因是训练数据的位置分布偏差 + 注意力衰减 + 缺乏显式的 long-range 结构提示。有了长上下文窗口 ≠ 能有效利用整个窗口。


L2 · 通俗类比

你读一本 500 页的书,考试时考书的内容:

人的阅读规律

  • 开头(第 1 章):印象深刻(首因效应)
  • 结尾(第 50 章):刚读完,记忆犹新(近因效应)
  • 中间(第 25 章):?不太记得了

LLM 也有同样的毛病

  • 给它 100 页文档,问某段信息
  • 信息在第 1 页:100% 命中
  • 信息在第 50 页:60% 命中
  • 信息在第 90 页:90% 命中
  • U 型曲线:两头高,中间低

举例(Needle-in-a-Haystack 测试):

文档: [200 页废话...] + 关键信息: "北京今天天气晴" + [200 页废话...]

结果(Llama-2-70B, 4k 上下文):
  开头位置: 准确率 95%
  1/4 位置: 75%
  中间位置: 50%
  3/4 位置: 80%
  末尾位置: 95%
  -> 经典 U 型曲线

为什么不是上下文不够的问题

  • 即使上下文窗口 128k,信息在 64k 位置仍然丢失
  • 不是「看不到」,而是「没注意到」
  • 是注意力机制的位置偏向问题,不是容量问题

为什么会有这个偏置

  • 训练数据偏置:预训练文档的重要信息常在开头/结尾(新闻的倒金字塔结构)
  • 注意力衰减:RoPE 的远距离衰减让中间 token 的注意力被两端「压制」
  • 缺乏结构提示:没有章节标记、标题等显式提示,模型难以在长序列中定位

缓解方法

方法思路
重排序关键信息放前面
结构化提示加标题、分段
多轮检索先搜再读
分隔符用特殊 token 标段
位置重置分段独立编码位置

代价

  • 长上下文能力 ≠ 长上下文有效利用率
  • 即使 128k 窗口,有效窗口可能是 32k
  • RAG 仍是长上下文最好的补充

适用

  • 理解 LLM 长上下文的真实能力上限
  • 设计 RAG 和 prompt 策略的指导
  • 评估长上下文模型的基准

L3 · 正经定义

Lost in the Middle:由 Liu et al. 2023 发现并命名的现象。在长上下文信息提取任务中,LLM 的性能随信息在上下文中的位置呈 U 型变化:开头和结尾位置的信息提取准确率高,中间位置准确率显著下降。该现象在多文档问答、键值检索、合成任务中均被验证,且随着上下文长度增加而加剧。

关键发现

  1. U 型曲线:准确率 vs 信息位置呈 U 型
  2. 与上下文长度正相关:上下文越长,中间衰减越严重
  3. 跨模型普遍:GPT-3.5、GPT-4、Claude、Llama 等都有此现象
  4. 非窗口限制:即使信息在窗口内(< 最大长度),仍然迷失

Needle-in-a-Haystack(大海捞针)测试

  • 在长文档的某个位置插入关键信息(needle)
  • 测试模型能否准确找到(提取)
  • 结果验证了 U 型曲线

参考资料

  • 📄 Liu et al., Lost in the Middle: How Language Models Use Long Contexts, TACL 2023
  • 📄 Kamradt, Needle in a Haystack - Pressure Testing LLMs, 2023
  • 📄 Zhao et al., RULER: What's the Real Context Size of Your Long-Context Language Models?, 2024
  • 📄 Hsieh et al., Long Context RAG Performance of LLMs, 2024
  • 🔧 Needle-in-a-Haystack benchmark:https://github.com/gkamradt/LLMTest_NeedleInAHaystack

L4 · 原理深挖

4.1 核心实验

实验设计(Liu et al. 2023):

  • 任务:多文档问答(从多个文档中找到答案)
  • 变量:答案所在文档在上下文中的位置
  • 上下文:10/20/30 个文档,总长度 4k-16k

结果

位置:  1   5   10  15  20
准确率: 72% 68% 55% 65% 70%
       ^                   ^
     Primacy             Recency

GPT-3.5-Turbo-16k 在不同位置的准确率

位置(分位数)准确率
0-10%(开头)72%
10-20%65%
40-50%(中间)45%
80-90%68%
90-100%(末尾)70%

结论:中间位置准确率比两端低 25-30 个百分点。

4.2 为什么会出现 Lost in the Middle

原因 1: 训练数据的位置偏置

  • 新闻/百科文章的重要信息通常在开头(倒金字塔结构)
  • 对话数据的关键回复在末尾(最新消息)
  • 模型学到:开头和结尾的信号更重要

原因 2: 注意力衰减

  • RoPE 等位置编码有远程衰减性质
  • 越远的 token,注意力权重越小
  • 中间 token 离两端都远,被两端 token「压制」
  • 模型的注意力预算被两端消耗,中间不足

原因 3: 缺乏结构线索

  • 长文档没有「目录」或显式位置提示
  • 模型在长序列中难以定位信息
  • 如果加入章节标题、段落编号等结构化标记,现象减轻

原因 4: 位置编码的固有缺陷

  • 绝对位置编码的模型(GPT-3.5)比 RoPE 的模型(LLaMA)更严重
  • 但 RoPE 也不能完全消除
  • 原因:位置编码训练分布的 OOD(训练时短序列,推理时长序列)

4.3 Needle-in-a-Haystack 测试

测试方法

  1. 准备一个长文档(干草堆)
  2. 在某个位置插入一句关键信息(针):"密码是 123456"
  3. 在末尾问:密码是多少?
  4. 测试不同位置、不同上下文长度下的准确率

热力图解读

上下文长度 / 针位置 → (开头 ... 中间 ... 末尾)

4k:   [████████████████████]  全绿
8k:   [████░░░░░░░░░░██████]  中间稍弱
16k:  [████████░░░░░░██████]  中间衰减
32k:  [████████████░░██████]  衰减区扩大
64k:  [████████████░░██████]  持续衰减
128k: [████████████░░██████]  底部最深

跨模型对比(64k 上下文)

模型开头中间末尾
GPT-4-128k98%72%95%
Claude-3-200k99%85%97%
Gemini-1.5-Pro-1M97%78%94%
Llama-3-70B-8k95%65%92%

Claude-3 表现最好:在 200k 上下文中中间也有 85% 准确率,但仍可见 U 型。

4.4 缓解策略

策略 1: 重排序(Reorder)

  • 把最重要/最相关的信息放在开头或结尾
  • 或者让检索结果按相关性排序(最相关排最前/最后)
  • 优点:简单有效
  • 缺点:破坏文档本身的逻辑顺序

策略 2: 结构化提示(Structuring)

文档结构:
[第一章] ... [/第一章]
[第二章] ... [/第二章]

问题: 第二章讲了什么?
  • 用 XML/JSON 标签标记边界
  • 帮助模型定位到特定段落
  • 效果中等

策略 3: 分块 + 检索(RAG 式)

  • 先检索相关块,再回答
  • 不依赖模型直接处理超长上下文
  • 效果最好(但本质上是绕过问题)

策略 4: 位置信息注入

  • 每个段落前加段落编号
  • "段落 15/50:" 或 "第 15 段"
  • 帮助模型建立位置意识

策略 5: 多轮注意力

  • 先扫描全文(粗读),再聚焦关键段(精读)
  • 类似人的阅读策略
  • 效果中等,但计算开销增加

策略 6: 并行分段处理

长文档切分为 N 段:
  各段独立处理 -> 汇总 -> 最终回答
  • 每段独立,不共享上下文
  • 但对跨段推理任务失效

缓解效果对比(准确率提升,64k 上下文,中间位置):

方法基线提升
无处理55%-
重排序(相关放前)70%+15%
结构化标记62%+7%
位置编号65%+10%
RAG 检索85%+30%

4.5 RULER 基准

RULER(Zhao et al. 2024):系统的长上下文能力基准,超越简单的 Needle-in-a-Haystack。

测试维度

  • 单针、多针(Multi-needle)
  • 多跳推理(Multi-hop)
  • 变量追踪(Variable Tracking)
  • 聚合(Aggregation)

核心结论

  • 声称 128k 的模型,实际有效上下文可能是 32-64k
  • Multi-needle 场景下衰减更严重(多信息在中间更易丢失)
  • 提示:别被「支持 128k 上下文」营销迷惑,要实测有效长度

4.6 在不同任务上的表现

信息提取:最敏感(U 型明显)

摘要:相对鲁棒(全局信息,不依赖单个位置)

多跳推理:非常敏感(多个信息点都在中间时最差)

对话:近因效应强于首因效应(最后的消息权重高)

代码生成:代码前后依赖强,开头和结尾都重要

4.7 对 RAG 和 Agent 的启示

对 RAG

  • 检索到的文档要按相关性排序,最相关的放最前或最后
  • 不要让模型处理超长的检索结果
  • RAG + Long-context 组合优于纯 Long-context

对 Agent

  • Planning 时关键信息要放在 prompt 显眼位置
  • Memory 检索时,最重要的记忆放最前
  • Multi-Agent 通信时,关键结论要放在消息开头

对 Prompt 工程

  • System Prompt 的开头(首因)和结尾(近因)最重要
  • 中间内容被忽略风险高
  • 长 prompt 要有分段和标题

4.8 Lost in the Middle 的深层原因

还在探索

  • 是否是 Transformer 架构的本质缺陷?
  • Mamba/SSM(状态空间模型)是否有同样的问题?
  • 新的注意力变体(如 Infini-Attention)能否缓解?

初步结论

  • Transformer 的 softmax 注意力有天然的位置偏置
  • 不是简单调参能解决的问题
  • 可能需要架构创新(如线性注意力、结构化注意力)

L5 · 沿革与坑

5.1 沿革

  • 2023-06:Liu et al. 提出 Lost in the Middle 现象
  • 2023-07:Needle-in-a-Haystack 测试流行
  • 2023 下:各模型厂商强调长上下文能力,但社区开始质疑有效长度
  • 2024-03:RULER 基准(Zhao et al.),系统评估长上下文有效利用率
  • 2024 中:Claude-3 显著缓解 Lost in the Middle,但仍存在
  • 2024-2025:缓解策略(RAG + 重排序 + 结构提示)成为工程标配,但根本解决仍待架构突破

5.2 常见坑

坑 1: 相信 128k 上下文就是 128k 有效。实际有效可能是 32-64k。要在具体任务上测。

坑 2: 关键信息放中间。长 prompt 的关键信息放中间,模型可能忽略。要放开头或结尾。

坑 3: 所有检索结果一股脑塞进去。检索了 20 篇文档全塞进上下文,中间的信息丢失。要重排序或截断。

坑 4: 忽略 RAG + Long-context 组合。纯长上下文不比 RAG 强。长上下文 + RAG 是最佳组合。

坑 5: 一个 prompt 搞定多步推理。多跳推理在长上下文中间位置衰减严重。要分步或重排序。

坑 6: system prompt 太长。system prompt 的关键指令放中间可能被忽略。要放开头。

坑 7: 期望 prompt 工程解决问题。重排序、结构提示能改善 10-15%,不能根本解决。要配合 RAG。

坑 8: Needle-in-a-Haystack 全绿就以为完美。单针测试简单,Multi-needle / 多跳才是真正的挑战。

坑 9: 评估只看单点。只在几个位置测,不画完整的热力图。要系统评估。

坑 10: 未考虑延迟和成本。超长上下文(128k+)推理延迟高、token 成本高。RAG 通常更经济。

坑 11: 内容太长没做分段索引。用户上传超长文档,模型找不到中间信息。要先做检索索引。

坑 12: 忽略了输入编码的截断。某些模型 / API 实际截断了超长输入(即使声称支持更长),中间内容被截。

5.3 面试怎么考

  1. 什么是 Lost in the Middle? 答:LLM 对上下文左右的位置信息提取好、中间的位置信息提取差,呈 U 型准确率曲线。首因效应 + 近因效应。与模型和上下文长度都相关。
  2. 为什么会有 Lost in the Middle? 答:训练数据位置偏置(重要信息常在开头/结尾)、RoPE 注意力远程衰减、缺乏结构定位线索、位置编码 OOD。
  3. 怎么缓解? 答:重排序(关键信息放前/后)、结构化提示(标题/分段标记)、RAG(检索替代全量阅读)、位置编号、分段并行处理。RAG + 重排序效果最好。
  4. RULER 基准测什么? 答:超越单针的 Needle-in-a-Haystack,测试 Multi-needle、多跳推理、变量追踪、聚合等真实长上下文能力。结论:128k 声称 ≠ 128k 有效。
  5. 对 Prompt 工程的指导? 答:关键信息放 prompt 开头或结尾,不要放中间。长 prompt 要分段加标题。System prompt 核心指令放开头。

速记卡

U 型曲线

准确率
  ^
  | ██                    ██
  | ██                  ██
  | ██                ██
  |   ██            ██
  |     ████████████
  +----------------------> 位置
  开头                 末尾

原因

  • 训练数据偏置(新闻导语、对话近因)
  • 注意力衰减(两端压制中间)
  • 缺乏结构线索
  • 位置编码 OOD

缓解方法

方法提升(中间位置)复杂度
重排序+15%
结构化标记+7%
位置编号+10%
RAG 检索+30%
多轮注意+10%

跨模型对比(64k,中间准确率)

模型开头中间末尾
GPT-498%72%95%
Claude-399%85%97%
Gemini-1.597%78%94%
Llama-395%65%92%

对工程实践的指导

✅ 关键信息放 prompt 开头或结尾
✅ 长文档先检索再回答(RAG)
✅ 检索结果按相关性排序(最相关放最前)
✅ System Prompt 的核心指令放开头
✅ 长 prompt 分段加标题
❌ 不要相信「128k 上下文 = 128k 有效」
❌ 不要把所有检索结果一股脑塞进去
❌ 不要以为 Needle-in-a-Haystack 全绿 = 完美

一句话记忆:Lost in the Middle = LLM 注意力 U 型曲线:开头记得好(首因效应)、中间丢失(注意力被两端压制)、结尾记得好(近因效应)。是训练数据偏置 + RoPE 衰减 + 缺乏结构线索的综合结果,跨模型普遍(GPT-4/Claude/Llama)。缓解:关键信息放前/后、重排序、RAG 检索替代全量阅读(最佳)、结构化提示。128k 声称 ≠ 128k 有效,RULER 基准测真实长上下文能力。对 Prompt/RAG 设计的核心指导:不要相信中间。


上一篇:Ring Attention 环注意力 -- Ring Attention 让超长序列能跑,Lost in the Middle 揭示能跑 ≠ 能有效利用。下一篇:Long-context RAG 长上下文检索增强 -- RAG + Long-context 的最佳实践,取二者之长补二者之短。

内容采用 CC BY-SA 4.0,代码采用 MIT。