AI 文摘

改善检RAG性能的10种方法





作者: 大数据架构师修行之路 来源: 大数据架构师修行之路

引言

“检索增强生成(Retrieval augmented generation)是将用户的输入补充到大型语言模型(LLM)(例如Chatgpt)中的过程,其中包含您(系统)从其他地方检索到的其他信息。然后,LLM可以使用该信息来增强其生成的响应。” - Cory Zue

LLM是一个了不起的发明,容易出现一个关键问题。他们组成东西。RAG通过在回答查询时给出事实上下文来使LLM更有用。

使用诸如Langchain或Llamaindex之类的框架的快速启动指南,任何人都可以构建一个简单的RAG系统,例如用于文档的聊天机器人,并使用大约五行代码。

但是,使用这五行代码构建的机器人将无法正常工作。RAG 很容易原型,但很难生产 - 即,到达用户对此感到满意的地步。基本教程可能会使RAG以80%的速度工作。但是,桥接接下来的20%通常需要进行一些认真的实验。最佳实践尚未熨烫,并且可以根据用例而变化。但是,弄清楚最佳实践非常值得我们花时间,因为RAG可能是使用LLM的最有效方法。

这篇文章将调查改善RAG 系统质量的策略。它是针对那些想弥合基本设置和生产级别性能之间差距的那些建筑物量身定制的。出于本文的目的,改进意味着增加系统的查询比例:1。找到适当的上下文,并生成适当的响应。我会假设读者已经对RAG的工作方式有所了解。如果没有,我建议您阅读Cory Zue的这篇文章,以进行良好的介绍。它还将对用于构建这些工具的常见框架进行一些基本熟悉:Langchain和Llamaindex。但是,这里讨论的想法是框架 - 不可思议的。

提高检索增强产生性能的10种方法

1.清洁数据。

RAG将LLM的功能连接到您的数据。如果您的数据在实质或布局上令人困惑,那么您的系统将会受到影响。如果您使用的是具有冲突或冗余信息的数据,则您的检索将难以找到正确的上下文。当这样做时,LLM执行的生成步骤可能是次优的。假设您正在为创业公司的帮助文档建立聊天机器人,并且发现它的运作不佳。您应该查看的第一件事是您要馈送到系统的数据。主题在逻辑上崩溃了吗?主题是一个地方还是许多独立的地方?如果您作为一个人,无法轻易分辨出您需要查看哪个文档来回答常见的查询,那么您的检索系统都无法。

这个过程可以像手动将文档结合在同一主题上一样简单,但是您可以进一步进行。我看到的更具创造力的方法之一是使用LLM来创建所有作为上下文提供的文档的摘要。然后,检索步骤可以首先对这些摘要进行搜索,并仅在必要时才深入细节。有些框架甚至将其作为内置的抽象。

2.探索不同的索引类型。

该指数是Llamaindex和Langchain的核心支柱。它是容纳您的检索系统的对象。RAG的标准方法涉及嵌入和相似性搜索。零碎上下文数据,嵌入所有内容,当查询到来时,从上下文中找到类似的部分。这效果很好,但不是每种用例的最佳方法。查询是否与特定项目(例如电子商务商店中的产品)相关?您可能需要探索基于密钥的搜索。它不一定是另一个,许多应用程序都使用混合动力。例如,您可以使用基于密钥的索引来与特定产品有关的查询,但要依靠嵌入来获得一般客户支持。

3.实验您的块方法。

构建上下文数据是构建RAG系统的核心部分。Frameworks抽象了整个过程,并让您不考虑它而逃脱。但是您应该考虑一下。块大小很重要。您应该探索最适合您的应用程序的方法。通常,较小的块通常会改善检索,但可能会导致一代人缺乏周围环境。您可以通过多种方法来解决大块。无效的一件事是盲目接近它。Pinecone的这篇文章提出了一些要考虑的策略。我有一系列问题。我通过运行实验来解决这个问题。我用一个小,中和大的尺寸循环一次,发现最佳。

4.玩您的基本提示。

LlamainDex中使用的基本提示的一个例子是:

‘上下文信息如下。鉴于上下文信息而不是先验知识,请回答查询。’

您可以覆盖此内容并尝试其他选项。您甚至可以入侵RAG,以便您确实允许LLM在上下文中找不到好的答案,从而依靠其知识。您还可以调整提示,以帮助指导其接受的查询类型,例如,指示其以某种方式回答主观问题。至少,覆盖提示很有帮助,以使LLM具有有关工作的工作的背景。例如:

‘您是客户支持代理。您的目的是在仅提供事实信息的同时,尽可能有用。您应该友好,但不要过于健谈。上下文信息如下。鉴于上下文信息而不是先验知识,请回答查询。’

5.尝试元数据过滤。

改善检索的一个非常有效的策略是在块中添加元数据,然后使用它来帮助处理结果。日期是要添加的常见元数据标签,因为它允许您通过重新度过滤。想象一下,您正在构建一个应用程序,允许用户查询其电子邮件历史记录。最近的电子邮件可能会更有意义。

但是我们不知道它们将是从嵌入的角度到用户查询的最相似之处。这提出了一个一般概念,以牢记构建RAG:类似≠相关。您可以将每个电子邮件的日期附加到其元数据中,然后在检索过程中优先考虑最新上下文。LlamainDex拥有一类内置的节点后处理器,可以对此有所帮助。

6.使用查询路由。

拥有多个索引通常很有用。然后,您将查询在适当的索引进入时将其路由。例如,您可能有一个索引来处理摘要问题,另一个可以处理指向问题的问题,而另一个可以很好地解决日期敏感问题。如果您尝试针对所有这些行为优化一个索引,那么您最终将损害其所有这些行为的能力。相反,您可以将查询路由到适当的索引。另一种用例是将一些查询引导到第2节中讨论的基于密钥字的索引。

构造索引后,只需在文本中定义每个都应使用的内容即可。然后在查询时间,LLM将选择适当的选项。Llamaindex和Langchain都有为此的工具。

7.研究重读。

重读是解决相似性和相关性之间差异问题的一种解决方案。通过重新计算,您的检索系统像往常一样获得上下文的顶级节点。然后,它根据相关性将它们重新排列。cohere rereanker通常用于此。我看到专家经常推荐这种策略。无论用用例如何,如果您正在使用RAG构建,则应尝试重新骑行,看看它是否改善了系统。Langchain和Llamaindex都具有使设置易于设置的抽象作用。

8.考虑查询转换。

您已经通过将用户查询放置在基本提示中来更改用户的查询。进一步改变它是有意义的。这里有一些例子:

重新启动:如果您的系统找不到查询的相关上下文,则可以让LLM重新调整查询并重试。在嵌入空间中,对人类似乎并不总是看起来那么相似的两个问题。

海德:海德是一种策略,可以进行查询,产生假设的响应,然后两者都将其嵌入查找。研究发现,这可以极大地提高性能。

子征服:LLM分解复杂的查询时倾向于更好。您可以将其构建到RAG系统中,以便将查询分解为多个问题。

LlamainDex的文档涵盖了这些类型的查询转换。

9.微调嵌入模型。

基于嵌入的相似性是RAG的标准检索机制。您的数据被分解并嵌入索引中。当查询进来时,它也嵌入了与索引中的嵌入的比较。但是,嵌入的杜格是什么?通常,诸如Openai的文本插入-ADA-002等预先训练的模型。

问题在于,预训练的模型的嵌入空间相似的概念可能与您的上下文中的类似内容不太吻合。想象您正在使用法律文件。您希望您的嵌入将其相似性的判断基于您的特定领域术语,例如“知识产权”或“违反合同”,而较少遵循“特此”和“协议”等一般术语。

您可以微调嵌入模型以解决此问题。这样做可以将您的检索指标提高5-10%。这需要更多的努力,但可以对您的检索性能产生重大影响。该过程比您想象的要容易,因为LlamainDex可以帮助您生成培训集。有关更多信息,您可以查看Liu的Jerry lamaindex如何接近微调嵌入的这篇文章,或者在遍历微调过程中的这篇文章。

10.开始使用LLM开发工具。

您可能已经使用LlamainDex或Langchain来构建系统。这两个框架都有有用的调试工具,可让您定义回调,查看使用了哪些上下文,您的检索来自哪些文档,等等。

如果您发现缺乏这些框架中内置的工具,那么工具的生态系统越来越多,您可以帮助您潜入RAG系统的内部工作。Arize AI具有一个注册表工具,可让您探索如何检索哪个上下文以及原因。Rivet是一种工具,可提供可视界面,以帮助您构建复杂的代理。它只是由法律技术公司Ironclad开源的。新工具不断发布,值得尝试一下,以了解哪些对您的工作流程有帮助。

结论

用RAG建造可能会令人沮丧,因为它很容易工作,而且很难工作。我希望上面的策略可以为您如何弥合差距提供一些灵感。这些想法中的任何一个都没有工作,过程是实验,反复试验和错误之一。

在这篇文章中,我没有深入研究评估,如何测量系统的性能。目前,评估更像是一门艺术,而不是科学,但是重要的是要设置一些可以始终如一地进行检查的系统。这是判断您正在实施的更改是否有所作为的唯一方法。我写了有关如何评估RAG系统的文章。有关更多信息,您可以探索Llamaindex Evals,Langchain Evals和一个真正有希望的新框架RAGs。

参考

  • 10-ways-to-improve-the-performance-of-retrieval-augmented-generation-systems

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具