当前位置:AIGC资讯 > AIGC > 正文

为什么你的RAG不起作用?失败的主要原因和解决方案

无数企业正在尝试使用检索增强生成(RAG),但在制作这些系统达到生产质量时普遍会感到失望。因为他们的RAG不仅运行效果差,而且对于如何改进和如何进行后续的工作也感到十分的迷茫。

其实阻碍RAG系统的一个关键因素是语义不协调,这是由于任务的预期含义、RAG的理解以及存储的底层知识之间的不一致。由于向量嵌入的底层技术是神奇的(易变且极不透明),因此难以诊断这种不协调,使其成为生产化的重大障碍。

本文的目标是揭示普通RAG失败的主要原因,并提供具体策略和方法,使您的RAG更接近生产阶段。

在这篇文章中,我们将:

  • 区分理想形态的RAG的前景与普通RAG的现实
  • 解释语义不协调是如何产生的
  • 介绍如何判断和缓解语义不协调
  • 总结一些额外的高ROI策略,使RAG更加接近生产质量

注:为简化问题我们将关注基于问答的文本示例,但核心思想可以推广到其他用例

为什么选用RAG?

RAG(检索增强生成)是一个目前正经历炒作周期的范式。它听起来很吸引人,在本质上它是AI的搜索引擎。

在GPT-3成为大热之后不久,RAG开始流行。企业在构建LLM驱动的AI时面临的一个直接问题是,像GPT这样的模型没有在它们特定的数据和领域上进行训练。所以LLM从业者很快发现,当在提示中直接提供业务特定上下文(如支持文档)时,GPT的表现出奇的好。这就为企业提供了一个不用进行微调模型的替代方案。

对于RAG,给它一个问题,可能还有用户特定的信息,它将返回最相关的上下文给GPT。虽然这在理论上听起来很棒,但在实现生产级RAG时存在重大挑战,我们将在接下来的部分中探讨。

RAG是有前途的,普通RAG只是开始

RAG只是一个框架,一个完美运作的RAG,无论其后端如何,都将为无数用例带来巨大的价值。如果你对RAG有所了解则可以跳过此节。

传统RAG(定义):一个单步语义搜索引擎,它将业务知识(如支持文档)存储在向量数据库中,如Pinecone,使用现成的嵌入模型。然后通过创建问题文本的向量嵌入,并使用比较度量(如余弦相似性)来对最相关的前k个文档进行排名。

一个向量嵌入模型接收任意字符串并返回一个固定维度的数学向量。流行的嵌入模型包括OpenAI的text-embedding-ada-002及其最新模型text-embedding-3-small。这些模型将文本块转换为约1500维的向量,并且几乎没有人类理解的可解释性。

向量是非常普遍且非常有用的工具,因为可以将非定量的事物分解为丰富的维度数组,并对它们进行定量比较。一些例子是:

  • (红、绿、蓝)颜色调色板是一个向量,每个值介于0-255之间。
  • 通过行业标准如Barra,可以将股票表示为一个向量,量化其对经济因素(如广泛增长、利率变化等)的敏感度。
  • 像Netflix这样的平台可以将用户偏好分解为一个向量,其中的组成部分可以表示类型和其他特征。

余弦相似性可以说是在语义搜索中比较向量的默认度量标准,它通过应用余弦到两个向量之间的点积角度来工作。余弦越接近1,向量就越相似。

也有其他衡量语义相似性的方法,但通常这不是问题的关键所在,我们将在文章中使用余弦相似性。

但是这里必须强调的是,像余弦相似性这样的向量比较度量是很难处理的,因为它们没有绝对的意义——这些值完全取决于嵌入模型和涉及文本的上下文。假设你将一个问题与一个答案匹配,得到了0.73的余弦相似性。这是一个好匹配吗?

我们提出一个问题“What is rain?”并将其与三个相关性不同的文本进行比较。在下表中看到,使用两个不同的OpenAI模型的余弦相似性的范围和解释有很大差异。对于第一个模型,0.73表示完全不相关的匹配,但是对于第二个模型,0.73表示高度相关。这表明任何功能良好的RAG系统都需要校准对这些分数的理解。

Text1 (definition): “Rain is the precipitation of water droplets from clouds, falling to the ground when they become too heavy to stay suspended in  air.”

Text2 (mentions rain): “The winds blowing moisture over the mountains are responsible for rain in Seattle.”

Text3 (irrelevant info): “Stripe is a payments infrastructure business.”

语义不协调造成问题

传统的RAG的几个挑战可以归因于语义不协调和嵌入的解释性差。语义不协调是任务预期含义、RAG的理解以及存储的底层知识之间的不一致。

可以大致说为“问题在语义上与它们的答案不一样”,所以直接比较问题和你的原始知识库只会得到有限的结果。

想象一个律师需要搜索成千上万的文档来寻找投资欺诈的证据。然后他提出了问题“有什么证据表明Bob进行了金融欺诈?”与“Bob在3月14日购买了XYZ股票”(其中隐含XYZ是竞争对手,且3月14日是财报公布前一周)基本上没有语义重叠,但是在因果层面这两件事情是有联系的

向量嵌入和余弦相似性是模糊的,因为向量在完全捕捉任何给定陈述的语义内容方面有其固有的不完美。余弦相似性导致精确排名并不是必然的,因为它隐含地假设每个维度都具有相同的重要性。

使用余弦相似性进行语义搜索倾向于在方向上是正确的,但本质上是模糊的。它可以很好地估计前20个结果,但通常只靠它来可靠地排名最佳答案是有很多要求的。

在互联网上训练的嵌入模型不理解你的业务和领域,尤其是在喜欢造词的互联网时代,Connect、Radar和Link等词,在讨论不同产品时意义大相径庭,语义不协调的来源是多重的,并导致排名不可靠。

