超越基础RAG:相似性≠相关性

RAG系统在检索文本块时通常依赖相似性作为相关性的代理。如果一段文本与查询相似,我们假设它…

Beyond Basic RAG: Similarity ≠ Relevance

RAG系统在检索文本块时通常依赖相似性作为相关性的代理。如果一段文本与查询相似,我们假设它一定相关。这种方法已变得如此普遍,以至于很容易将相似性与相关性混淆。让我们探讨它们的差异,以及在RAG背景下理解它们为何重要!

先讲基础…

这是你今天将看到的最简单的RAG系统

  1. 你有一个问题和一本需要搜索的书。
  • “哈利是谁?”

2. 从书中提取与问题关键词匹配的部分。

  • “哈利,你是一个巫师。”
  • “哈利重视他的朋友。”

3. 将这些部分/文本块发送给语言模型来回答问题。根据以下句子,回答问题。句子
"哈利,你是一个巫师。”
"哈利重视他的朋友。”问题:“哈利是谁?”

搜索或检索部分使用一种特定的策略来提取文档中可能包含原始问题答案的部分并进行排序,换句话说,就是提取最相关的内容。

RAG 相关性

在RAG系统中,相关性可以理解为特定文本块直接回答查询的可能性。相关性是任务特定的,这意味着判断文本块相关性的标准会根据问题的性质和预期结果而变化。例如,在某些情况下,相关性可能取决于某些关键词的存在,而在其他情况下,则可能取决于文本的整体含义或上下文。

相关性 ≈ 文本包含足够信息回答查询的可能性。
哈利是一个巫师。

相似性有效!

一种被证明有效的检索策略,称为语义搜索,它不仅仅匹配精确的单词。相反,它通过比较文本块与原始查询的相似度得分,找到与问题在上下文上相关的文本块。

这种方法通常涉及使用嵌入或向量相似性,将文本转换为高维向量。系统随后根据这些向量在该空间中的接近程度来衡量相似性。

各种概念的简化向量表示。来源:https://odsc.com

相似性之所以有效,是因为在许多情况下,我们在查询中使用的语言与在相关答案中找到的语言自然契合。例如,如果您问“法国的首都是哪里?”,包含“巴黎是法国的首都”的文本块在上下文和语义上都相似,这使得系统很容易将其识别为相关内容。

当查询与源材料中信息的表达方式非常相似时,这种方法表现出色。例如,提问“谁写了‘罗密欧与朱丽叶’?”,很可能会检索到一段文本块说“莎士比亚写了‘罗密欧与朱丽叶’”,因为关键词直接匹配,并且上下文清晰。

但它何时会失效…

然而,当查询需要仅靠上下文无法捕获的特定细节时,相似性通常会失效。在这种情况下,系统可能会检索到与查询相关但不直接回答查询的内容,导致响应不够准确或不完整。

示例 1

想象一下,您正试图查明埃菲尔铁塔是什么时候建造的。一个基于相似性的系统可能会调出讨论巴黎、地标甚至其他塔楼的文本块,仅仅因为它们共享常用词汇。然而,这些文本块可能无法直接回答您关于埃菲尔铁塔建造日期的具体问题。

以下是以相似性作为主要标准可能产生的结果

  • “埃菲尔铁塔是巴黎最著名的地标之一。”
  • “许多游客来到巴黎欣赏其美丽的建筑。”

这些句子虽然与埃菲尔铁塔相关,但没有提供您正在寻找的特定信息。一个侧重于相关性的方法会旨在检索如下内容:

  • “埃菲尔铁塔建于1887年至1889年之间。”

示例 2

现在考虑这样一个查询:

  • “鲍勃为什么邀请爱丽丝出去?”

一段描述,例如“鲍勃邀请爱丽丝出去喝咖啡”,在相似性上可能得分很高,因为它与查询共享关键词。然而,一段写着“他感到孤独……这导致他拿起电话”的段落,在措辞上可能相似性较低,但更相关,因为它提供了鲍勃行动背后的原因。

盲目依赖相似性而非相关性可能导致RAG系统的响应不够准确。核心挑战在于,基于相似性的检索可能会用相关但不一定有用的信息淹没模型,从而可能使模型混淆并导致次优的答案。

缓解问题

为了解决基于相似性的检索的局限性,关键在于引入额外的层来评估检索到的文本块的相关性,而不仅仅是相似度得分。这可以包括以下方法:

子查询生成:将通用查询分解为更具体的查询,提高焦点。示例

  • 将“带好摄像头的实惠智能手机”分解为“预算智能手机”和“最佳拍照手机”。

实体识别:用特定名称的实体类型替换它们,以提高与查询的相似性。示例

  • “J.K. 罗琳”变为“作者”,更能匹配“著名作者”。

共指消解:将对同一实体的不同引用链接起来,保持上下文一致。示例

  • 识别出“他”和“鲍勃”指代同一个人,确保检索的一致性。

高级检索模型:使用检索专用的算法,如ColBERTFLaRE,甚至训练定制的检索模型。

请注意,这些策略仅是基于内容的检索的一部分,它侧重于根据内容本身提取和排序相关文本。然而,可以通过结合元数据过滤和混合搜索等方法来进一步增强这种方法,这可以更好地限定范围并防止出现过度集中的文本块。

虽然相似性可以让我们接近目标,但它并非总是有效。摆脱默认解决方案并从侧面观察并非总是容易,但这可能是保持实际问题聚焦的关键。


在Langflow,我们正在构建从RAG原型到生产最快的路径。它是开源的,并提供免费云服务!请访问https://github.com/langflow-ai/langflow