Agentic RAG:基于多文档的 AI Agent 智能体构建指南
什么是 Agentic RAG
经典 RAG(Retrieval-Augmented Generation)应用的范式与架构已经非常流行,开发者甚至可以在很短的时间内借助成熟框架开发一个简单能用的 RAG 应用。其基本流程是:用户问题被输入 RAG 系统,应用执行检索操作,从被向量化的文档中检索相关知识块,最后送入大语言模型(LLM)进行合成响应。
然而,让我们考虑这样一个应用场景:企业中存在大量不同来源与类型的文档(在实际业务中并不一定代表'文件',也可以是某种非文件形态的信息,比如存放在关系型数据库 RDBMS 中的数据),现在需要在这些文档之上构建一个依赖于它们的、知识密集型的应用或工具。这些需求通常包括:
- 基于全局理解的文档后回答问题:例如,对某知识内容进行总结摘要?
- 跨文档与知识库的回答问题:例如,比较不同文档内容的区别?
- 结合非知识工具的复合场景:例如,从文档提取产品介绍并发送给指定客户?
这种复杂需求的场景如果使用经典 RAG 架构,通过 chunks + 向量 + top_K 检索来获得并插入上下文,直接让 LLM 来给出答案,显然是不现实的。经典 RAG 在回答文档相关的事实性问题时可以工作得不错,但是实际的知识应用并不总是这种类型!当然你也可以借助一些改进的 RAG 范式来提高应用场景的适应性,比如 RAPTOR(基于文档树的多级检索机制,有利于回答从细节到高层理解的多级问题),但在一些跨文档或者需要结合工具的场景仍然无法胜任。
这里介绍 Agentic RAG 方案:一种基于 AI Agent 的方法,借助 Agent 的任务规划与工具能力,来协调完成对多文档的、多类型的问答需求。它既能提供 RAG 的基础查询能力,也能提供基于 RAG 之上更多样与复杂任务能力。概念架构如下:

在这里的 Agentic RAG 架构中:
- RAG 应用退化成一个 Agent 使用的知识工具:你可以针对一个文档/知识库构建多种不同的 RAG 引擎,比如使用向量索引来回答事实性问题;使用摘要索引来回答总结性问题;使用知识图谱索引来回答需要更多关联性的问题等。
- ToolAgent 设置:在单个文档/知识库的多个 RAG 引擎之上设置一个 ToolAgent,把 RAG 引擎作为该 Agent 的工具(tools),并利用 LLM 的能力由 ToolAgent 在自己'负责'的文档内使用这些 tools 来回答问题。
- TopAgent 管理:设置一个总的顶级代理 TopAgent 来管理所有的低阶 ToolAgent,将 ToolAgent 看作自己的工具,仍然利用 LLM 来规划、协调、执行用户问题的回答方案。
以下使用 LlamaIndex 来实现这个架构(如果你是 LangChain 用户,也完全可以读懂并参考实现)。
实现 Agentic RAG
让我们来一步步实现简单的 Agentic RAG。
准备测试文档
首先这里准备三个 RAG 相关的测试 PDF 文档,其名称与路径分别保存。当然,在实际应用中,这里文档数量可以扩展到非常大(后面会看到针对大量文档的一个优化方法):
names = ['c-rag', 'self-rag', 'kg-rag']
files = ['../../data/c-rag.pdf', '../../data/self-rag.pdf', '../../data/kg-rag.pdf']
准备创建 Tool Agent 的函数
创建一个针对单个文档生成 Tool Agent 的函数,在这个函数中,将对一个文档创建两个索引与对应的 RAG 引擎:



