Note

什么是 Lost in the Middle?如何缓解?

解释长上下文中间信息利用不足的现象及 RAG 中的应对方法。

请解释“Lost in the Middle”问题。它描述了 RAG 中的什么现象?有什么方法可以缓解这个问题?

“Lost in the Middle” 是指大型语言模型(LLM)在处理一个长上下文(long context)时,倾向于更好地回忆和利用位于上下文开头和结尾的信息,而忽略或遗忘位于中间部分的信息的一种现象。这个发现在斯坦福大学的一篇名为《Lost in the Middle: How Language Models Use Long Contexts》的论文中被系统性地揭示。

在RAG中的现象:

这个现象对RAG系统有直接且重要的影响。在RAG的生成阶段,我们通常会将检索到的Top-K个文档块与用户的原始问题拼接起来,形成一个长长的prompt。例如: [原始问题] + [文档1] + [文档2] + [文档3] + ... + [文档K]

如果LLM存在“Lost in the Middle”的问题,那么:

  • 文档1 和 文档K 的内容会得到LLM的充分关注。
  • 而位于中间的文档2、文档3…等,即使它们包含了回答问题的关键信息,也有很大概率被LLM忽略,导致最终生成的答案信息不完整或不准确。
  • 这会使得我们精心设计的检索环节(如重排序)的效果大打折扣,因为即使我们把最相关的文档排在了前面,只要它不是第一个或最后一个,就可能被“遗忘”。

缓解方法:

  1. 文档重排序(Document Re-ordering):

    • 核心思想: 不再按照检索分数的顺序简单地拼接文档,而是有策略地放置它们。
    • 具体做法: 在将检索到的K个文档送入LLM之前,进行一次重排序。将最相关的文档放置在上下文的开头和结尾,而将次要相关的文档放在中间。这样可以确保关键信息处于LLM的“注意力甜点区”。
  2. 减少检索的文档数量(Reduce the Number of Retrieved Documents):

    • 核心思想: 与其送入大量可能包含噪声的文档,不如只送入少数几个最关键的文档。
    • 具体做法: 严格控制Top-K中的K值,例如只取Top-3或Top-5。这需要前端的检索和重排序步骤有更高的精度,确保召回的文档质量足够高。
  3. 指令化提示(Instruct the Model):

    • 核心思想: 在prompt中明确指示模型要关注所有提供的上下文。
    • 具体做法: 在prompt的末尾加入类似这样的指令:“请确保你的回答完全基于以上提供的所有上下文信息,不要忽略任何一份文档。” 虽然这不能完全解决问题,但在一定程度上可以引导模型的注意力。
  4. 对LLM进行微调(Fine-tune the LLM):

    • 核心思想: 训练LLM更好地处理长上下文。
    • 具体做法: 构建一个特定的微调数据集,其中的任务要求模型必须利用位于上下文中间部分的信息才能正确回答。通过这种方式,可以“强迫”模型学会不忽略中间内容。这是最根本但成本也最高的解决方案。