诊断和缓解语义不协调

在这个示例中将介绍如何诊断RAG中的完全语义不协调。我们还将介绍如何通过增加结构来提高性能的早期迹象。

这个例子来自现实生活中的用例。

1、我们假设一个电子商务初创公司正在建立一个内部使用的RAG,它找到给定业务问题的最佳SQL表。下面是示例的设置,其中我们:

events.purchase_flow:产品流程中的详细原始用户事件

aggregates.purchases:汇总的表,包含摘要分析

2、然后创建了一些假设的问题进行评估

IP地址对查看和购买的产品类型有什么影响?本季度鞋类销售的整体趋势如何?每小时的几秒钟内有不寻常的行为吗?像新年这样的重大事件周围用户参与度如何变化?

3、生成了额外的元数据

每个表的简要描述,每个表独特回答的示例问题

4、通过将我们的输入文本与“垃圾”进行比较来检查嘈杂的余弦相似性得分

5、比较四种不同的检索策略,看哪些文本类型与我们的输入“最语义相似”。

策略1:仅表结构

策略2:表结构 + 简要描述

策略3:表结构 + 简要描述 + 示例问题

策略4:仅示例问题

我们比较了随机文本片段与每个问题以及原始表文本的余弦相似性(下图为示例)。我们发现,对于垃圾输入的余弦相似性约在0.04-0.23之间,这这有助于建立识别语义重叠弱到无的基线。

四种策略的比较

从下面的结果可以看出,策略4将问题与示例问题进行比较,具有最高的语义重叠和最佳排名。策略1和策略2的表现相似,与噪声一致——也就是说,业务问题与SQL表语句之间存在弱的或根本没有语义重叠。

这可能与我们的认知不同因为在一般人的理解中策略1就已经足够了,LLM能搞定一切。而专业人士理解的策略3因该更好,因为它将所有内容混合在一起,但表现不如策略4。

  • 噪声(随机,无关文本):余弦相似性在0.04–0.23之间。
  • 策略1(仅表结构):值在0.17–0.25之间(与噪声一致)。
  • 策略2(表结构 + 描述):值在0.14–0.25之间(仍然与噪声一致)。
  • 策略3(表结构 + 描述 + 示例问题):值在0.23–0.30之间。明显改善,我们开始从噪声中看到信号。
  • 策略4(仅示例问题):值在0.30–0.52之间。明显是表现最好的策略,并且完全超出了噪声范围。,它导致正确表与错误表之间的余弦相似性有了最大的分离,从而产生了更强的信号。

进一步提高你的RAG的策略

如果你也遇到了我们目前所描述的问题,那么首先恭喜你,你是一个真正使用过或者想使用RAG的从业者。但是上面的问题也只是触及了表面,更复杂的问题已经超出了本文的范畴,我们会在后面的文章进行讨论。目前我们需要着眼解决本文所描述的问题,以下则是一些对进行阶梯式改进的值得采用的方法。

结构化数据

可以通过增加结构来改善RAG,这是首先将问题链接到现有的问题库,随后将指导你找到正确的答案。这与直接将问题链接到单步中的正确文本相反。

对于基于支持文档构建的Q&A系统,问题→问题的比较将实质性地提高性能,而不是问题→支持文档。实际操作中,最简单的方法是 要求你的大模型(如ChatGPT)为每个文档生成示例问题,并让人类专家进行策划。本质上讲就是建立了我们自己的知识库。

这种方法还能进一步发展吗?

  • 对于每个文档,让ChatGPT生成它可以回答的100个问题列表
  • 这些问题不会完美,因此对于你生成的每个问题,计算其与其他每个文档的余弦相似性
  • 筛选出那些会将正确文档排在所有其他文档之前的问题
  • 通过排序那些正确文档与第二名文档的余弦相似性差异最大的问题,来识别最高质量的问题
  • 发送给人类进行进一步的判断(这步就要人工成本了)

语义 + 相关性排名

几乎每个主要搜索引擎都在使用这个方法,所以这可能是我们能得到的更大的好处的方法。因为余弦相似性很适合做初步评估,但最终无法进行更高精度的排名。

如果你的业务可能拥有更多的信息来帮助AI做出更好的决策,例如:收集了诸如页面浏览和点赞等指标,可能按人物特征拥有这些指标。那么你就可以创建一个包括广泛用户/任务特征的相关性评分,来微调排名,使RAG工作得更好。例如可以让你的排名成为一个线性组合,

排名 = (余弦相似性) + (权重) x (相关性评分)

使用AI作为工具,而不是完整的解决方案

几十年来,软件工程实践演变为倾向于设计许多小组件,这些组件具有严格、明确的保证。围绕聊天界面的狂热完全颠覆了这一范式,五年后,这种做法很可能被视为是错误的。

ChatGPT以及大部分新兴生态系统鼓励的范式是“给我任何文本,我就给你任何文本。”这些AI没有效力或成本和延迟的保证,而是有着“我可能在某些时候在某种程度上是对的”的模糊承诺。其实企业应该通过提供更具范围和主观性的接口来构建更健壯的AI。

这也就是对于OpenAI所说的超级对齐的来说是非常重要的但又不是必要的。(这里仅是我个人的关系,供参考)

总结

我们正在见证AI的新时代的到来。这个时代的新颖之处不在于NLP和语言模型的出现,而是现成技术降低了企业利用自然语言技术针对他们特定用例的门槛。但是,我们还要清楚的认识到,目前这项技术仍处于早期开发阶段,在为你的AI构建RAG时,其实是在构建一个复杂的搜索引擎,这是可行的,但是要认识到这里的复杂性和挑战并解决这些问题才能让我们向成功迈出第一步。

更新时间 2024-06-04