一个简单的RAG系统的工作流程可以总结如下:RAG系统使用用户查询从指定的数据源进行检索,对检索结果进行重新排序,附加提示,并将其发送给LLM以生成最终答案。

在用户意图明显的情况下,简单的RAG就足够了,因为答案包含在检索结果中,可以直接发送给LLM。然而,在大多数情况下,模糊的用户意图是常态,需要迭代查询以生成最终答案。例如,涉及总结多个文档的问题需要多步推理。这些场景需要代理RAG,它在问答过程中涉及任务编排机制。
Agent 和 RAG 相辅相成。Agentic RAG,顾名思义,是一种基于代理的 RAG。Agentic RAG 与普通 RAG 的主要区别在于,Agentic RAG 引入了动态代理编排机制,该机制对检索进行批评,根据每个用户查询的意图重写查询,并采用“多跳”推理来处理复杂的问答任务。
接下来,让我们通过两个高级RAG示例来探索代理RAG的工作原理。第一个是Self-RAG(参考文献[1]),其工作流程如下所示:

Self-RAG 是一种反思型 RAG。从知识库中检索结果后,它会评估检索到的结果是否与用户查询相关。如果认为不相关,则重写查询,并重复 RAG 循环,直到相关性分数达到设定的阈值。一个完整的 Self-RAG 需要实现以下两个主要组件:
- 一个基于图的任务编排系统。
- 必要的操作符:评分操作符对于Self-RAG至关重要。虽然理论上,训练一个评分模型来评估检索结果是理想的,但在实践中,使用LLM进行评分可以减少对其他系统组件的依赖,并简化系统设计。
Self-RAG 是代理 RAG 的一种相对初步形式,RAGFlow 在其系统设计中已经融入了 Self-RAG 的实现。实施 Self-RAG 已被证明能显著提高复杂多跳问答和多步推理的性能。
现在让我们探索另一种形式的代理RAG——自适应RAG(参考文献[2])。它可以根据不同的用户查询意图调整其策略:
- 开放域问答:直接通过LLM生成答案,而不依赖于通过RAG进行检索。
- 多跳问答:将多跳查询分解为多个单跳查询,迭代使用这些更基础的查询来访问LLM和RAG检索器,并结合检索到的结果生成最终答案。
- 自适应检索:适用于需要多步推理的复杂查询。复杂的问题解答通常涉及从多个数据源综合信息并进行多步推理。自适应检索通过迭代访问LLM和RAG检索器,逐步构建回答复杂问题所需的信息链。
如下图所示,Adaptive-RAG遵循与Self-RAG类似的工作流程。通过在其工作流程开始时实施额外的查询分析,Adaptive-RAG提供了更广泛的问题回答策略。
从上述两个代理RAG示例中可以看出,这些高级RAG系统需要任务编排机制来提供以下功能:
- 重用现有的管道或子图。
- 与第三方工具的协作,包括网络搜索。
- 查询任务规划,例如查询意图分类和反馈。

开发代理的框架包括最近由Databricks推出的Mosaic AI代理框架和AgentKit;任务编排框架涉及Langchain中的LangGraph和llamaIndex。任务编排系统必须使用图来实现,其节点和边定义了应用程序的工作流程和逻辑。图中的节点可以是任何可调用的操作符或可执行的“组件”(例如,链式操作符或代理),每个节点执行特定的任务。边将节点连接在一起,并在它们之间建立数据流。图必须维护节点状态管理,以适应其节点的流动。
值得注意的是,这种基于图的任务编排实现需要循环,并且与DAG(有向无环图)不同。循环对于反思是基础,因此在代理RAG中的任务编排中至关重要。缺乏反思的代理RAG将无法像人类一样思考或解决问题。它只能提供类似于工作流的任务编排,而无法实现更高级的任务,如多跳和多步推理。Andrew Ng对四种代理设计模式的定义(参考文献[3])将反思与其他三种与工作流相关的模式——工具使用、规划和多代理——分开。这种分离强调了反思作为思考和推理基础的关键作用。代理RAG体现了这种设计模式。
Agentic RAG 代表了信息处理的变革,为代理本身带来了更多的智能。当与工作流结合时,agentic RAG 将有更广泛的应用。例如,在文档摘要场景中,agentic RAG 会首先确定用户的意图是请求摘要还是比较细节。如果是前者,它将使用代理检索每个文档块的摘要,然后将它们组合生成整体摘要;如果是后者,则需要通过进一步的路由检索更多相关数据,然后再发送给LLM。在客户支持场景中,agentic RAG 可以理解更复杂的客户查询,并提供个性化和准确的响应。在文献聊天机器人场景中,agentic RAG 可以综合更多的文档、数据和研究结果,为用户提供更全面的理解。在法律和医疗聊天机器人场景中,agentic RAG 可以帮助理解和解释复杂的领域知识,提供更精确的见解。在内容生成应用中,agentic RAG 可以生成更高质量、上下文相关、企业级的长篇文档。
从v0.8.0开始,RAGFlow将支持基于图的任务编排,并在此基础上实现无代码编辑。RAGFlow还在不断改进各种检索特定的操作符,以简化基于代理RAG的代理应用程序的开发,全面解决企业级RAG应用中的痛点。RAGFlow正在快速迭代,欢迎您关注、点赞并积极参与RAGFlow。我们的GitHub仓库位于https://github.com/infiniflow/ragflow。
参考文献
- Self-RAG: 通过自我反思学习检索、生成和批评,arXiv 预印本 arXiv:2310.11511
- Adaptive-RAG: 通过学习问题复杂性来适应检索增强的大型语言模型,arXiv预印本 arXiv:2403.14403
- https://www.deeplearning.ai/the-batch/issue-242/
