一、引言
随着大语言模型(LLM)从"对话生成器"演进为"自主行动者",Agent(智能体) 已经成为构建复杂 AI 应用的核心范式。一个合格的智能体不再只是根据 Prompt 输出文本,它需要具备感知环境、规划任务、调用工具、观察反馈、从经验中学习的能力闭环。
在实际工程落地中,团队往往面临一个基础性的问题:同样是基于 LLM 的 Agent,为什么行为差异如此之大? 答案正藏在"设计模式"这一层抽象中。模式决定了 Agent 如何组织思考、如何与外部世界交互、以及如何在复杂任务下保持可控。
本文将系统性地剖析当前主流的七种智能体设计模式,从最基础的 ReAct 循环,到最复杂的 Ralph Loop 学习闭环,再到工程化程度最高的 Multi-Agent 协作系统。每种模式都会给出:
- 设计理念:它解决了什么本质问题;
- 核心架构:状态、节点、数据流的拓扑结构;
- 参考实现:基于 LangGraph 的最小可运行代码;
- 适用边界:什么时候用、什么时候不要用。
上图展示了一个完备 Agent 所应具备的五大能力域。感知负责从环境中获取状态,推理和决策构成认知核心,执行通过工具与外界交互,学习则让 Agent 在迭代中自我进化。不同设计模式,本质上是对这五类能力的不同权重组合。
二、三大核心设计模式
2.1 ReAct 模式:思考-行动的最小闭环
2.1.1 设计理念
ReAct(Reasoning + Acting)由 Google Research 于 2022 年在论文 ReAct: Synergizing Reasoning and Acting in Language Models 中提出。它的核心洞察是:单纯的推理(Chain-of-Thought)容易"脑补"出错误事实,而单纯的行动(Tool Use)又缺乏对整体目标的把控。ReAct 把二者交织在一起,形成 Thought → Action → Observation 的动态循环。
这种交织带来了两个关键优势:
- 事实锚定(Grounding):每一次 Thought 都基于最新的 Observation,而非模型内部的臆想,有效抑制幻觉;
- 行为可解释(Interpretability):整个推理链对开发者完全透明,便于调试和审计。
2.1.2 核心组件
ReAct 由三个角色协作完成一次循环:
| 组件 | 职责 | LLM 角色 |
|---|---|---|
| Thought(思考器) | 基于当前上下文分析状态、制定下一步策略 | 调用 LLM 生成自然语言推理 |
| Action(执行器) | 把思考结果转化为结构化工具调用 | LLM 输出 Tool Call JSON |
| Observation(观察器) | 执行工具并把结果反馈回上下文 | 工具运行时,非 LLM |
2.1.3 LangGraph 参考实现
在 LangGraph 中,ReAct 可以被建模为一个只有两个核心节点(reasoning / tools)和一条条件边的最小状态图:
from typing import Annotated, TypedDict, Literal
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
class AgentState(TypedDict):
"""ReAct 智能体状态定义"""
messages: Annotated[list, "消息历史,包含所有对话和工具调用记录"]
iteration: int # 当前迭代次数,用于熔断
def create_react_agent(tools: list, max_iterations: int = 10):
"""
创建 ReAct 模式智能体
Args:
tools: 可用工具列表
max_iterations: 最大迭代次数,防止死循环
"""
llm = ChatOpenAI(model="gpt-4").bind_tools(tools)
tool_node = ToolNode(tools)
def reasoning_node(state: AgentState) -> AgentState:
"""Thought 阶段:分析上下文并决定下一步"""
response = llm.invoke(state["messages"])
return {
"messages": state["messages"] + [response],
"iteration": state["iteration"] + 1,
}
def should_continue(state: AgentState) -> Literal["tools", "end"]:
"""路由:有 tool_calls 则继续,否则结束"""
if state["iteration"] >= max_iterations:
return "end"
last = state["messages"][-1]
if getattr(last, "tool_calls", None):
return "tools"
return "end"
workflow = StateGraph(AgentState)
workflow.add_node("reasoning", reasoning_node)
workflow.add_node("tools", tool_node)
workflow.set_entry_point("reasoning")
workflow.add_conditional_edges(
"reasoning", should_continue, {"tools": "tools", "end": END}
)
workflow.add_edge("tools", "reasoning") # 观察后回到推理,形成闭环
return workflow.compile()
工程要点:
max_iterations是生产环境必备的熔断机制,LLM 偶尔会陷入"重复调用同一工具"的病态循环;ToolNode自动处理工具调用结果的序列化与异常捕获,无需手写;- 条件边
should_continue的判定逻辑决定了 Agent 的"终止倾向",过严会提前结束,过松会无限循环。
2.1.4 适用场景
| 场景 | 描述 | 典型案例 |
|---|---|---|
| 信息检索 | 需要多步搜索、结果驱动下一步查询 | 研究报告、事实核查 |
| 问题诊断 | 逐步排查、灵活应对未知分支 | 代码调试、故障排除 |
| 对话助手 | 实时交互、低延迟响应 | 客服机器人、个人助理 |
| 数据分析 | 探索性分析,根据发现调整方向 | 业务洞察、趋势分析 |
适用边界:ReAct 假设任务可以在"试错"中逼近答案。对于需要全局规划(如"写一篇论文")或长期记忆(如"根据用户三个月的偏好推荐")的任务,ReAct 的短视会成为瓶颈。
2.2 Plan-and-Execute 模式:先规划,后执行
2.2.1 设计理念
ReAct 的每一步都是"走一步看一步",在简单任务上高效,但在长任务链上会暴露两个问题:Token 开销随着历史线性膨胀,以及早期步骤的小偏差会沿着链条放大。
Plan-and-Execute 把 Agent 的工作切成两个阶段:
- 规划阶段:由一个"大脑强"的规划器(通常是 GPT-4 级模型)一次性生成完整执行计划;
- 执行阶段:由一个"手脚快"的执行器(可以是更小、更便宜的模型)按步执行。
这种分工的本质是把"思考成本"与"行动成本"解耦。此外,中间还设置了 Re-planner(重规划器) 作为"动态修正通道",当执行结果偏离预期时重新规划。
2.2.2 执行时序
下图展示了一次完整任务的时序:从用户提交任务,经过规划、循环执行、按需重规划,最终返回结果。
2.2.3 LangGraph 参考实现
Plan-and-Execute 的状态相比 ReAct 更"重",需要同时跟踪计划列表、执行进度、中间结果:
from typing import TypedDict, List, Optional, Literal
from enum import Enum
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import json
class StepStatus(Enum):
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
FAILED = "failed"
class PlanExecuteState(TypedDict):
task: str # 原始任务
plan: List[dict] # 执行计划列表
current_step: int # 当前步骤索引
results: List[str] # 各步骤执行结果
final_result: Optional[str] # 最终综合结果
def create_plan_execute_agent(tools: list):
planner_llm = ChatOpenAI(model="gpt-4", temperature=0) # 规划需要稳定
executor_llm = ChatOpenAI(model="gpt-4").bind_tools(tools)
def planning_node(state: PlanExecuteState) -> PlanExecuteState:
"""规划阶段:生成 3~8 个可执行原子步骤"""
prompt = f"""
请为以下任务生成执行计划:
任务:{state['task']}
要求:
1. 分解为 3-8 个可执行的原子步骤
2. 明确步骤之间的依赖关系
3. 以 JSON 数组输出,每个元素包含 id/description/dependencies
"""
plan = json.loads(planner_llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "plan": plan, "current_step": 0, "results": []}
def execution_node(state: PlanExecuteState) -> PlanExecuteState:
"""执行阶段:执行当前步骤,结果追加到 results"""
if state["current_step"] >= len(state["plan"]):
return state
step = state["plan"][state["current_step"]]
prev = "\n".join(f"步骤{i+1}: {r}" for i, r in enumerate(state["results"]))
prompt = f"步骤描述:{step['description']}\n\n之前结果:\n{prev}"
resp = executor_llm.invoke([HumanMessage(content=prompt)])
return {
**state,
"results": state["results"] + [resp.content],
"current_step": state["current_step"] + 1,
}
def replan_node(state: PlanExecuteState) -> PlanExecuteState:
"""重规划:根据进度判断是否需要调整剩余计划"""
prompt = f"""
原始任务:{state['task']}
已完成:{state['results']}
请评估是否需要调整剩余计划。需要则输出新计划 JSON,不需要则输出 "NO_REPLAN"。
"""
resp = planner_llm.invoke([HumanMessage(content=prompt)])
if "NO_REPLAN" not in resp.content:
new_plan = json.loads(resp.content)
return {**state, "plan": new_plan, "current_step": 0}
return state
def synthesize_node(state: PlanExecuteState) -> PlanExecuteState:
"""综合阶段:把所有中间结果整合为最终答案"""
prev = "\n".join(f"步骤{i+1}: {r}" for i, r in enumerate(state["results"]))
prompt = f"任务:{state['task']}\n\n执行结果:\n{prev}\n\n请综合给出最终答案。"
resp = planner_llm.invoke([HumanMessage(content=prompt)])
return {**state, "final_result": resp.content}
def should_continue(state) -> Literal["execute", "replan", "synthesize"]:
if state["current_step"] >= len(state["plan"]):
return "synthesize"
if state["current_step"] > 0 and state["current_step"] % 2 == 0:
return "replan" # 每执行 2 步做一次中间校验
return "execute"
wf = StateGraph(PlanExecuteState)
wf.add_node("plan", planning_node)
wf.add_node("execute", execution_node)
wf.add_node("replan", replan_node)
wf.add_node("synthesize", synthesize_node)
wf.set_entry_point("plan")
wf.add_edge("plan", "execute")
wf.add_conditional_edges(
"execute", should_continue,
{"execute": "execute", "replan": "replan", "synthesize": "synthesize"},
)
wf.add_edge("replan", "execute")
wf.add_edge("synthesize", END)
return wf.compile()
2.2.4 并行执行优化
Plan-and-Execute 相较 ReAct 的另一个重要优势,是依赖图可视化之后,可以识别出并行可执行的步骤。下图对比了同一个五步任务在"串行执行"和"DAG 并行执行"下的完成时间差异:串行需要 10 个时间单位,而将无依赖步骤并发后仅需 6 个单位。
2.2.5 适用场景
| 场景 | 特征 | 典型案例 |
|---|---|---|
| 数据处理流水线 | 步骤固定、依赖明确 | ETL、报表生成 |
| 项目管理 | 阶段性强、需要里程碑 | 软件开发流程 |
| 内容创作 | 流程标准化 | 技术文档、营销材料 |
| 科研流程 | 严格方法论 | 实验设计、论文写作 |
适用边界:当任务高度依赖实时反馈(如对话式问答),Plan-and-Execute 的"先定计划"会显得僵硬,这种情况下 ReAct 更合适。
2.3 Ralph Loop 模式:带学习能力的闭环
2.3.1 设计理念
前两种模式都有一个共同的局限:Agent 在任务结束后"忘了所有东西"。下一次面对相似任务时,它依然会犯同样的错误、走同样的弯路。
Ralph Loop(Reasoning-Acting-Learning-Planning Loop)通过在循环中显式引入学习和规划两个阶段,让 Agent 能够从经验中提炼知识、优化策略。它是目前学术界最接近"通用智能体"理想的模式。
Ralph Loop 的核心创新在于两层持久化存储:
- Knowledge Base(知识库):存放从多次任务中抽象出的规则、事实、模式(语义记忆);
- Experience Memory(经验记忆):存放具体的上下文-动作-结果三元组(情景记忆)。
2.3.2 四阶段详解
Ralph Loop 将一次迭代拆解为四个显式阶段,每个阶段内部又细分为四个子步骤:
| 阶段 | 核心职责 | 关键产出 |
|---|---|---|
| Reasoning | 读取 KB + 经验记忆,对当前状态做出判断 | 推理结论、候选策略 |
| Acting | 把推理结果转换为实际动作 | 动作记录 + 反馈 |
| Learning | 从反馈中抽取模式,更新 KB | 新知识项、策略调整 |
| Planning | 基于更新后的 KB 规划下一轮 | 下轮目标、资源分配 |
2.3.3 知识表示
Ralph Loop 的知识库并非一锅乱炖,而是按语义类别分层组织:
这种分层带来了一个工程收益:检索增强。当新任务到来时,Agent 可以根据任务类型精确检索相关的 Rules 或 Patterns,而不是对整个记忆做暴力扫描。
2.3.4 LangGraph 参考实现
from typing import TypedDict, List, Optional, Literal
from datetime import datetime
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import json
class RalphState(TypedDict):
task: str
episode_count: int
max_episodes: int
reasoning_result: Optional[dict]
action_result: Optional[dict]
learning_result: Optional[dict]
planning_result: Optional[dict]
task_completed: bool
final_answer: Optional[str]
knowledge_base: List[dict] # 语义记忆
experience_memory: List[dict] # 情景记忆
def create_ralph_agent(tools: list, max_episodes: int = 10):
llm = ChatOpenAI(model="gpt-4", temperature=0)
def reasoning_node(state: RalphState) -> RalphState:
# 检索相关知识(可替换为向量检索)
kb = state["knowledge_base"][-5:]
exp = state["experience_memory"][-3:]
prompt = f"""
任务:{state['task']}
相关知识:{json.dumps(kb, ensure_ascii=False)}
类似经验:{json.dumps(exp, ensure_ascii=False)}
输出 JSON:
{{
"state_assessment": "当前状态评估",
"problem_analysis": "问题核心分析",
"hypotheses": ["假设1", "假设2"],
"recommended_action": "推荐的行动策略"
}}
"""
result = json.loads(llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "reasoning_result": result}
def acting_node(state: RalphState) -> RalphState:
prompt = f"""
任务:{state['task']}
推理:{json.dumps(state['reasoning_result'], ensure_ascii=False)}
请执行推荐动作,输出 JSON:
{{"action_taken": "...", "parameters": {{}}, "outcome": "...",
"success": true, "context": "..."}}
"""
result = json.loads(llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "action_result": result}
def learning_node(state: RalphState) -> RalphState:
"""从本次行动中提取知识、更新 KB"""
ar = state["action_result"]
kb = state["knowledge_base"].copy()
memory = state["experience_memory"].copy()
experience = {
"context": ar.get("context", ""),
"action": ar.get("action_taken", ""),
"outcome": ar.get("outcome", ""),
"success": ar.get("success", False),
"timestamp": datetime.now().isoformat(),
}
memory.append(experience)
prompt = f"""
根据经验提取可学习的模式:
{json.dumps(experience, ensure_ascii=False)}
输出 JSON:
{{"patterns": [...], "new_knowledge": {{...}}, "strategy_updates": [...]}}
"""
learning = json.loads(llm.invoke([HumanMessage(content=prompt)]).content)
if learning.get("new_knowledge"):
kb.append(learning["new_knowledge"])
return {
**state,
"learning_result": learning,
"knowledge_base": kb,
"experience_memory": memory,
}
def planning_node(state: RalphState) -> RalphState:
prompt = f"""
任务:{state['task']}
学习结果:{json.dumps(state['learning_result'], ensure_ascii=False)}
输出 JSON:
{{"goal": "...", "strategy": "...", "expected_outcome": "...",
"task_completed": false}}
"""
planning = json.loads(llm.invoke([HumanMessage(content=prompt)]).content)
return {
**state,
"planning_result": planning,
"task_completed": planning.get("task_completed", False),
}
def finalize_node(state: RalphState) -> RalphState:
prompt = f"任务:{state['task']}\n完整历史:{json.dumps(state['experience_memory'], ensure_ascii=False)}\n\n综合所有经验,给出最终答案。"
ans = llm.invoke([HumanMessage(content=prompt)]).content
return {**state, "final_answer": ans}
def should_continue(state) -> Literal["reasoning", "finalize"]:
if state["task_completed"] or state["episode_count"] >= state["max_episodes"]:
return "finalize"
return "reasoning"
def increment(state): return {**state, "episode_count": state["episode_count"] + 1}
wf = StateGraph(RalphState)
wf.add_node("reasoning", reasoning_node)
wf.add_node("acting", acting_node)
wf.add_node("learning", learning_node)
wf.add_node("planning", planning_node)
wf.add_node("increment", increment)
wf.add_node("finalize", finalize_node)
wf.set_entry_point("reasoning")
wf.add_edge("reasoning", "acting")
wf.add_edge("acting", "learning")
wf.add_edge("learning", "planning")
wf.add_edge("planning", "increment")
wf.add_conditional_edges(
"increment", should_continue,
{"reasoning": "reasoning", "finalize": "finalize"},
)
wf.add_edge("finalize", END)
return wf.compile()
2.3.5 自适应学习机制
Ralph Loop 的 Learning 阶段可以融合多种机器学习范式:
- 强化学习:在 Experience 环节注入奖励信号;
- 模仿学习:在 Pattern 环节从示范数据归纳模式;
- 元学习:在 Knowledge 环节学习"如何学习";
- 迁移学习:在 Strategy 环节跨任务复用策略。
2.3.6 适用场景
| 场景 | 特征 | 典型案例 |
|---|---|---|
| 智能教育 | 需要个性化适应 | 自适应学习系统、智能导师 |
| 个人助手 | 长期交互关系 | 智能秘书、生活助理 |
| 自动化研究 | 探索未知领域 | 科学发现、药物研发 |
| 游戏 AI | 对手策略变化 | 智能 NPC、游戏平衡 |
工程成本提醒:Ralph Loop 的 KB 持久化、记忆检索、知识冲突消解都会显著增加系统复杂度。如果业务场景不具备"长期交互"或"跨任务复用"的特征,ReAct / Plan-and-Execute 通常是更务实的选择。
三、四种扩展设计模式
3.1 Chain-of-Thought:把推理过程显式化
Chain-of-Thought (CoT) 是 Wei et al. (2022) 提出的里程碑式技术。它不是一个完整的 Agent 架构,而是一种推理增强策略——通过引导模型一步一步展示思考过程,大幅提升复杂问题的解决能力。
在 Agent 语境下,CoT 可以被升级为一个"多步推理链"的 Graph:每一步都是对上一步推理的延续,最后一步负责整合结论。
参考实现
from typing import TypedDict, List, Literal
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
class CoTState(TypedDict):
problem: str
steps: List[str]
current_step: int
final_answer: str
def create_cot_agent(max_steps: int = 5):
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 预定义的推理脚手架(Step Scaffolding)
STEP_PROMPTS = [
"分析问题的关键信息和约束条件",
"确定解决问题的方法和策略",
"执行具体的计算或推理过程",
"验证结果的合理性和完整性",
"总结并给出最终答案",
]
def analyze_step(state: CoTState) -> CoTState:
cur = state["current_step"]
guide = STEP_PROMPTS[cur] if cur < len(STEP_PROMPTS) else "继续推理"
history = "\n".join(f"步骤{i+1}: {s}" for i, s in enumerate(state["steps"]))
prompt = f"""
问题:{state['problem']}
历史推理:
{history}
当前任务:{guide}
请给出该步详细推理。
"""
resp = llm.invoke([HumanMessage(content=prompt)])
return {**state, "steps": state["steps"] + [resp.content],
"current_step": cur + 1}
def finalize_answer(state: CoTState) -> CoTState:
history = "\n".join(f"步骤{i+1}: {s}" for i, s in enumerate(state["steps"]))
prompt = f"问题:{state['problem']}\n完整推理:\n{history}\n\n请给出简洁最终答案。"
ans = llm.invoke([HumanMessage(content=prompt)]).content
return {**state, "final_answer": ans}
def should_continue(state) -> Literal["analyze", "finalize"]:
return "finalize" if state["current_step"] >= max_steps else "analyze"
wf = StateGraph(CoTState)
wf.add_node("analyze", analyze_step)
wf.add_node("finalize", finalize_answer)
wf.set_entry_point("analyze")
wf.add_conditional_edges(
"analyze", should_continue, {"analyze": "analyze", "finalize": "finalize"}
)
wf.add_edge("finalize", END)
return wf.compile()
设计要点:预定义的 STEP_PROMPTS 起到推理脚手架的作用,强制模型遵循特定的思考框架(分析 → 策略 → 执行 → 验证 → 总结),显著提升推理稳定性。
3.2 Multi-Agent:多角色协作
当单个 Agent 难以兼顾多种专业能力时(例如同时需要"严谨的研究能力"和"优秀的文笔"),Multi-Agent(多智能体协作) 模式通过角色分工来解决问题。每个 Agent 承担一个专业化角色,由一个 Coordinator(协调者) 负责路由与整合。
协作时序
参考实现
from typing import TypedDict, Literal, Optional
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import json
class MultiAgentState(TypedDict):
task: str
research_result: Optional[str]
analysis_result: Optional[str]
draft: Optional[str]
review_result: Optional[dict]
final_result: Optional[str]
revision_count: int
def create_multi_agent_system():
# 每个角色使用不同的温度策略,匹配其认知特征
research_llm = ChatOpenAI(model="gpt-4", temperature=0.7) # 探索性
analysis_llm = ChatOpenAI(model="gpt-4", temperature=0) # 严谨性
writing_llm = ChatOpenAI(model="gpt-4", temperature=0.5) # 平衡
review_llm = ChatOpenAI(model="gpt-4", temperature=0) # 严格
def research_agent(state):
prompt = f"你是专业研究员。请针对以下任务调研:{state['task']}\n输出:背景/概念/数据/参考资源。"
return {**state, "research_result": research_llm.invoke([HumanMessage(content=prompt)]).content}
def analysis_agent(state):
prompt = f"你是分析师。基于研究资料进行分析。\n任务:{state['task']}\n资料:{state['research_result']}"
return {**state, "analysis_result": analysis_llm.invoke([HumanMessage(content=prompt)]).content}
def writing_agent(state):
review = state.get("review_result")
if review and not review.get("approved"):
prompt = f"根据审核意见修改:\n原文:{state['draft']}\n意见:{review.get('feedback')}"
else:
prompt = f"基于资料撰写:\n任务:{state['task']}\n研究:{state['research_result']}\n分析:{state['analysis_result']}"
return {**state, "draft": writing_llm.invoke([HumanMessage(content=prompt)]).content}
def review_agent(state):
prompt = f"""
审核内容:
任务:{state['task']}
文稿:{state['draft']}
输出 JSON:{{"approved": true|false, "score": 0-10, "feedback": "..."}}
"""
result = json.loads(review_llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "review_result": result,
"revision_count": state["revision_count"] + 1}
def should_revise(state) -> Literal["writing", "finalize"]:
if state["revision_count"] >= 3:
return "finalize"
return "finalize" if state["review_result"].get("approved") else "writing"
wf = StateGraph(MultiAgentState)
wf.add_node("research", research_agent)
wf.add_node("analysis", analysis_agent)
wf.add_node("writing", writing_agent)
wf.add_node("review", review_agent)
wf.add_node("finalize", lambda s: {**s, "final_result": s["draft"]})
wf.set_entry_point("research")
wf.add_edge("research", "analysis")
wf.add_edge("analysis", "writing")
wf.add_edge("writing", "review")
wf.add_conditional_edges(
"review", should_revise,
{"writing": "writing", "finalize": "finalize"},
)
wf.add_edge("finalize", END)
return wf.compile()
角色温度差异化是 Multi-Agent 模式的一个细节但关键的设计:Research Agent 用 0.7 温度鼓励发散思维,Analysis/Review Agent 用 0 温度确保严谨与一致,Writing Agent 取 0.5 折中。
3.3 Hierarchical Agent:层次化组织
当 Agent 数量增长到数十甚至上百个时,扁平的 Multi-Agent 结构会出现协调瓶颈。Hierarchical Agent(层次化智能体) 借鉴人类组织管理的思路,把 Agent 组织成主控 → 中层管理 → 执行层的金字塔结构。
这种结构的关键收益:
- 关注点分离:Master 只看战略,Supervisor 管战术,Worker 抓执行;
- 并行加速:同一层内的节点天然可以并行执行;
- 模型异构:每一层使用匹配其职责的模型规格(Master 用 GPT-4,Worker 可以用 GPT-3.5 甚至本地模型)。
参考实现
from typing import TypedDict, List, Optional, Dict
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import json
class HierarchicalState(TypedDict):
task: str
subtasks: Dict[str, List[str]] # supervisor -> [子任务]
worker_results: Dict[str, str]
supervisor_summaries: Dict[str, str]
final_result: Optional[str]
def create_hierarchical_agent():
# 层级化模型配置:上层精密,下层廉价
master_llm = ChatOpenAI(model="gpt-4", temperature=0)
supervisor_llm = ChatOpenAI(model="gpt-4", temperature=0)
worker_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5)
def master_node(state):
prompt = f"""
将任务分解给三个管理者(JSON 输出):
- task_supervisor(任务执行)
- resource_supervisor(资源管理)
- quality_supervisor(质量保证)
任务:{state['task']}
"""
subtasks = json.loads(master_llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "subtasks": subtasks}
def make_supervisor(name: str):
def node(state):
subtasks = state["subtasks"].get(name, [])
results = state["worker_results"].copy()
for i, sub in enumerate(subtasks):
resp = worker_llm.invoke([HumanMessage(content=f"执行子任务:{sub}")])
results[f"{name}_worker_{i}"] = resp.content
own = {k: v for k, v in results.items() if k.startswith(name)}
summary = supervisor_llm.invoke(
[HumanMessage(content=f"{name} 请汇总:{json.dumps(own, ensure_ascii=False)}")]
).content
summaries = state["supervisor_summaries"].copy()
summaries[name] = summary
return {**state, "worker_results": results, "supervisor_summaries": summaries}
return node
def aggregation_node(state):
s = state["supervisor_summaries"]
prompt = f"""
主控综合汇报:
任务:{state['task']}
任务管理:{s.get('task_supervisor', '')}
资源管理:{s.get('resource_supervisor', '')}
质量管理:{s.get('quality_supervisor', '')}
"""
return {**state, "final_result": master_llm.invoke([HumanMessage(content=prompt)]).content}
wf = StateGraph(HierarchicalState)
wf.add_node("master", master_node)
wf.add_node("task_supervisor", make_supervisor("task_supervisor"))
wf.add_node("resource_supervisor", make_supervisor("resource_supervisor"))
wf.add_node("quality_supervisor", make_supervisor("quality_supervisor"))
wf.add_node("aggregation", aggregation_node)
wf.set_entry_point("master")
wf.add_edge("master", "task_supervisor")
wf.add_edge("task_supervisor", "resource_supervisor")
wf.add_edge("resource_supervisor", "quality_supervisor")
wf.add_edge("quality_supervisor", "aggregation")
wf.add_edge("aggregation", END)
return wf.compile()
工程化建议:实际部署中,三个 Supervisor 可以通过 LangGraph 的并行 Branch 真正并发执行,进一步缩短端到端延迟。
3.4 Reflection:自我反思优化
Reflection(反思)模式的设计灵感来自人类"写完一稿放一放,回头再改"的工作习惯。它在每次产出后,让一个独立的"反思者"对产出进行多维度评估,并基于评估反馈进行改进,直至质量达标。
关键设计:Actor / Reflector 角色分离
Reflection 模式明确地把生成者和评判者分离为两个 LLM 实例,这样做有两个好处:
- 避免自我偏见:同一个模型往往难以发现自己的错误,独立的 Reflector 更容易跳出来;
- 配置差异化:Actor 可以用更高温度鼓励创造性,Reflector 保持 0 温度确保评判稳定。
参考实现
from typing import TypedDict, List, Literal, Optional
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import json
class ReflectionState(TypedDict):
task: str
current_solution: Optional[str]
reflection: Optional[dict]
improvements: List[str]
iteration: int
max_iterations: int
final_result: Optional[str]
quality_score: float
def create_reflection_agent(max_iterations: int = 3, quality_threshold: float = 8.0):
actor_llm = ChatOpenAI(model="gpt-4", temperature=0.7)
reflector_llm = ChatOpenAI(model="gpt-4", temperature=0)
def action_node(state):
if state.get("current_solution") and state["improvements"]:
prompt = f"""
根据改进建议优化方案:
任务:{state['task']}
当前:{state['current_solution']}
建议:{chr(10).join(state['improvements'])}
"""
else:
prompt = f"请完成任务:{state['task']}\n输出完整方案。"
return {**state, "current_solution": actor_llm.invoke([HumanMessage(content=prompt)]).content}
def reflect_node(state):
prompt = f"""
评估方案(JSON 输出):
任务:{state['task']}
方案:{state['current_solution']}
{{"effectiveness": {{"score": 0-10, "analysis": "..."}},
"methodology": {{"score": 0-10, "analysis": "..."}},
"goal_alignment": {{"score": 0-10, "analysis": "..."}},
"overall_score": 0-10,
"strengths": [...],
"weaknesses": [...]}}
"""
refl = json.loads(reflector_llm.invoke([HumanMessage(content=prompt)]).content)
return {**state, "reflection": refl, "quality_score": refl.get("overall_score", 0)}
def improve_node(state):
prompt = f"基于评估制定 3-5 条具体改进建议:\n{json.dumps(state['reflection'], ensure_ascii=False)}"
resp = reflector_llm.invoke([HumanMessage(content=prompt)])
imp = [l.strip() for l in resp.content.split('\n') if l.strip() and l.strip()[0].isdigit()]
return {**state, "improvements": imp}
def plan_node(state):
return {**state, "iteration": state["iteration"] + 1}
def should_continue(state) -> Literal["action", "finalize"]:
if state["quality_score"] >= quality_threshold: return "finalize"
if state["iteration"] >= state["max_iterations"]: return "finalize"
return "action"
wf = StateGraph(ReflectionState)
wf.add_node("action", action_node)
wf.add_node("reflect", reflect_node)
wf.add_node("improve", improve_node)
wf.add_node("plan", plan_node)
wf.add_node("finalize", lambda s: {**s, "final_result": s["current_solution"]})
wf.set_entry_point("action")
wf.add_edge("action", "reflect")
wf.add_edge("reflect", "improve")
wf.add_edge("improve", "plan")
wf.add_conditional_edges(
"plan", should_continue, {"action": "action", "finalize": "finalize"}
)
wf.add_edge("finalize", END)
return wf.compile()
熔断双保险:quality_threshold 和 max_iterations 共同保护系统不会为了"追求完美"而陷入无限循环。
四、模式对比与选型决策
4.1 七种模式横向对比
| 设计模式 | 复杂度 | 学习能力 | 适应性 | 可解释性 | 执行效率 | 最佳场景 |
|---|---|---|---|---|---|---|
| ReAct | ★★ | ★ | ★★★★ | ★★★★★ | ★★★★ | 动态交互任务 |
| Plan-Execute | ★★★ | ★★ | ★★ | ★★★ | ★★★★★ | 复杂结构化任务 |
| Ralph Loop | ★★★★★ | ★★★★★ | ★★★★★ | ★★★ | ★★★ | 长期学习任务 |
| Chain-of-Thought | ★★ | ★ | ★★ | ★★★★★ | ★★★ | 推理密集任务 |
| Multi-Agent | ★★★★ | ★★★ | ★★★ | ★★★ | ★★★★ | 协作复杂任务 |
| Hierarchical | ★★★★ | ★★ | ★★★ | ★★ | ★★★★★ | 大规模任务 |
| Reflection | ★★★ | ★★★★ | ★★★★ | ★★★★ | ★★★ | 质量优化任务 |
4.2 选型决策树
实际工程选型时,可以参考下图的决策路径——从"任务复杂度"入口出发,经由"是否需要交互"“是否可并行"“是否需要学习"三个关键问题,最终落地到具体模式。
4.3 选型经验法则
- 优先简单:能用 ReAct 解决的,不要上 Multi-Agent。复杂度带来的不是能力,而是故障面;
- 避免过早优化:不要一开始就引入 Ralph Loop。先用 ReAct 跑通主流程,再按瓶颈升级;
- 组合优于单一:真实场景常常是多种模式的组合——外层用 Plan-and-Execute 做骨架,内部关键步骤用 ReAct 驱动,最后用 Reflection 做质量把关;
- 工程可观测性优先:无论选什么模式,每一步的 Thought、Tool Call、Observation 都必须可追溯,否则线上故障定位将是噩梦。
五、实际应用案例
5.1 案例:智能客服系统(Multi-Agent + ReAct)
智能客服需要同时应对"技术支持"“销售咨询"“售后服务"三类截然不同的意图。架构上采用路由层用 ReAct 做意图识别,业务层按领域选用不同模式:
关键设计:
- Tech 用 Plan-Execute:技术问题通常涉及多步骤诊断,预先规划能提高命中率;
- Sales 用 ReAct:销售场景对话节奏快,需要根据客户反馈灵活调整;
- Service 用 Ralph Loop:售后服务是长期关系,学习客户历史问题能显著提升体验。
5.2 案例:自动化研究助手(Ralph + CoT)
研究助手需要覆盖从"问题提出"到"报告产出"的完整链条,不同环节对模式的要求差异巨大:
5.3 案例:智能代码审查(Hierarchical + Reflection)
代码审查需要从多个维度(语法、逻辑、性能、安全)并行分析,再通过反思环节形成一致的改进建议:
六、未来发展趋势
6.1 技术演进主线
6.2 关键技术突破点
- 自适应模式选择:Agent 能够根据任务特征在运行时自动切换模式,而不是在编码期固化。需要任务特征抽取、模式匹配模型、运行时编排三项技术突破;
- 增强学习机制:解决"少样本快速学习"“持续学习防遗忘"“跨任务知识迁移"三大问题,是 Ralph Loop 走向产业化的前提;
- 大规模协作:当 Agent 数量从 10 级跃迁到 1000 级时,集中式 Coordinator 会成为瓶颈,需要分布式决策与容错机制;
- 安全与对齐:价值对齐、行为可预测性、恶意行为检测,是 Agent 规模化部署的安全底座。
6.3 应用落地时间线(估计)
| 年份 | 里程碑 |
|---|---|
| 2024 | ReAct 广泛应用,Plan-Execute 商业化 |
| 2025 | Multi-Agent 平台化,垂直领域深度落地 |
| 2026 | Ralph Loop 产业化,自适应系统普及 |
| 2027 | 千级 Agent 协作,边缘智能成熟 |
| 2028+ | 通用 Agent,跨域自主学习 |
七、总结
智能体设计模式的发展,沿着从简单到复杂、从单一到协作、从固定到自适应的清晰脉络演进。七种主流模式之间并非互斥,而更像是一组可以灵活组合的"积木”:
- ReAct 是最基础的积木,它的 Thought-Action-Observation 循环几乎出现在所有复杂模式的内部;
- Plan-and-Execute 提供了面向复杂任务的骨架结构;
- Ralph Loop 引入了学习维度,让 Agent 真正具备"成长性”;
- Chain-of-Thought / Reflection 聚焦于推理与质量,是前面模式的"增强器”;
- Multi-Agent / Hierarchical 面向规模化协作,解决单 Agent 能力边界问题。
选择合适的模式,本质上是在 任务复杂度、交互需求、学习要求、性能约束、工程成本 这五个维度间做权衡。没有"最好"的模式,只有"最合适"的组合。
理解并熟练运用这些模式,将是未来几年内构建生产级 AI 应用的核心工程能力。
参考资料
- Yao, S., et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models.
- Wang, L., et al. (2023). Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning.
- Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.
- Shinn, N., et al. (2023). Reflexion: Language Agents with Verbal Reinforcement Learning.
- LangChain Documentation — Agent Architectures.
- AutoGPT Project — Autonomous Agent Design Patterns.
- OpenAI (2023). GPT-4 Technical Report.
- Anthropic (2023). Constitutional AI: Harmlessness from AI Feedback.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付