跳到主要内容

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 位。位置优化的效果被意外提升的噪声抵消了。在五种不同排序策略(顺序、逆序、随机打乱、最大相关性、最小干扰性)中,真实条件下的准确率差异在统计上并不显著。

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

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates