提高检索增强生成系统性能的10种方法

2023年09月25日 由 alex 发表 563 0

提高检索辅助生成性能的10种方法


特色

1. 清理你的数据


RAG将LLM的功能与你的数据连接起来。如果你的数据在内容或布局方面令人困惑,那么你的系统就会受到影响。如果你使用的数据存在冲突或冗余信息,你的检索过程将很难找到正确的上下文。而且,当LLM执行生成步骤时,可能会出现次优解。假设你正在为创业公司的帮助文档构建一个聊天机器人,但发现它的表现不佳。你首先应该查看的是输入到系统中的数据。主题是否逻辑分明?主题是否在一个地方或多个分开的地方涵盖?如果你作为一个人无法轻松判断需要查看哪个文档来回答常见问题,你的检索系统也无法做到。


这个过程可以简单地手动合并相同主题的文档,但你也可以进一步进行改进。我见过的更有创意的方法之一是使用LLM创建所有文档的摘要。然后,检索步骤可以先在这些摘要上运行搜索,仅在必要时深入细节。一些框架甚至将这个过程作为内置抽象。


2. 探索不同的索引类型


索引是LlamaIndex和LangChain的核心支柱,它是保存你的检索系统的对象。RAG的标准方法涉及到嵌入和相似性搜索。将上下文数据分块,对所有内容进行嵌入,当查询出现时,找到上下文中相似的部分。这种方法非常有效,但并不适用于每种用例。查询是否涉及特定项,比如电子商务商店中的产品?你可能需要探索基于关键字的搜索。不需要二选一,许多应用程序使用混合方法。例如,你可以使用基于关键字的索引来处理与特定产品有关的查询,但在一般客户支持方面依赖嵌入。


3. 尝试不同的分块方法


将上下文数据分块是构建RAG系统的核心部分。一些框架将分块过程抽象化,使你无需考虑它。但你应该思考它。分块大小很重要。你应该探索适合你的应用程序的最佳工作方式。一般来说,较小的分块通常可以改善检索,但可能导致生成过程缺乏周围的上下文。你可以采用许多方法来进行分块。唯一行不通的方法是盲目进行尝试。


4. 尝试不同的基础提示


LlamaIndex中使用的一个基础提示的示例是:


“下面是上下文信息。根据上下文信息而不是先验知识回答查询。”


你可以覆盖这个提示并尝试其他选项。你甚至可以修改RAG,使LLM在上下文中找不到好答案时依靠自己的知识。你也可以调整提示来帮助引导它接受某种类型的查询,例如指示它对于主观问题以某种方式回应。至少覆盖提示是有帮助的,这样LLM就可以理解它要做什么工作。例如:


“你是一名客服代表。你的目标是在提供事实信息的同时尽可能提供帮助。你应该友善,但不要过于啰嗦。下面是上下文信息。根据上下文信息而不是先验知识回答查询。”


5. 尝试元数据过滤


提高检索效果的一种非常有效的策略是给你的分块添加元数据,并使用它来帮助处理结果。日期是常见的元数据标签,因为它允许你按照最近性进行过滤。想象一下,你正在构建一个允许用户查询他们的电子邮件历史记录的应用程序。最近的电子邮件可能更相关。但我们不知道它们是否与用户的查询在嵌入空间中的相似度最高。这提醒了我们在构建RAG时要牢记的一个普遍概念:相似≠相关。你可以将每封电子邮件的日期附加到其元数据中,然后在检索过程中优先考虑最近的上下文。LlamaIndex具有内置的节点后处理器类,可以帮助处理这个问题。


6. 使用查询路由


通常有多个索引非常有用。然后,当查询进来时,你将其路由到适当的索引。例如,你可以有一个索引处理总结性问题,另一个索引处理特定问题,还有一个索引适用于日期相关的问题。如果你尝试优化一个索引来处理所有这些行为,你最终会在所有这些行为上妥协。相反,你可以将查询路由到适当的索引。另一个用例是将某些查询重定向到前面提到的基于关键字的索引。


一旦你构建好了索引,你只需要在文本中定义每个索引应该用于什么。然后,在查询时,LLM将选择适当的选项。LlamaIndex和LangChain都有用于此的工具。


7. 研究重新排序


重新排序是解决相似性和相关性之间差异问题的一种方法。通过重新排序,你的检索系统像往常一样获取上下文的前几个节点。然后,它根据相关性重新排序它们。Cohere Rereanker通常用于这个目的。这是我经常看到专家推荐的策略。无论用例如何,如果你正在使用RAG构建系统,应该尝试一下重新排序,看看是否可以改进你的系统。LlamaIndex和LangChain都有抽象化工具,可以轻松设置。


8. 考虑查询转换


你已经通过将用户的查询放在基本提示中来改变了查询。甚至可以进一步修改它。以下是一些示例:


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


HyDE:HyDE是一种策略,它接受一个查询,生成一个假设性的响应,然后同时使用两者进行嵌入查找。研究人员发现,这可以大大提高性能。


子查询:LLM在将复杂查询分解为多个问题时往往会表现更好。你可以将这种功能构建到你的RAG系统中,例如将查询分解为多个问题。


9. 优化嵌入模型


基于嵌入的相似性是RAG的标准检索机制。你的数据被拆分并嵌入到索引中。当有查询进来时,它也被嵌入以便与索引中的嵌入进行比较。但进行嵌入的是什么?通常是一个预训练模型,如OpenAI的text-embedding-ada-002。


问题是,预训练模型对嵌入空间中的相似性的理解可能与你的上下文中的相似性不太吻合。想象一下你正在处理法律文件。你希望嵌入基于你的特定领域术语如“知识产权”或“违反合同”来判断相似性,而不是一般术语如“本协议”或“同意”。


你可以优化嵌入模型来解决这个问题。这样做可以提高检索度量指标5%至10%。这需要更多的工作,但可以显著提高检索性能。这个过程比你想象的要容易,因为LlamaIndex可以帮助你生成一个训练集。


10. 开始使用LLM开发工具


你很可能已经在使用LlamaIndex或LangChain构建系统。这两个框架都有有用的调试工具,允许你定义回调函数,查看使用了哪些上下文,检索来自哪个文档等等。


如果你发现这些框架内置的工具不够用,还有一个越来越多的工具生态系统,可以帮助你深入了解你的RAG系统的内部工作。Arize AI有一个笔记本工具,可以让你探索检索的上下文及其原因。Rivet是一个提供可视化界面来帮助你构建复杂代理的工具。这个工具由法律技术公司Ironclad开源。新的工具不断发布,值得尝试,看看哪些对你的工作流程有帮助。


结论


使用RAG构建系统可能令人沮丧,因为它很容易让其工作,但很难让其工作得好。我希望上述策略能够给你一些灵感,帮助你弥合这个差距。这些想法中没有一种在所有情况下都适用,这个过程需要试验、尝试和错误。

文章来源:https://medium.com/towards-data-science/10-ways-to-improve-the-performance-of-retrieval-augmented-generation-systems-5fa2cee7cd5c
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消