论文阅读_优化RAG系统的检索
1 | 英文名称: The Power of Noise: Redefining Retrieval for RAG Systems |
1 读后感
在 RAG 系统中,检索和生成是独立进行的,使用的模型也不相同,检索和生成中任意一个部分效果不好都会影响最终结果。在检索部分,不一定必须使用稠密模型,因此作者考虑了密集和稀疏的情况;在生成部分,实验使用的是本地部署的较轻量级模型如 llama2 等,这也部分影响了效果。
作者的角度很有趣:查询所给出的答案可能是准确的、无关的或相关但不包含答案的。其中,相关但不包含答案的反而可能会导致最终结果偏差。在人的决策中也有类似情况:不怕完全不靠谱的信息,半真半假的更容易误导;如果只给我一个答案可能我还能不确定,如果附加一个完全不靠谱的答案与之对比,我反而更加确定。
粗看之下,在许多文档中定位与问题相关的文档,使用相似度方法似乎没有问题。至少它可以筛掉大多数完全无关的文档。然而,高相关性并不一定意味着包含正确答案。这可能需要生成模型来判断其中的逻辑关系,还需要考虑数据中根本不包含答案的情况。
1.1 摘要
目标:研究 RAG 系统中的检索策略,优化信息检索(IR)组件以提升生成式 AI 解决方案的效果。
方法:通过分析段落在提示上下文中的相关性、位置和数量等因素,评估不同检索策略对 RAG 系统中 LLM 表现的影响。
结果:发现检索时高得分但不包含答案的文档会降低 LLM 效果,而添加随机文档能将 LLM 准确性提高最多 35%。
1 引言
RAG 系统由两个基本组件组成:检索器和生成器。检索器负责调用外部信息检索(IR)系统,这些系统可以是密集型或稀疏型,并将选定的结果传递给生成器组件。本研究重点关注 RAG 的 IR 方面。
将查询返回的数据分为三类,并研究每个类别所带来的影响:
- 相关文档:包含可直接回答查询或提供相关信息的文档。
- 分散注意力的文档:虽然不直接回答查询,但在语义或上下文上与主题相关联。
- 随机文档:与查询没有任何关系,可以看作是检索过程中的信息噪音。
2 RAG
2.1 开放领域的问答
开放领域问答(OpenQA)是一项任务,旨在开发能够为自然语言中提出的各种问题提供准确且上下文相关答案的系统。这些系统不受特定领域或预定义数据集的限制。
常见的方法采用两步架构,通常包括检索器和推理器(通常是生成器)。首先,检索器找到与问题相关的文档,然后推理器生成答案。
2.2 检索器
检索器的目标是找到一个足够小的文档子集,以便推理者能正确回答查询。
密集检索需要将文本数据转化为向量表示,通常通过神经网络实现,常用的是基于 Transformer 的编码器,如 BERT。密集检索器处理查询 q 和潜在源文档 d,生成对应的查询嵌入和每个文档的嵌入。嵌入过程可以表示为:
其中,Encoderq 和 Encoderd 是基于神经网络的编码器,可能共享权重或架构,旨在将文本数据映射到向量空间中。一旦生成嵌入,检索过程就包括计算查询嵌入和每个文档嵌入之间的相似性。最常用的方法是使用点积得分。这个分数通过衡量嵌入向量空间中查询和文档的相似性来量化每个文档与查询的相关性,得分越高表示相关性越大。
2.3 推理器
推理器指的一般是生成器,它负责合成一个答案,通常通过调用 LLM 模型实现。在 RAG 中,生成语言模型将查询 q 和检索到的文档 Dr 作为输入,通过顺序预测序列中的下一个词元来生成响应。
本文的目标是找到最好的文档集 D 检索器应该为生成器提供材料,以最大限度地提高系统的有效性。
3 实验方法
3.1 自然问题数据集
自然问题(NQ)数据集是从 Google 搜索数据中派生的真实世界查询的大规模集合。数据集中的每个条目都包含一个用户查询和一个相应的维基百科页面,其中包括答案。NQ-open 数据集是 NQ 数据集的一个子集。不同之处在于,它取消了将答案链接到特定维基百科段落的限制,从而模仿了类似网络搜索的更通用的信息检索场景。最终的数据集包含 21,035,236 个文档,训练集有 72,209 个查询,测试集有 2,889 个查询。
3.2 文档类别
按文档与查询的相关性,将文档分为四种类型:
- 黄金文档:用星表示。这类文档是数据集中的原始上下文,包含答案的维基百科页面段落,并且与给定查询的上下文相关。
- 相关文档:用锁链图标表示。这些文档类似于黄金文档,它们包含正确答案,并在上下文中对回答查询有用。它们提供了与查询正确且相关的其他信息源。黄金文件也是一种相关文件。
- 分散注意力的文档:用断开的锁链表示。这类文档有高检索分数但不包含答案。
- 随机文档:用色子表示。随机文档既不与查询相关,也不包含答案。有助于评估模型处理完全不相关信息的能力。
3.3 文档检索
实验使用了 Contriever 作为默认的检索器。Contriever 是一种基于 BERT 的密集检索器,通过对比损失进行无监督训练。为了提高在包含约 2100 万文档的语料库中的相似性搜索效率,我们采用了 FAISS IndexFlatIP 索引系统。每个文档和查询的嵌入是通过对模型最后一层隐藏状态的平均值得到的。
3.4 LLM 的输入
收到查询后,检索器会根据相似度度量从语料库中选择排名前𝑘的文档。这些文档连同任务说明和查询一起,构成了 LLM 生成响应的输入。LLM 的任务是从提供的文档中提取一个最多包含五个词元的查询响应。如图所示,这个问题回答不正确。
3.5 测试的 LLM
在生成部分,测试了 base 和 instruct 版本,最终选用 instruct 版本,测试模型包含:Llama2-7B,Falcon-7B,Phi-2-2.7B,MPT-7B。
3.6 预价正确性
在 NQ-open 数据集中,每个查询可能有多个潜在答案,这些答案通常是同一概念的不同变体。在评估 LLM 生成的响应准确性时,采用一种检查响应中是否包含预定义正确答案的方法。这种评估方式是二进制的:如果存在正确答案,则认为准确,否则不准确。然而,有时这种方法无法识别同义的不同短语。
4 结果
4.1 分散注意力的文档的影响
随着上下文中分散注意力的文档数量增加,准确性会明显下降。这种模式在所有大型语言模型(LLMs)的情况下都能观察到。即使仅仅添加一个分散注意力的文档,也会导致准确性的急剧下降。
在现实世界的信息检索(IR)环境中,相关但不包含答案的文档很常见。实证分析表明,引入语义一致但不相关的文档会增加复杂性,可能误导 LLMs 做出正确响应。
如图所示:I 表示任务指令,Q 表示问题,星号表示黄金文档,断开的锁链表示分散注意力的文档。
从注意力的热力图中也可以看出,文本相似但不包含答案的文档分走了黄金文档的注意力。
(小编的理解:如果深度学习作为检索器,检索和生成模型基本上是类似的。在检索过程中找到文档的逻辑,同样适用于生成模型的逻辑。也就是说,在生成过程中,这些文档也被重视,从而分散了对黄金文档的注意力。)
为了验证这一假设,作者使用了 ADORE(Zhan 等,2021),一种通过“动态困难负样本”训练的先进检索器,来选择干扰文档。结果显示,情况依然相同。因此可以得出结论,区分相关信息和分散注意力的信息是一个难题,无法简单地通过改变现有的密集检索方法来解决。
4.2 黄金文档位置的影响
通过在上下文中移动黄金文件的位置来研究其对模型有效性的影响。将黄金文件的位置定义为 Far、Mid 和 Near,具体示例见表中的图示。
当黄金文档靠近查询时,准确性较高;当黄金文档离查询最远时,准确性较低;而当黄金文档位于上下文中间时,准确性最低。
(小编说:离得近更容易被注意到,而在中间时最不容易被忽略,这和长上下文模型的大海捞针结果也是一致的,可能由于训练数据的原因,让模型认为开头结尾的信息更为重要)
4.3 噪音的影响
评估 RAG 系统对噪声的鲁棒性。取黄金文件,并从语料库中随机挑选一定数量的文件添加到其中。性能没有下降,反而在最佳设置下有所改善。此外,不同模型表现出不同的行为。值得注意的是,与分散注意力的文档相比,这种性能下降的严重程度要低得多。
4.4 RAG 实践
给定一个查询,检索一组可能相关或分散注意力的文档。然后,我们将随机文档加入到这组检索到的文档中。使用 NQ 开放数据集的测试集。Llama2 的实验结果可以在表 3 左侧查看。
研究结果表明,无论检索到的文档数量如何,在填充上下文长度之前添加随机文档几乎总是有益的。特别是在检索到 4 个文档的情况下,准确率可提高 0.07(+35%)。
4.4.1 测试稀疏检索器
使用稀疏检索方法(特别是 BM25)复制了实验。相应的结果列在表 3 的右侧,随机文档也带来了提升。值得注意的是,使用 BM25 平均可使准确度提高 3-4 个百分点。这种改进归因于 BM25 检索到的文件质量。
(小编说:BM25 和 Contriever 各有优劣。BM25 是与数据集相关的,而 Contriever 虽然也是基于训练数据,但它的表示更通用。这至少表明,深度学习嵌入方法并不总是优于统计方法)。
4.4.2 提升随机性
随机文档从语气和风格截然不同的语料库中抽取,即 Reddit Webis-TLDR-17 数据集。观察到准确性有显著提高。即使将由随机单词组成的无意义句子视为随机文档,性能仍然有所提升。
4.5 权衡检索
在相关和完全不相关的文件数量之间似乎存在权衡。具体来说,实验发现,当最初检索到一组最少的文档,然后用随机文档补充,直到达到上下文限制时,可以获得最佳效果。检索 3 到 5 个文档是最有效的选择。添加更多文档会增加包含过多分散注意力内容的风险,从而适得其反。
对于如何解释加入噪声反而会提升模型效果,先前的研究提出,在某些情况下,过低的注意力熵会导致 LLM 产生退化输出,从而导致性能急剧下降。这些事件被称为熵坍缩。这里对比了加入随机文档前后的熵情况。引入随机文档时,系统的熵增加了 3 倍。