Agentic RAG 登场:RAG 技术的进化之路
在 2023 年,检索增强生成(RAG)技术占据了主导地位,而在 2024 年,智能体工作流程正在推动巨大的进步。使用 AI 智能体为构建更强大的、健壮的、多功能的大型语言模型(LLM)驱动的应用开辟了新的可能性。其中一个可能性是在智能体 RAG 流程中增强 RAG 流程中的 AI 智能体。

智能体 RAG 的基础知识
什么是检索增强型生成(RAG)
检索增强生成(RAG)是一种构建 LLM 驱动应用的技术。它利用外部知识源为 LLM 提供相关上下文,减少幻觉现象。
一个简单的 RAG 流程包括一个检索组件(通常由一个嵌入模型和一个向量数据库组成)和一个生成组件(一个 LLM)。在推理时,用户查询用于在索引文档上运行相似性搜索,检索与查询最相似的文档,并为 LLM 提供额外的上下文。

典型的 RAG 应用有两个相当大的局限性:
- 简单的 RAG 流程只考虑一个外部知识源。然而,一些解决方案可能需要两个外部知识源,一些解决方案可能需要外部工具和 API,例如网络搜索。
- 它们是一次性解决方案,这意味着上下文只检索一次。没有对检索到的上下文的质量进行推理或验证。
AI 系统中的智能体是什么
随着 LLM 的流行,AI 智能体和多智能体系统的新范式已经出现。AI 智能体是具有角色和任务的 LLM,它们可以访问内存和外部工具。LLM 的推理能力帮助智能体规划所需的步骤并采取行动来完成手头的任务。
因此,AI 智能体的核心组件包括:
- LLM(具有角色和任务)
- 内存(短期和长期)
- 规划(例如,反思、自我批评、查询路由等)
- 工具(例如,计算器、网络搜索等)

一个流行的框架是 ReAct 框架。ReAct 智能体可以在保持状态(在内存中)的同时处理顺序多部分查询,通过将路由、查询规划和工具使用结合为一个单一实体。
ReAct = 推理 + 行动(使用 LLM)
这个过程包括以下步骤:
- 思考:在接收到用户查询后,智能体推理下一步行动
- 行动:智能体决定行动并执行它(例如,工具使用)
- 观察:智能体观察行动的反馈
这个过程一直迭代,直到智能体完成任务并响应用户。

什么是 Agentic RAG?
Agentic RAG 描述了基于 AI 智能体实现的 RAG。具体来说,它将 AI 智能体纳入 RAG 流程中,以协调其组件并执行超出简单信息检索和生成的额外行动,以克服非智能体流程的局限性。
Agentic RAG 描述了基于 AI 智能体实现的 RAG。
Agentic RAG 如何工作?
尽管智能体可以被纳入 RAG 流程的不同阶段,智能体 RAG 最常用于检索组件中的智能体。
具体来说,检索组件通过使用具有访问不同检索工具的检索智能体而变得智能体化,例如:
- 向量搜索引擎(也称为查询引擎),它在向量索引上执行向量搜索(像典型的 RAG 流程中一样)
- 网络搜索
- 计算器
- 任何用于以编程方式访问软件的 API,例如电子邮件或聊天程序
- 等等。
然后 RAG 智能体可以在以下示例检索场景中进行推理和行动:
- 决定是否检索信息
- 决定使用哪个工具检索相关信息
- 制定查询本身
- 评估检索到的上下文,并决定是否需要重新检索。
Agentic RAG 架构
与顺序的简单 RAG 架构相比,智能体 RAG 架构的核心是智能体。智能体 RAG 架构可以有不同程度的复杂性。在最简单的形式中,单智能体 RAG 架构是一个简单的路由器。然而,你也可以将多个智能体添加到多智能体 RAG 架构中。本节讨论了两个基本的 RAG 架构。
单智能体 RAG(路由器)
在其最简单的形式中,智能体 RAG 是一个路由器。这意味着你至少有两个外部知识源,智能体决定从哪一个检索额外的上下文。然而,外部知识源不必局限于(向量)数据库。你也可以从工具中检索更多信息。例如,你可以进行网络搜索,或者你可以使用 API 从 Slack 频道或你的电子邮件账户中检索额外的信息。

多智能体 RAG 系统
正如你可以猜到的,单智能体系统也有其局限性,因为它仅限于一个智能体进行推理、检索和答案生成。因此,将多个智能体链入多智能体 RAG 应用是有益的。
例如,你可以有一个主智能体,它协调多个专业检索智能体之间的信息检索。例如,一个智能体可以从专有的内部数据源检索信息。另一个智能体可以专门从你的个人账户(如电子邮件或聊天)检索信息。另一个智能体也可以专门从网络搜索中检索公共信息。

超越检索智能体
上述示例显示了使用不同的检索智能体。然而,你也可以使用智能体用于检索之外的其他目的。智能体在 RAG 系统中的可能性是多种多样的。
Agentic RAG 与(普通)RAG
虽然 RAG(发送查询、检索信息、生成响应)的基本概念保持不变,但工具使用扩展了它,使其更加灵活和强大。
可以这样想:普通的 RAG 就像在图书馆(在智能手机出现之前)回答一个具体问题。另一方面,智能体 RAG 就像手中有一部带有网络浏览器、计算器、电子邮件等的智能手机。
| 特性 | 普通 RAG | 智能体 RAG |
|---|
| 访问外部工具 | 否 | 是 |
| 查询预处理 | 否 | 是 |
| 多步骤检索 | 否 | 是 |
| 验证检索到的信息 | 否 | 是 |

