1 ReAct
摘要:本文系统梳理了五种主流 Agent 架构模式:ReAct(思考-行动-观察循环)、Plan & Execute(规划与执行分离)、Multi-Agent(多智能体协作)、RAG + Agent(检索增强型 Agent)以及 Tool Use / Function Calling(工具调用)。每种模式均从核心思想、工作流程、代码示例、适用场景等维度展开,帮助读者快速理解不同架构的设计理念与选型依据。
1.1 核心思想
让模型在**思考(Thought)→ 行动(Action)→ 观察(Observation)**之间循环,直到得出最终答案。
未完成
得出答案
用户输入
Thought 思考
Action 行动
Observation 观察
Final Answer 最终答案
1.2 例子
用户:"北京今天天气怎么样,适合跑步吗?"
Thought 1: 我需要查询北京今天的天气数据。
Action 1: search("北京今天天气")
Observation 1: 北京今天晴,气温 22°C,PM2.5 35,微风。
Thought 2: 天气不错,但还需要判断是否适合跑步。
Action 2: 根据数据直接推理。
Observation 2: 气温适宜,空气质量良好。
Final Answer: 今天适合跑步,建议早晨 7-9 点出门。
1.3 核心优势
- 推理过程完全透明,便于调试。
- 中间步骤可被人工干预。
- 失败时容易定位是哪一步的问题。
1.4 核心缺陷
- 没有全局规划,容易陷入局部循环。
- Token 消耗随步骤线性增长。
- 工具调用失败时恢复能力弱。
1.5 代码示例(LangChain)
python
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
# 拉取标准 ReAct prompt 模板
prompt = hub.pull("hwchase17/react")
tools = [search_tool, calculator_tool]
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
executor.invoke({"input": "上海今天天气适合跑步?"})
用户输入 → 思考 → 行动 → 观察 → 思考 → 输出最终答案。
典型实现是 LangChain 的 AgentExecutor。
1.6 适用场景
信息检索、问答系统、简单任务自动化。
2 Plan & Execute(规划 + 执行)
2.1 核心思想
将"想清楚做什么"和"执行"彻底拆开,由两个不同的角色承担。
用户任务
Planner 规划器
全局计划
Executor 执行器
子任务 1
子任务 2
子任务 3
结果汇总
最终输出
2.2 角色分工
| 角色 | Planner(规划器) | Executor(执行器) |
|---|---|---|
| 模型 | 使用强模型(如 Claude Opus 4.7) | 可用较弱模型(如 Claude Sonnet 4.6 / GPT-4 / Gemini 3.1) |
| 职责 | 一次性生成全局计划 | 逐步执行每个子任务 |
| 说明 | 负责任务分解与顺序 | 负责单步工具调用 |
(注:模型选择应结合实际任务复杂度和成本控制。)
2.3 适用场景
需要 10+ 步骤的复杂任务、研究报告生成、软件项目自动化。
3 Multi-Agent(多智能体协作)
3.1 核心思想
单个 Agent 能力有限,多个专职 Agent 分工合作,由 Orchestrator 统一调度。
用户
Orchestrator 总调度
Research Agent
搜索与检索
Code Agent
编写与运行代码
Data Agent
数据分析
Writer Agent
生成报告
汇总结果
最终输出
3.2 两种协作拓扑
① 中心化(Hub & Spoke)--- 最常见
用户
└→ Orchestrator(总调度)
├→ Research Agent [负责搜索、检索]
├→ Code Agent [负责写代码、运行]
├→ Data Agent [负责数据分析]
└→ Writer Agent [负责生成报告]
② 去中心化(Pipeline 流水线)
用户 → Agent A → Agent B → Agent C → 输出
↑____________反馈循环____________↓
3.3 适用场景
软件开发自动化(写代码→测试→修复)、复杂研究、客服系统。
4 RAG + Agent(检索增强型 Agent)
4.1 核心思想
Agent 不依赖模型内部知识,而是按需从外部知识库动态检索,将检索作为一种特殊 Tool。
是
是
不够
足够
否
用户问题
Agent 判断
需要检索?
检索知识库 A
产品文档
检索知识库 B
历史工单
结果足够?
重写查询词
汇总多源结果
生成答案
直接推理
4.2 两种检索策略对比
① Naive RAG(简单版)
问题 → 向量检索 → Top-K 文档 → 直接注入 Prompt → 生成答案
问题:检索一次,质量完全依赖第一次召回
② Agentic RAG(Agent 版)
问题 → Agent 判断:需要检索哪些内容?
├→ 检索知识库 A(产品文档)
├→ 检索知识库 B(历史工单)
└→ 检索不够?→ 重写查询词 → 再次检索
↓
汇总多源结果 → 生成答案
4.3 核心组件
python
from langchain.tools.retriever import create_retriever_tool
# 将向量检索包装成 Tool
retriever_tool = create_retriever_tool(
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
name="knowledge_base_search",
description="搜索产品知识库,当需要回答产品相关问题时使用"
)
# Agent 自主决定何时调用检索
agent = create_react_agent(llm, tools=[retriever_tool, ...], prompt=prompt)
5 Tool Use / Function Calling
5.1 核心思想
模型原生支持结构化输出工具调用参数,不依赖 Prompt 工程解析。
是
否
用户输入
LLM 模型
是否需要工具?
结构化工具参数
并行调用工具
get_weather 北京
get_weather 上海
get_weather 广州
汇总结果
生成最终回答
5.2 工具定义规范
python
tools = [
{
"name": "get_weather",
"description": "获取指定城市的实时天气信息",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
]
5.3 并行工具调用(重要优化)
python
# 模型可以一次返回多个工具调用,并行执行提升效率
# 示例:同时查询多个城市天气,而非串行
response.content = [
ToolUse(name="get_weather", input={"city": "北京"}),
ToolUse(name="get_weather", input={"city": "上海"}), # 并行!
ToolUse(name="get_weather", input={"city": "广州"})
]