检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示,RAG为LLM提供了有用的上下文,以产生基于事实的输出。
但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在限制了真实世界的RAG性能。多代理体系结构提供了一个理想的框架来克服这些挑战并释放RAG的全部潜力。通过划分职责,多代理系统允许专门的角色、并行执行和优化协作。
单代理RAG
当前的RAG系统使用单个代理来处理完整的工作流程——查询分析、段落检索、排序、摘要和提示增强。
这种单一的方法提供了一个简单的一体化解决方案。但是对每个任务依赖一个代理会导致瓶颈。代理会浪费时间从大量语料库中检索无关紧要的段落。长上下文的总结很糟糕,并且提示无法以最佳方式集成原始问题和检索到的信息。
这些低效率严重限制了实时应用程序的RAG的可伸缩性和速度。
多代理RAG
多代理体系结构可以克服单代理的限制。通过将RAG划分为并发执行的模块化角色可以实现:
- 检索:专用检索代理专注于使用优化的搜索技术进行有效的通道检索。这将最小化延迟。
- 搜索:通过排除检索因素,搜索可以在检索代理之间并行化,以减少等待时间。
- 排名:单独的排名代理评估检索的丰富度,特异性和其他相关信号的传代。这将过滤最大的相关性。
- 总结:将冗长的上下文总结成简洁的片段,只包含最重要的事实。
- 优化提示:动态调整原始提示和检索信息的集成。
- 灵活的体系:可以替换和添加代理来定制系统。可视化工具代理可以提供对工作流的洞察。
通过将RAG划分为专门的协作角色,多代理系统增强了相关性,减少了延迟,并优化了提示。这将解锁可伸缩的高性能RAG。
划分职责允许检索代理结合互补技术,如向量相似性、知识图谱和互联网抓取。这种多信号方法允许检索捕获相关性不同方面的不同内容。
通过在代理之间协作分解检索和排序,可以从不同的角度优化相关性。结合阅读和编排代理,它支持可伸缩的多角度RAG。
模块化架构允许工程师跨专门代理组合不同的检索技术。
Llama index的多代理 RAG
Llama index概述了使用多代理RAG的具体示例:
- 文档代理——在单个文档中执行QA和摘要。
- 向量索引——为每个文档代理启用语义搜索。
- 摘要索引——允许对每个文档代理进行摘要。
- 高阶(TOP-LEVEL)代理——编排文档代理以使用工具检索回答跨文档的问题。
对于多文档QA,比单代理RAG基线显示出真正的优势。由顶级代理协调的专门文档代理提供基于特定文档的更集中、更相关的响应。
下面我们看看Llama index是如何实现的:
我们将下载关于不同城市的Wikipedia文章。每篇文章都是单独存储的。我们只找了18个城市,虽然不是很大,但是这已经可以很好的演示高级文档检索的功能。
下面是城市的列表:
下面是下载每个城市文档代码:
加载下载的文档
定义LLM +上下文+回调管理器
我们为每个文档定义“文档代理”:为每个文档定义向量索引(用于语义搜索)和摘要索引(用于摘要)。然后将这两个查询引擎转换为传递给OpenAI函数调用工具。
文档代理可以动态选择在给定文档中执行语义搜索或摘要。我们为每个城市创建一个单独的文档代理。
下面就是高阶代理,它可以跨不同的文档代理进行编排,回答任何用户查询。
高阶代理可以将所有文档代理作为工具,执行检索。这里我们使用top-k检索器,但最好的方法是根据我们的需求进行自定义检索。
作为比较,我们定义了一个“简单”的RAG管道,它将所有文档转储到单个矢量索引集合中。设置top_k = 4
让我们运行一些示例查询,对比单个文档的QA /摘要到多个文档的QA /摘要。
结果如下:
下面我们看看上面的简单RAG管道的结果
可以看到我们构建的多代理系统的结果要好的多。
总结
RAG系统必须发展多代理体系结构以实现企业级性能。正如这个例子所说明的,划分职责可以在相关性、速度、摘要质量和及时优化方面获得收益。通过将RAG分解为专门的协作角色,多代理系统可以克服单代理的限制,并启用可扩展的高性能RAG。