一个朴素 RAG 系统的工作流程可以概括如下:RAG 系统使用用户查询从指定的数据源中进行检索,对检索结果进行重新排序,附加提示词,然后将它们发送给大语言模型(LLM)以生成最终答案。
当用户意图明确时,一个朴素 RAG 就足够了,因为答案包含在检索结果中,可以直接发送给 LLM。然而,在大多数情况下,用户意图模糊是常态,需要通过迭代查询来生成最终答案。例如,涉及总结多份文档的问题需要多步推理。这些场景需要 Agentic RAG,它在问答过程中引入了任务编排机制。
Agent 和 RAG 互为补充。Agentic RAG,顾名思义,是基于 Agent 的 RAG。Agentic RAG 和朴素 RAG 的主要区别在于,Agentic RAG 引入了动态的 Agent 编排机制,该机制会对检索结果进行评判,根据每个用户查询的意图重写查询,并采用“多跳”推理来处理复杂的问答任务。
接下来,让我们通过两个高级 RAG 示例来探究 Agentic RAG 的工作原理。第一个是 Self-RAG(参考文献[1]),其工作流程如下所示。
Self-RAG 是一种反思型 RAG。它在从知识库中检索到结果后,会评估检索到的结果是否与用户查询相关。如果认为不相关,它会重写查询并重复 RAG 循环,直到相关性得分达到设定的阈值。一个完整的 Self-RAG 需要实现以下两个主要组件:
- 一个基于图的任务编排系统。
- 必要的算子:评分算子对 Self-RAG 至关重要。虽然理论上需要训练一个评分模型来评估检索结果,但在实践中,使用 LLM 进行评分可以减少对其他系统组件的依赖,并简化系统设计。
Self-RAG 是 Agentic RAG 一种相对初级的形式,RAGFlow 在其系统设计中已经集成了 Self-RAG 的实现。实践证明,实现 Self-RAG 能显著提高复杂的多跳问答和多步推理的性能。
现在,让我们来探究另一种形式的 Agentic RAG——Adaptive RAG(参考文献[2])。它可以根据不同的用户查询意图调整其策略:
- 开放域问答:直接通过 LLM 生成答案,不依赖 RAG 进行检索。
- 多跳问答:将多跳查询分解为多个单跳查询,迭代地使用这些更基础的查询来访问 LLM 和 RAG 检索器,并结合检索到的结果生成最终答案。
- 自适应检索:适用于需要多步推理的复杂查询。复杂的问答通常涉及综合来自多个数据源的信息并进行多步推理。自适应检索会迭代地访问 LLM 和 RAG 检索器,以逐步构建回答复杂问题所需的信息链。
如下图所示,Adaptive-RAG 的工作流程与 Self-RAG 类似。通过在其工作流程的开始阶段增加一个额外的查询分析,Adaptive-RAG 提供了更广泛的问答策略。
从以上两个 Agentic RAG 的例子中可以看出,这些高级 RAG 系统需要任务编排机制来提供以下功能:
- 复用现有流程或子图。
- 与第三方工具协作,包括网络搜索。
- 查询任务规划,例如查询意图分类和反馈。
开发 Agent 的框架包括最近由 Databricks 推出的 Mosaic AI Agent Framework 和 AgentKit;任务编排框架则有 Langchain 中的 LangGraph 和 llamaIndex。任务编排系统必须使用图来实现,其节点和边定义了应用程序的工作流程和逻辑。图中的节点可以是任何可调用的算子或可执行的“组件”(例如,链式算子或 Agent),每个节点执行一个特定任务。边将节点连接在一起,并建立它们之间的数据流。图必须维护节点状态管理,以适应其节点的流动。
值得注意的是,这种基于图的任务编排实现需要循环,并且不同于 DAG(有向无环图)。循环是反思的基础,因此对于 Agentic RAG 中的任务编排至关重要。一个缺乏反思能力的 Agentic RAG 将无法像人类一样思考或解决问题。它只能提供类似于工作流的任务编排,而无法实现更高级的任务,如多跳和多步推理。吴恩达(Andrew Ng)对四种 Agent 设计模式的定义(参考文献[3])将反思与其他三种与工作流相关的模式——工具使用、规划和多 Agent——区分开来。这种区分凸显了反思作为思考和推理基础的关键作用。Agentic RAG 体现了这种设计模式。
Agentic RAG 代表了信息处理方式的转变,为 Agent 本身带来了更多的智能。当与工作流结合时,Agentic RAG 将拥有更广泛的应用范围。例如,在文档摘要场景中,Agentic RAG 会首先判断用户的意图是请求摘要还是比较细节。如果是前者,它将使用 Agent 检索每个文档块的摘要,然后将它们组合起来生成整体摘要;如果是后者,则需要通过进一步的路由检索更多相关数据,然后再发送给 LLM。在客户支持场景中,Agentic RAG 可以理解更复杂的客户查询,并提供个性化和准确的响应。在文献聊天机器人场景中,Agentic RAG 可以综合更多的文档、数据和研究成果,为用户提供更全面的理解。在法律和医疗聊天机器人场景中,Agentic RAG 可以帮助理解和解释复杂的领域知识,提供更精确的见解。在内容生成应用中,Agentic RAG 可以生成更高质量、与上下文相关的企业级长篇文档。
从 v0.8.0 版本开始,RAGFlow 将支持基于图的任务编排,并在此基础上实现无代码编辑。RAGFlow 也在不断改进各种特定于检索的算子,以简化 Agentic RAG 和基于 Agentic RAG 的 Agent 应用的开发,全面解决企业级 RAG 应用中的痛点。RAGFlow 正在快速迭代,欢迎您关注、star 并积极参与 RAGFlow。我们的 GitHub 仓库地址是 https://github.com/infiniflow/ragflow。
参考文献
- Self-RAG: Learning to retrieve, generate, and critique through self-reflection, arXiv 预印本 arXiv:2310.11511
- Adaptive-RAG: Learning to adapt retrieval-augmented large language models through question complexity, arXiv 预印本 arXiv:2403.14403
- https://www.deeplearning.ai/the-batch/issue-242/