跳到主要内容

RAG 位置偏差:为什么分块顺序会影响你的答案

· 阅读需 9 分钟
Tian Pan
Software Engineer

你花了数周时间调优嵌入模型。检索精度看起来不错。分块大小、重叠、元数据过滤器——一切都已调整到位。然而用户不断反映,系统"忽略"了它明明能访问的信息。相关段落每次都出现在 top-5 检索结果中,模型就是不用它。

罪魁祸首往往是位置偏差(position bias):语言模型倾向于过度依赖上下文窗口开头和结尾的信息,而对中间内容的注意力显著不足。在受控实验中,将相关段落从 20 篇文档上下文中的第 1 位移至第 10 位,准确率会下降 30-40 个百分点。你的检索器找到了正确的内容,但排序毁了它。

U 形注意力曲线

这一现象有其特定形态。给模型 20 篇检索到的段落,然后提出一个其中某篇能回答的问题。如果相关段落排在第一位,准确率很高,通常在标准基准测试中达到 85-95%。如果排在最后,准确率同样较高,约 85%。但如果排在中间,准确率可能会崩溃至 40-60%。

这条 U 形曲线并非某一模型的特有缺陷,而是所有自回归 Transformer 中都存在的两个架构特性导致的:

首因偏差(Primacy bias) 源于因果掩码机制。序列开头的 token 在注意力计算过程中会影响所有后续 token,使早期内容在模型内部激活中结构性地被过度表示——无论该内容是否真正相关。

近因偏差(Recency bias) 源于残差连接以及序列末尾注意力权重的计算方式。最后几千个 token 在模型的有效"工作记忆"中保持得比中间部分更可靠。

结果是:模型读取 20 个分块时并非一视同仁,而是仔细阅读前几个,略读中间部分,再留意最后几个。任何埋藏在第 5 到第 15 位的关键内容都处于结构性劣势。

生产环境中的表现

这种失效模式很隐蔽。你的评估指标看起来不错,因为评估通常测量的是检索精度——相关分块是否出现在 top-k 结果中——而不是模型在分块出现后是否真的使用了它。你可以拥有 90% 的检索召回率,但如果相关分块持续落在中间位置,答案依然会出错。

以下几种场景中位置偏差尤为突出:

长上下文 + 大量分块。 为最大化召回率而返回 10-20 个分块的检索管道,会创造出深层的"中间地带"。排在第 8/20 位的相关段落正好处于注意力最低的区域。

基于嵌入相似度的固定排序。 纯余弦相似度排名没有考虑模型的位置偏好。第二或第三相似的分块如果放在第一位,可能更为有用。

多跳问题。 当答案需要综合多个段落的信息时,恰好落在中间的分块即便包含必要上下文,也会被低估。

针对稀有但关键事实的语义搜索。 你的检索器排在第四或第五位的高度相关段落,可能处于注意力盲区,而三个相关度较低的段落却主导了模型的响应。

干扰项问题让一切更复杂

在寻找排序解决方案之前,有必要了解研究对生产实际影响的真实发现。

2025 年的一项研究考察了真实 RAG 场景(而非受控实验室环境),发现位置效应虽然真实存在,但往往被另一个问题所掩盖:干扰性段落。在真实检索结果中,超过 60% 的查询至少返回一个高度干扰的段落——这些内容主题相近但内容错误,措辞自信,容易误导模型。

当你试图通过将最相关的分块放在最前面来利用首因偏差时,往往同时把干扰性分块放在了第 2 和第 3 位。位置优化的效果被意外提升的噪声抵消了。在五种不同排序策略(顺序、逆序、随机打乱、最大相关性、最小干扰性)中,真实条件下的准确率差异在统计上并不显著。

这并不意味着位置不重要,而是说当你的检索集包含干扰项时,检索质量主导了位置效应。先修复检索,再处理排序。

有效的重排序策略

当你的检索管道已经稳固,但仍然观察到与位置相关的性能下降时,以下方法能带来持续的效果提升:

