什么是“Lost in the Middle”(中间丢失)现象?在构建 Prompt 时如何应对?
“Lost in the Middle”(中间丢失) 现象是大语言模型(LLM)在处理长文本上下文时表现出的一种显著缺陷。
简单来说,当给模型输入很长的文本(Context)时,模型往往能很好地利用开头和结尾的信息,但容易忽略或“忘记”位于文本中间的信息。
以下是关于这一现象的详细解释以及在 Prompt Engineering(提示词工程)中的应对策略。
一、 什么是“Lost in the Middle”?
这一现象最早由斯坦福大学、加州大学伯克利分校等机构的研究人员在 2023 年的论文中系统提出。
1. 核心表现:U 型曲线
模型的性能通常呈现出一种 U 型曲线:
- 首因效应 (Primacy Effect): 当关键信息位于 Prompt 的最开头时,模型提取效果很好。
- 近因效应 (Recency Effect): 当关键信息位于 Prompt 的最末尾时,模型提取效果也很好。
- 中间低谷: 当关键信息被埋藏在长文本的中间位置时,模型的准确率会显著下降。
2. 为什么会发生?
- 注意力机制(Attention Mechanism): 虽然 Transformer 架构理论上关注所有 token,但在实际训练中,模型倾向于过度关注绝对位置编码的开头和结尾。
- 训练数据分布: 在预训练数据中,重要信息往往出现在文章的开头(摘要/介绍)或结尾(结论),导致模型习得了这种偏好。
二、 如何在构建 Prompt 时应对?
为了缓解“中间丢失”现象,我们需要通过优化 Prompt 的结构和内容的排列方式来辅助模型。以下是 5 种实用的策略:
1. 关键信息“两头放” (Reordering)
这是最直接有效的手段。不要把最重要的指令或参考文档随意堆砌。
- 指令前置: 始终将 System Prompt(系统提示)和核心任务指令放在最开头。
- 问题后置: 将用户具体的问题或最终的触发词放在最末尾。
- RAG 排序优化: 如果你使用 RAG(检索增强生成),检索到了 10 个文档片段,不要按相关性分数 1-10 顺序排列。应该将相关性最高的片段放在最开头或最末尾,将相关性较低的放在中间。
2. “三明治”结构 (The Sandwich Technique)
对于特别长的 Context,为了防止模型读到最后忘了开头,或者只看结尾,可以采用首尾呼应的策略。
- 结构:
[核心指令]->[长上下文数据]->[重复核心指令 + 具体问题] - 例子:
开头: 请根据以下文章回答问题,如果文章中没有答案,请说不知道。
中间: (长篇大论的文章...)
结尾: 再次提醒,仅根据上述文章回答。请问:文章中提到的核心论点是什么?
3. 减少噪音:压缩与过滤 (Compression & Filtering)
不要盲目追求超长上下文窗口(如 128k, 200k),上下文越长,信噪比越低,“中间丢失”越严重。
- 预处理: 在将文本喂给模型之前,先用一个小模型或脚本提取摘要,或者过滤掉无关的段落。
- 减少 Top-K: 在 RAG 系统中,与其给模型 20 个相关的文档片段,不如精选最相关的 5 个。质量优于数量。
4. 结构化提示与分隔符 (Structuring & Delimiters)
帮助模型清晰地识别上下文的结构,使其更容易定位中间的信息。
- 使用明显的分隔符: 使用
###,---, 或 XML 标签(如<document>...</document>)将中间的上下文切分成块。 - 带索引的列表: 给中间的信息加上序号(1, 2, 3...),这有助于注意力机制定位。
5. 思维链 (Chain of Thought, CoT)
强迫模型在回答之前先“扫描”一遍中间的信息。
- Prompt 技巧: 不要直接问结果,而是要求模型先提取相关信息。
- 例子:
“请先从上文中找出所有关于‘价格’的句子,列出来,然后基于这些句子回答最终价格是多少。”
- 通过这一步,模型被迫关注中间的细节,将其提取到生成的“近因”区域(回答的开头),从而提高最终答案的准确性。
总结
虽然现在的模型(如 GPT-4-Turbo, Claude 3, Gemini 1.5 Pro)声称支持超长上下文,且在缓解“中间丢失”方面有了很大进步,但该现象依然存在。
最佳实践口诀:
指令放两头,中间加路标,噪音要过滤,先找后回答。