实施智能体 RAG
如前所述,智能体由多个组件组成。要构建智能体 RAG 流程,有两种选择:具有函数调用的语言模型或智能体框架。两种实现都能达到相同的结果,只是取决于你想要的控制和灵活性。
具有函数调用的语言模型
语言模型是智能体 RAG 系统的主要组件。另一个组件是工具,它们使语言模型能够访问外部服务。具有函数调用的语言模型提供了一种构建智能体系统的方法,允许模型与预定义的工具进行交互。语言模型提供商已将此功能添加到他们的客户端中。
2023 年 6 月,OpenAI 为 gpt-3.5-turbo 和 gpt-4 发布了函数调用。它使这些模型能够可靠地将 GPT 的能力与外部工具和 API 连接起来。开发人员迅速开始构建应用程序,将 gpt-4 插入代码执行器、数据库、计算器等。
Cohere 进一步推出了他们的连接器 API,为 Command-R 模型套件添加工具。此外,Anthropic 和 Google 为 Claude 和 Gemini 发布了函数调用。通过为这些模型提供外部服务,它可以访问并引用网络资源,执行代码等。
函数调用不仅适用于专有模型。Ollama 为流行的开源模型如 Llama3.2、nemotron-mini 等引入了工具支持。
要构建一个工具,你首先需要定义一个函数。在这个片段中,我们正在编写一个使用 Weaviate 的混合搜索从数据库检索对象的函数:
def get_search_results(query: str) -> str:
"""Sends a query to Weaviate's Hybrid Search. Parses the response into a {k}:{v} string."""
response = blogs.query.hybrid(query, limit=5)
stringified_response = ""
for idx, o in enumerate(response.objects):
stringified_response += f"Search Result: {idx+1}:\n"
for prop in o.properties:
stringified_response += f"{prop}:{o.properties[prop]}"
stringified_response += "\n"
return stringified_response
然后将函数通过 tools_schema 传递给语言模型。该模式然后在提示中用于语言模型:
tools_schema=[{
'type': 'function',
'function': {
'name': 'get_search_results',
'description': 'Get search results for a provided query.',
'parameters': {
'type': 'object',
'properties': {
'query': {
'type': 'string',
'description': 'The search query.',
},
},
'required': ['query'],
},
},
}]
由于你直接连接到语言模型 API,你需要编写一个循环,该循环在语言模型和工具之间进行路由:
def ollama_generation_with_tools(user_message: str,
tools_schema: List, tool_mapping: Dict,
model_name: str = "llama3.1") -> str:
messages=[{
"role": "user",
"content": user_message
}]
response = ollama.chat(
model=model_name,
messages=messages,
tools=tools_schema
)
if not response["message"].get("tool_calls"):
return response["message"]["content"]
else:
for tool in response["message"]["tool_calls"]:
function_to_call = tool_mapping[tool["function"]["name"]]
print(f"Calling function {function_to_call}...")
function_response = function_to_call(tool["function"]["arguments"]["query"])
messages.append({
"role": "tool",
"content": function_response,
})
final_response = ollama.chat(model=model_name, messages=messages)
return final_response["message"]["content"]
然后你的查询将如下所示:
ollama_generation_with_tools("How is HNSW different from DiskANN?",
tools_schema=tools_schema, tool_mapping=tool_mapping)
智能体框架
DSPy、LangChain、CrewAI、LlamaIndex 和 Letta 等智能体框架的出现,为使用语言模型构建应用程序提供了便利。这些框架通过将预构建的模板组合在一起,简化了构建智能体 RAG 系统的过程。
- DSPy 支持 ReAct 智能体和 Avatar 优化。Avatar 优化描述了使用自动化提示工程来描述每个工具的使用。
- LangChain 为使用工具提供许多服务。LangChain 的 LCEL 和 LangGraph 框架进一步提供了内置工具。
- LlamaIndex 进一步引入了 QueryEngineTool,这是一个用于检索工具的模板集合。
- CrewAI 是开发多智能体系统的领先框架之一。用于工具使用的一个关键概念是智能体之间共享工具。
- Swarm 是由 OpenAI 构建的多智能体协调框架。Swarm 同样专注于智能体之间如何共享工具。
- Letta 将反映和提炼内部世界模型作为函数。这意味着可能使用搜索结果来更新聊天机器人用户的智能体内存,除了回答问题。

挑战与最佳实践
尽管 Agentic RAG 展现了巨大潜力,但在实际落地过程中仍面临诸多挑战。
1. 延迟与成本
智能体 RAG 涉及多次推理循环和工具调用,这显著增加了响应时间和计算成本。对于实时应用,需要优化智能体的决策路径,避免不必要的工具调用。
2. 可靠性与幻觉
虽然 RAG 旨在减少幻觉,但智能体在执行复杂任务时仍可能产生错误规划或错误调用工具。引入验证机制(如自我反思)和确定性约束有助于提高可靠性。
3. 安全性
智能体拥有执行外部操作的能力,这带来了安全风险。必须严格限制工具权限,防止提示注入攻击导致的数据泄露或恶意操作。
4. 评估体系
传统的 RAG 评估指标(如召回率)不足以衡量智能体 RAG 的效果。需要建立包含任务完成率、工具调用准确率、最终答案质量等多维度的评估体系。
总结
Agentic RAG 代表了检索增强生成技术的重要演进方向。通过引入智能体,系统不再局限于静态的知识检索,而是具备了动态规划、工具使用和自主决策的能力。选择合适的实现方案(原生函数调用或智能体框架),并关注延迟、安全及评估问题,将有助于构建真正高效、可靠的下一代 AI 应用。