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 型变化:开头和结尾位置的信息提取准确率高,中间位置准确率显著下降。该现象在多文档问答、键值检索、合成任务中均被验证,且随着上下文长度增加而加剧。
关键发现:
- U 型曲线:准确率 vs 信息位置呈 U 型
- 与上下文长度正相关:上下文越长,中间衰减越严重
- 跨模型普遍:GPT-3.5、GPT-4、Claude、Llama 等都有此现象
- 非窗口限制:即使信息在窗口内(< 最大长度),仍然迷失
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 RecencyGPT-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 测试
测试方法:
- 准备一个长文档(干草堆)
- 在某个位置插入一句关键信息(针):"密码是 123456"
- 在末尾问:密码是多少?
- 测试不同位置、不同上下文长度下的准确率
热力图解读:
上下文长度 / 针位置 → (开头 ... 中间 ... 末尾)
4k: [████████████████████] 全绿
8k: [████░░░░░░░░░░██████] 中间稍弱
16k: [████████░░░░░░██████] 中间衰减
32k: [████████████░░██████] 衰减区扩大
64k: [████████████░░██████] 持续衰减
128k: [████████████░░██████] 底部最深跨模型对比(64k 上下文):
| 模型 | 开头 | 中间 | 末尾 |
|---|---|---|---|
| GPT-4-128k | 98% | 72% | 95% |
| Claude-3-200k | 99% | 85% | 97% |
| Gemini-1.5-Pro-1M | 97% | 78% | 94% |
| Llama-3-70B-8k | 95% | 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 面试怎么考
- 什么是 Lost in the Middle? 答:LLM 对上下文左右的位置信息提取好、中间的位置信息提取差,呈 U 型准确率曲线。首因效应 + 近因效应。与模型和上下文长度都相关。
- 为什么会有 Lost in the Middle? 答:训练数据位置偏置(重要信息常在开头/结尾)、RoPE 注意力远程衰减、缺乏结构定位线索、位置编码 OOD。
- 怎么缓解? 答:重排序(关键信息放前/后)、结构化提示(标题/分段标记)、RAG(检索替代全量阅读)、位置编号、分段并行处理。RAG + 重排序效果最好。
- RULER 基准测什么? 答:超越单针的 Needle-in-a-Haystack,测试 Multi-needle、多跳推理、变量追踪、聚合等真实长上下文能力。结论:128k 声称 ≠ 128k 有效。
- 对 Prompt 工程的指导? 答:关键信息放 prompt 开头或结尾,不要放中间。长 prompt 要分段加标题。System prompt 核心指令放开头。
速记卡
U 型曲线:
准确率
^
| ██ ██
| ██ ██
| ██ ██
| ██ ██
| ████████████
+----------------------> 位置
开头 末尾原因:
- 训练数据偏置(新闻导语、对话近因)
- 注意力衰减(两端压制中间)
- 缺乏结构线索
- 位置编码 OOD
缓解方法:
| 方法 | 提升(中间位置) | 复杂度 |
|---|---|---|
| 重排序 | +15% | 低 |
| 结构化标记 | +7% | 低 |
| 位置编号 | +10% | 低 |
| RAG 检索 | +30% | 中 |
| 多轮注意 | +10% | 高 |
跨模型对比(64k,中间准确率):
| 模型 | 开头 | 中间 | 末尾 |
|---|---|---|---|
| GPT-4 | 98% | 72% | 95% |
| Claude-3 | 99% | 85% | 97% |
| Gemini-1.5 | 97% | 78% | 94% |
| Llama-3 | 95% | 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 的最佳实践,取二者之长补二者之短。