四大核心设计模式——ReAct、Plan-and-Execute、Reflection、Multi-Agent,从理论原理到代码实现全面掌握
Agent 设计模式是指导 LLM 智能体如何思考、如何行动、如何改进的架构范式。不同模式适用于不同复杂度的任务:简单问答用 ReAct,复杂规划用 Plan-and-Execute,需要自我纠错用 Reflection,超大任务用 Multi-Agent。
理解这些模式是构建生产级 Agent 系统的基础。Andrew Ng 在 2024 年将这四大模式称为"Agentic Design Patterns",认为它们是 AI 应用的关键架构选择。
推理 + 行动循环,边想边做,适合工具调用场景
先规划后执行,适合多步骤复杂任务
自我反思与纠错,提升输出质量
多个专家 Agent 协作,分工完成大任务
ReAct 由 Shunyu Yao 等人在 2022 年提出(论文:"ReAct: Synergizing Reasoning and Acting in Language Models"),核心思想是让 LLM 在 推理(Thought)和行动(Action)之间交替循环。
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
model = ChatOpenAI(model="gpt-4o")
tools = [TavilySearchResults(max_results=3)]
# 一行代码创建 ReAct Agent
agent = create_react_agent(model, tools)
# 执行
result = agent.invoke({
"messages": [("human", "2026年最流行的AI框架是什么?")]
})
# 流式输出 Thought → Action → Observation 过程
for chunk in agent.stream(
{"messages": [("human", "比较 LangChain 和 LlamaIndex")]}
):
print(chunk)
来源于 Wang et al. 2023 论文 "Plan-and-Solve Prompting",核心思想是将任务分为两阶段:Planner 生成分步计划,Executor 逐步执行。计划可以动态调整(re-plan)。
| 维度 | ReAct | Plan-and-Execute |
|---|---|---|
| 思考粒度 | 每步即时思考 | 先全局规划 |
| 适合任务 | 简单、1-3步 | 复杂、5步以上 |
| 执行方式 | 边想边做 | 先定计划再执行 |
| 纠错能力 | 下一步纠正 | Re-plan 调整全局 |
| Token 消耗 | 较低 | 较高(需规划步骤) |
from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated
import operator
class PlanExecuteState(TypedDict):
input: str
plan: list[str]
current_step: int
results: Annotated[list, operator.add]
final_answer: str
# Planner:生成执行计划
async def planner(state: PlanExecuteState):
plan_prompt = f"""为以下任务制定分步执行计划:
任务:{state['input']}
返回 JSON 格式的步骤列表。"""
response = await llm.ainvoke(plan_prompt)
return {"plan": parse_plan(response), "current_step": 0}
# Executor:执行当前步骤
async def executor(state: PlanExecuteState):
step = state["plan"][state["current_step"]]
result = await react_agent.ainvoke({"messages": [("human", step)]})
return {
"results": [result],
"current_step": state["current_step"] + 1
}
# Re-planner:根据执行结果调整计划
async def re_planner(state: PlanExecuteState):
if state["current_step"] >= len(state["plan"]):
return {"final_answer": synthesize(state["results"])}
# 检查是否需要调整计划...
return {}
# 构建图
graph = StateGraph(PlanExecuteState)
graph.add_node("planner", planner)
graph.add_node("executor", executor)
graph.add_node("re_planner", re_planner)
graph.add_edge(START, "planner")
graph.add_edge("planner", "executor")
graph.add_edge("executor", "re_planner")
graph.add_conditional_edges("re_planner", should_continue)
Reflection 模式的核心是让 Agent 审视自己的输出并迭代改进。论文来源包括 Shinn et al. 2023 "Reflexion: Language Agents with Verbal Reinforcement Learning" 和 Madaan et al. 2023 "Self-Refine"。
同一个 LLM 先生成、再自我批评、然后改进
独立的批评者 Agent 审查输出,提出改进建议
用代码执行、单元测试等工具验证输出正确性
from langgraph.graph import StateGraph, START, END
class ReflectionState(TypedDict):
task: str
draft: str
critique: str
iteration: int
final: str
async def generate(state):
"""生成初始草稿"""
draft = await llm.ainvoke(f"完成任务:{state['task']}")
return {"draft": draft.content, "iteration": 1}
async def reflect(state):
"""反思并批评"""
critique = await llm.ainvoke(
f"""审查以下内容并指出问题:
草稿:{state['draft']}
请列出具体的改进建议。"""
)
return {"critique": critique.content}
async def improve(state):
"""基于反思改进"""
improved = await llm.ainvoke(
f"""根据批评意见改进:
原稿:{state['draft']}
批评:{state['critique']}
生成改进版本。"""
)
return {
"draft": improved.content,
"iteration": state["iteration"] + 1
}
def should_continue(state):
if state["iteration"] >= 3: # 最多 3 轮
return "finalize"
return "reflect"
graph = StateGraph(ReflectionState)
graph.add_node("generate", generate)
graph.add_node("reflect", reflect)
graph.add_node("improve", improve)
graph.add_node("finalize", lambda s: {"final": s["draft"]})
graph.add_edge(START, "generate")
graph.add_conditional_edges("generate", should_continue)
graph.add_edge("reflect", "improve")
graph.add_conditional_edges("improve", should_continue)
graph.add_edge("finalize", END)
Multi-Agent 模式将一个大任务分配给多个专业化 Agent,每个 Agent 负责特定领域。核心挑战在于通信协议、任务分配和冲突解决。
一个主管 Agent 负责调度和分配任务给子 Agent
Agent 按顺序轮流处理,每个 Agent 改进前一个的输出
多个 Agent 辩论讨论,在分歧中逼近正确答案
多层级 Agent 树,高层规划、低层执行
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import create_react_agent
# 定义专业 Agent
researcher = create_react_agent(llm, [search_tool],
prompt="你是研究员,负责搜索和收集信息")
writer = create_react_agent(llm, [write_tool],
prompt="你是写作专家,负责撰写内容")
reviewer = create_react_agent(llm, [],
prompt="你是审稿人,负责审查和改进文稿")
# Supervisor 决策
async def supervisor(state):
decision = await llm.ainvoke(
f"""你是项目主管。根据当前状态决定下一步:
可选 Agent: researcher, writer, reviewer, FINISH
当前进度: {state['progress']}
输出 JSON: {{"next": "agent_name"}}"""
)
return {"next": parse_next(decision)}
# 构建 Supervisor 图
graph = StateGraph(TeamState)
graph.add_node("supervisor", supervisor)
graph.add_node("researcher", researcher_node)
graph.add_node("writer", writer_node)
graph.add_node("reviewer", reviewer_node)
graph.add_edge(START, "supervisor")
graph.add_conditional_edges("supervisor", route_to_agent)
Tool Use(Function Calling)是几乎所有 Agent 模式的基础——让 LLM 能够调用外部工具获取信息或执行操作。
| 阶段 | 方式 | 代表 |
|---|---|---|
| 文本解析 | LLM 输出特定格式文本,正则解析 | 早期 ReAct |
| Function Calling | 模型原生支持结构化工具调用 | GPT-3.5/4 Function Calling |
| Tool Calling | 统一的工具调用协议,支持并行 | GPT-4o, Claude 3 |
| MCP 协议 | 标准化工具发现和调用协议 | Anthropic MCP (2024) |
| 维度 | ReAct | Plan-Execute | Reflection | Multi-Agent |
|---|---|---|---|---|
| 复杂度 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 适合任务 | 简单查询+工具 | 多步骤规划 | 代码/文档生成 | 大型项目 |
| Token 成本 | 低 | 中 | 中-高 | 高 |
| 延迟 | 低 | 中 | 高(多轮迭代) | 中(可并行) |
| 输出质量 | 一般 | 好 | 优 | 优 |
| 可控性 | 有限 | 好 | 好 | 复杂但灵活 |
| 典型框架 | LangGraph | LangGraph | LangGraph | CrewAI, AutoGen |
构建一个能够接受研究主题、自动搜索资料、撰写报告、自我审查并改进的研究助手,融合 Plan-Execute + Reflection + Multi-Agent 三种模式。