交叉编码器重排序(Cross-encoder reranking)。 交叉编码器模型将查询和每个段落一起读取,生成捕捉语义交互的相关性分数——而非仅仅依赖向量距离。与嵌入相似度(独立编码查询和段落)不同,交叉编码器能看到配对关系。在基准测试中,重排序结果与原始嵌入排名相比,幻觉率降低约 35%。代价是延迟:交叉编码器比嵌入查询慢,因此通常应用于预过滤后的 top-20 集合。

将高相关度分块放在边界位置。 鉴于 U 形曲线,务实的干预是机械性的:将置信度最高的分块放在最前面,次级分块放在最后面,接受中间部分注意力不足的现实。对于 10 个分块的上下文,第 1-2 位和第 9-10 位是最有价值的"黄金位置"。

激进地减少上下文长度。 你每增加一个段落,就会延伸中间地带。从 20 个分块减少到 6 个分块,可以消除大部分注意力盲区。代价是召回率降低,但如果你的检索器足够精确,更少往往更好。

指令提示词(Instruction prompting)。 明确告诉模型在回答前仔细阅读所有段落,可以部分弥补位置偏差。这在指令调优模型上效果更好,随着模型能力下降而退化——较小的模型对关于自身注意力的元指令响应不那么可靠。

"中间迷失"校准方法

一种更有原则的缓解措施来自注意力分数校准研究。核心思想是:如果你能建模任何注意力分数中有多少可归因于位置与相关性,就能减去位置分量。

这项技术在推理过程中应用,将模型分配给每个段落的注意力权重分解为相关性项和位置偏差项。通过移除位置偏差分量,模型对段落的注意力变得更加均匀。在基准测试中,这在问答任务上实现了约 15 个百分点的准确率提升,以及文档排名任务中近 50 个 Recall@3 点的提升——无需改变模型权重或检索管道。

这种方法可作为注意力分数的后处理层应用,这意味着它可以应用于任何基于 Transformer 的 LLM 而无需微调。实际限制在于它需要访问中间注意力激活,并非所有推理 API 都暴露这一接口。

如何测量你系统中的位置偏差

大多数团队不知道位置偏差是否正在影响他们,因为他们在测量错误的指标。检索指标(precision@k、recall@k、NDCG)无法捕捉模型是否使用了它检索到的内容。端到端准确率指标无法将排序效应与检索质量隔离开来。

一个有针对性的测量协议:

  1. 受控位置排列测试。 对于有已知正确答案的固定测试查询集,检索标准的 top-k 分块。将查询运行 4-5 次,将相关分块随机放置到不同位置(第一、中间、最后),同时保持干扰分块不变。如果准确率在不同位置间变化超过 10-15 个百分点,说明你有可测量的排序问题。

  2. eRAG 文档级评分。 对于每个检索到的文档,仅使用该文档作为上下文运行模型并评分响应质量。将这些每文档分数与你的管道产生的排序进行比较。如果高分文档持续落在中间位置,说明你的排序与模型偏好不一致。

  3. 干扰项密度审计。 对一批查询样本,手动标注哪些检索到的段落是真正相关的,哪些是干扰项。如果你的 top-10 结果经常包含 3-4 个干扰项,在改善检索之前,排序优化的效果将非常有限。

模型演进的注意事项

位置偏差并非一成不变。在更多样化的位置分布上训练,或将注意力校准技术融入训练的模型,表现出较低的敏感性。Gemini 1.5、较新版本的 Claude 以及 GPT-4o 在较长上下文中,"中间迷失"的退化比其前身更不明显。

这表明一种趋势:位置偏差是当前的工程约束,而非永久的架构定律。随着模型训练的改进,实际影响将会减弱。但就目前而言,大多数已部署的 LLM——尤其是许多团队在本地运行的开源权重模型——仍然表现出经典的 U 形曲线。

工程结论很清晰:测量排序是否影响你系统的准确率;如果存在干扰项,先修复检索质量;然后针对剩余差距应用交叉编码器重排序和边界位置策略。不要假设检索到正确内容就足以保证模型使用它。

注意力机制并不关心你花了多少心血来检索正确的段落,它只关心你把它放在哪里。

References:Let's stay in touch and Follow me for more thoughts and updates