Agent 模式与实现¶
这篇整理常见 Agent 模式。
你提到的:
- ReAct 模式。
- Plan 模式。
都是 Agent 设计里的核心模式。
但现在主流工程里还会遇到:
- Plan-and-Execute。
- ReWOO。
- LLMCompiler。
- Reflexion。
- Tree of Thoughts。
- CodeAct。
- RAG Agent。
- Router / Handoff。
- Multi-Agent。
- Graph / Workflow Agent。
- Memory / Skill Library。
先记住一句话:
Agent 模式不是模型结构,而是“模型、工具、状态和控制流”的组织方式。
先看一张总表¶
| 模式 | 核心思想 | 适合场景 | 主要代价 |
|---|---|---|---|
| ReAct | reasoning 和 action 交替进行 | 工具问答、搜索、简单任务执行 | 多轮调用,成本和延迟高 |
| Plan-and-Execute | 先规划,再逐步执行 | 长任务、复杂目标 | 计划可能过时,需要重规划 |
| ReWOO | 先生成推理计划和工具占位,再批量执行工具 | 多步查询、减少重复 prompt | 对计划质量依赖高 |
| LLMCompiler | 把任务编译成可并行执行的 DAG | 多工具、多依赖、高性能执行 | 实现复杂 |
| Reflexion | 失败后反思,把经验写入记忆 | 可重试任务、代码、游戏、长任务 | 需要可靠反馈信号 |
| Tree of Thoughts | 探索多条推理路径并选择 | 搜索型问题、规划、谜题 | 调用次数多 |
| CodeAct | 用可执行代码作为动作空间 | 编程、数据分析、API 编排 | 需要沙箱和权限控制 |
| RAG Agent | 检索资料后回答或行动 | 知识问答、企业文档 | 检索质量决定上限 |
| Router / Handoff | 根据任务路由给工具或专家 | 多能力系统、客服、企业助手 | 路由错会导致全链路错 |
| Multi-Agent | 多个角色协作 | 复杂任务、评审、分工 | 通信成本和状态管理复杂 |
| Graph / Workflow | 用图或状态机约束 Agent 流程 | 生产系统、可控流程 | 灵活性比自由 Agent 低 |
| Memory / Skill Library | 把成功经验沉淀成可复用技能 | 长期学习、代码助手、游戏 Agent | 记忆检索和版本管理复杂 |
Agent 产品化工程继续看:Harness Engineering:把模型变成可用 Agent 的工程。
Agent 循环、停止条件和恢复继续看:Loop Engineering:Agent 循环、停止条件与恢复。
Multi-Agent、A2A 停止条件、自进化和记忆系统会单独展开,继续看:Multi-Agent 协作、自进化与记忆系统。
ReAct 模式¶
ReAct 来自 “Reasoning + Acting”。
它的核心是:
Thought
↓
Action
↓
Observation
↓
Thought
↓
Action
↓
Observation
↓
Final Answer
模型不是一次性回答,而是边推理边调用工具。
例子¶
用户问:
OpenAI 最新的模型文档里推荐哪个文本生成接口?
ReAct 轨迹可能是:
Thought: 这个问题需要查当前文档。
Action: web_search("OpenAI text generation Responses API recommended")
Observation: 找到 OpenAI 文档。
Thought: 需要确认是否提到 Responses API。
Action: open_doc(...)
Observation: 文档说新项目推荐 Responses API。
Final Answer: 文本生成新项目优先看 Responses API。
实现伪代码¶
while True:
response = llm(messages, tools=tools)
if response.tool_call:
result = run_tool(response.tool_call)
messages.append({
"role": "tool",
"content": result,
})
continue
return response.final_answer
适合什么¶
ReAct 适合:
- 搜索问答。
- 工具调用。
- 简单代码任务。
- 需要根据观察结果调整下一步的任务。
不适合什么¶
ReAct 不适合:
- 步骤很多的长任务。
- 可以并行执行的多工具任务。
- 对成本和延迟非常敏感的任务。
因为它每一步都要:
LLM -> tool -> LLM -> tool
调用次数容易变多。
Plan-and-Execute 模式¶
Plan-and-Execute 把规划和执行拆开。
它的核心是:
Planner: 先列计划
↓
Executor: 按步骤执行
↓
必要时 Replanner 更新计划
例子¶
用户说:
帮我调研 vLLM、SGLang、llama.cpp,并写一个对比文档。
Planner 可能先生成:
1. 查 vLLM 官方文档。
2. 查 SGLang 官方文档。
3. 查 llama.cpp README。
4. 整理适用场景。
5. 写对比表。
6. 给选择建议。
Executor 再逐步执行。
实现伪代码¶
plan = planner(goal)
for step in plan.steps:
result = executor(step, state)
state.add(step, result)
if should_replan(state):
plan = replanner(goal, state)
return synthesizer(goal, state)
适合什么¶
适合:
- 长任务。
- 多步骤研究。
- 代码迁移。
- 文档生成。
- 复杂操作流程。
风险¶
Plan-and-Execute 的风险是:
- 初始计划可能错。
- 环境变化后计划过时。
- 执行器机械执行错误计划。
所以实际实现里经常要加:
replan
checkpoint
human approval
trace
ReWOO 模式¶
ReWOO 是 Reasoning WithOut Observation。
它和 ReAct 的区别是:
ReAct: 每一步拿到 observation 后再想下一步
ReWOO: 先把推理和工具占位计划写出来,再执行工具
典型流程¶
Planner 生成带变量的计划
↓
Worker 执行工具调用,填充变量
↓
Solver 根据工具结果生成答案
例子:
Plan:
E1 = search("vLLM OpenAI compatible server")
E2 = search("SGLang OpenAI compatible API")
E3 = search("llama.cpp server README")
Answer = compare(E1, E2, E3)
工具可以按计划执行,最后统一求解。
适合什么¶
适合:
- 多个查询相对独立。
- 想减少 LLM 反复读长 prompt。
- 工具调用成本比模型调用低。
风险¶
不适合强依赖实时观察的任务。
如果第一个工具结果会改变第二步的方向,ReAct 或 Plan-and-Execute 更稳。
LLMCompiler 模式¶
LLMCompiler 可以理解成:
把自然语言任务编译成可执行任务图。
它不是简单线性计划,而是 DAG:
Task A: 搜索 vLLM
Task B: 搜索 SGLang
Task C: 搜索 llama.cpp
Task D: 对比 A/B/C
A、B、C 可以并行。
D 依赖 A、B、C。
实现直觉¶
dag = compiler(goal)
ready_tasks = dag.get_ready_tasks()
run_parallel(ready_tasks)
while not dag.done():
ready_tasks = dag.get_ready_tasks()
run_parallel(ready_tasks)
return finalizer(dag.results)
适合什么¶
适合:
- 多工具并行。
- 数据依赖明确。
- 对延迟敏感。
- 复杂研究和批处理任务。
代价¶
实现复杂,需要任务图、依赖管理、错误恢复和结果合并。
Reflexion 模式¶
Reflexion 的核心是:
Agent 失败后,用自然语言反思失败原因,并把反思写入记忆,下一次尝试时使用。
它不一定更新模型参数。
它更新的是:
memory / reflection
流程¶
执行任务
↓
得到反馈:成功 / 失败 / 分数 / 报错
↓
生成 reflection
↓
保存到 episodic memory
↓
下一次尝试时读取 reflection
例子¶
代码 Agent 第一次修 bug 失败:
测试失败:AuthServiceTest.testExpiredToken
Reflection:
上次失败原因:只修改了 Controller,没有修改 Service 层的 token 过期判断。
下次应该先定位 token validation 逻辑,再改测试覆盖的核心路径。
适合什么¶
适合:
- 可重试任务。
- 有明确反馈的任务。
- 编程任务。
- 游戏或环境探索。
风险¶
如果反馈本身不可靠,reflection 会把错误经验写进记忆。
Tree of Thoughts 模式¶
Tree of Thoughts,简称 ToT。
它的核心是:
不只生成一条推理链,而是探索多条候选思路,再评估和选择。
流程¶
生成多个 thought
↓
给每个 thought 打分
↓
选择更好的 thought 扩展
↓
必要时回溯
↓
得到最终答案
适合什么¶
适合:
- 谜题。
- 规划。
- 数学。
- 需要搜索的复杂问题。
- 早期选择会严重影响结果的任务。
代价¶
调用次数很多。
生产系统里一般不会默认对所有请求使用 ToT,而是只在高价值复杂任务里启用。
CodeAct 模式¶
CodeAct 的核心是:
让 Agent 用可执行代码作为动作。
不是让模型输出:
{"tool": "search", "query": "..."}
而是让模型输出可执行代码:
docs = search("vLLM OpenAI-compatible server")
summary = summarize(docs)
print(summary)
系统在沙箱里执行代码,再把结果返回给模型。
适合什么¶
适合:
- 编程任务。
- 数据分析。
- 多 API 编排。
- 需要循环、条件、变量和中间计算的任务。
风险¶
CodeAct 必须有强沙箱。
要限制:
- 文件系统。
- 网络。
- 进程。
- 环境变量。
- 凭据。
- 执行时间。
RAG Agent 模式¶
RAG Agent 是把检索作为核心工具的 Agent。
流程:
用户问题
↓
判断是否需要检索
↓
生成 query
↓
检索文档
↓
选择相关片段
↓
基于证据回答
适合什么¶
适合:
- 企业知识库。
- 文档问答。
- 法规、产品、内部流程。
- 需要引用证据的回答。
关键点¶
RAG Agent 的效果主要取决于:
- query 改写。
- 文档切片。
- rerank。
- context precision。
- context recall。
- answer faithfulness。
如果检索错了,模型再强也容易答错。
Router / Handoff 模式¶
Router 模式让一个模型先判断任务类型,再转给不同工具或子 Agent。
用户请求
↓
Router
↓
代码 Agent / 搜索 Agent / 数据库 Agent / 客服 Agent
Handoff 是更明确的移交:
当前 Agent 发现任务属于另一个专家
↓
把上下文和控制权交给专家 Agent
适合什么¶
适合:
- 多业务线客服。
- 多工具平台。
- 多专家系统。
- 复杂 Agent 产品。
风险¶
路由错了,后面再强也会跑偏。
所以 router 要重点评测:
- 分类准确率。
- 是否该拒答。
- 是否该请求澄清。
- 是否该 handoff。
Multi-Agent 模式¶
Multi-Agent 是多个 Agent 协作。
常见形态:
Planner Agent
Executor Agent
Reviewer Agent
Research Agent
Coder Agent
例子¶
代码任务:
Planner:拆任务
Coder:改代码
Reviewer:审查风险
Tester:运行测试
Summarizer:写总结
适合什么¶
适合:
- 任务很复杂。
- 需要不同专业角色。
- 需要评审和反思。
- 需要并行探索。
风险¶
Multi-Agent 不天然更强。
它会带来:
- 上下文同步问题。
- 成本增加。
- 多 agent 互相污染。
- 责任边界不清。
- 调试困难。
第一版产品一般先做好单 Agent,再拆多 Agent。
Graph / Workflow Agent¶
Graph / Workflow Agent 用图或状态机约束流程。
它不像自由 Agent 那样每一步都完全让模型决定。
例子:
Start
↓
Classify Intent
↓
Retrieve Docs
↓
Generate Answer
↓
Check Safety
↓
Return
如果安全检查失败:
Check Safety -> Refuse / Escalate
适合什么¶
适合生产系统。
因为它:
- 可控。
- 可观测。
- 易评测。
- 容易插入人工审批。
- 容易做失败恢复。
风险¶
灵活性低一些。
如果任务开放度很高,图会变复杂。
Memory / Skill Library 模式¶
这个模式把成功经验沉淀下来。
例如 Voyager 这类长期 Agent 会维护技能库:
任务成功
↓
总结可复用技能
↓
保存代码或过程
↓
下次相似任务检索技能
↓
组合技能解决新任务
在代码 Agent 里也很常见:
- 记住项目构建命令。
- 记住测试方式。
- 记住用户偏好。
- 记住常见修复路径。
风险¶
记忆不是越多越好。
要处理:
- 过期。
- 冲突。
- 错误经验。
- 隐私。
- 检索噪声。
当前主流怎么选¶
如果你做产品,可以先按这个选择:
| 目标 | 推荐模式 |
|---|---|
| 普通工具调用 Agent | ReAct |
| 长任务 | Plan-and-Execute + Replan |
| 企业知识库问答 | RAG Agent + Graph |
| 代码/数据分析 Agent | CodeAct 或 ReAct + Shell/文件工具 |
| 多业务线客服 | Router / Handoff |
| 高可靠生产流程 | Graph / Workflow Agent |
| 复杂研究任务 | Plan-and-Execute、ReWOO、LLMCompiler |
| 需要自我改进 | Reflexion + Eval + Memory |
| 多角色协作 | Multi-Agent,但要谨慎 |
入门建议:
先实现 ReAct
↓
加 Plan-and-Execute
↓
用 Graph/Workflow 固化生产流程
↓
再考虑 Multi-Agent、Reflexion、ReWOO、LLMCompiler
和评测的关系¶
不同模式要评不同东西。
| 模式 | 重点评测 |
|---|---|
| ReAct | 工具选择、工具参数、是否过度调用 |
| Plan-and-Execute | 计划质量、执行完成率、重规划时机 |
| ReWOO | 计划变量是否正确、工具结果是否正确绑定 |
| Reflexion | reflection 是否真的改善下一次表现 |
| ToT | 候选生成和评分是否靠谱 |
| CodeAct | 代码安全、执行结果、沙箱边界 |
| RAG Agent | 检索准确率、faithfulness、引用质量 |
| Router / Handoff | 路由准确率、handoff 上下文是否完整 |
| Multi-Agent | 角色边界、通信成本、最终贡献 |
| Graph / Workflow | 节点正确率、边条件、失败恢复 |
所以 Agent 模式不是只影响代码结构,也决定了评测框架怎么设计。
最小实现顺序¶
建议这样学:
- 写一个 ReAct agent。
- 给它加 trace。
- 给它加 eval dataset。
- 把长任务改成 Plan-and-Execute。
- 把高频稳定流程改成 Graph。
- 给 RAG、工具调用、路由分别做评测。
- 最后再尝试 Reflexion、CodeAct、多 Agent。