智能体设计模式全面解析:从基础到高级

七种主流 Agent 架构的设计理念、工程实现与选型权衡

Posted by iceyao on Tuesday, January 20, 2026

一、引言

随着大语言模型(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 的动态循环。

这种交织带来了两个关键优势:

  1. 事实锚定(Grounding):每一次 Thought 都基于最新的 Observation,而非模型内部的臆想,有效抑制幻觉;
  2. 行为可解释(Interpretability):整个推理链对开发者完全透明,便于调试和审计。

ReAct 模式工作流程:从任务输入开始,模型在 Thought-Action-Observation 之间循环迭代,直至产出最终答案

2.1.2 核心组件

ReAct 由三个角色协作完成一次循环:

组件 职责 LLM 角色
Thought(思考器) 基于当前上下文分析状态、制定下一步策略 调用 LLM 生成自然语言推理
Action(执行器) 把思考结果转化为结构化工具调用 LLM 输出 Tool Call JSON
Observation(观察器) 执行工具并把结果反馈回上下文 工具运行时,非 LLM

ReAct 三大组件之间的数据流:Thought 产生决策驱动 Action,Action 的执行结果由 Observation 收集并回灌给 Thought,形成闭环

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 的工作切成两个阶段:

  1. 规划阶段:由一个"大脑强"的规划器(通常是 GPT-4 级模型)一次性生成完整执行计划;
  2. 执行阶段:由一个"手脚快"的执行器(可以是更小、更便宜的模型)按步执行。

这种分工的本质是把"思考成本"与"行动成本"解耦。此外,中间还设置了 Re-planner(重规划器) 作为"动态修正通道",当执行结果偏离预期时重新规划。

Plan-and-Execute 架构:Planner 产出计划并存入队列,Executor 按步执行并把结果交给 Monitor 评估,偏离时触发 Re-planner 更新计划

2.2.2 执行时序

下图展示了一次完整任务的时序:从用户提交任务,经过规划、循环执行、按需重规划,最终返回结果。

Plan-and-Execute 时序:用户 → Planner(分析并生成计划)→ Executor ↔ Monitor 循环执行与评估,失败时 Re-planner 修正计划并回到 Executor

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 个单位。

Plan-and-Execute 并行优化对比:上方为串行执行耗时 10 个单位,下方为按依赖图并行执行,通过合并可独立执行的 Step 2/3 与 Step 4/5,总耗时缩短至 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(经验记忆):存放具体的上下文-动作-结果三元组(情景记忆)。

Ralph Loop 四阶段闭环与两层记忆系统:Reasoning → Acting → Learning → Planning 循环推进,Reasoning 和 Planning 读写知识库,Acting 和 Learning 读写经验记忆,Acting 同时与外部环境交互

2.3.2 四阶段详解

Ralph Loop 将一次迭代拆解为四个显式阶段,每个阶段内部又细分为四个子步骤:

Ralph Loop 四阶段细分流程:Reasoning(状态评估→问题分析→假设生成→策略推荐)、Acting(动作选择→参数绑定→执行→收集反馈)、Learning(经验提取→模式识别→知识更新→策略优化)、Planning(目标设定→资源评估→策略制定→计划生成)四个阶段依次衔接并最终回到 Reasoning 形成闭环

阶段 核心职责 关键产出
Reasoning 读取 KB + 经验记忆,对当前状态做出判断 推理结论、候选策略
Acting 把推理结果转换为实际动作 动作记录 + 反馈
Learning 从反馈中抽取模式,更新 KB 新知识项、策略调整
Planning 基于更新后的 KB 规划下一轮 下轮目标、资源分配

2.3.3 知识表示

Ralph Loop 的知识库并非一锅乱炖,而是按语义类别分层组织:

Ralph Loop 知识库 ER 模型:KNOWLEDGE_BASE 作为根实体,关联 FACTS(事实)、RULES(规则)、PATTERNS(模式)、EXPERIENCES(经验)四类子表,每张表都带有置信度、使用次数等元信息字段

这种分层带来了一个工程收益:检索增强。当新任务到来时,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 阶段可以融合多种机器学习范式:

Ralph Loop 自适应学习:左侧为 Experience → Pattern → Knowledge → Strategy 的内循环;右侧列出可挂载的学习算法家族,包括强化学习、模仿学习、元学习与迁移学习,四者分别作用于内循环的不同节点

  • 强化学习:在 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:每一步都是对上一步推理的延续,最后一步负责整合结论。

Chain-of-Thought 推理链结构:问题输入依次经过"分析约束 → 确定策略 → 执行计算 → 验证结果 → 总结答案"五个推理步骤;每一步都可以映射到逻辑推理、数学计算、因果分析、类比推理等不同的推理类型

参考实现

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(协调者) 负责路由与整合。

Multi-Agent 协作系统架构:用户请求由 Coordinator 接收并分发给 Research Agent、Analysis Agent、Writing Agent、Review Agent 四个专业 Agent,所有 Agent 共享 KnowledgeBase、Workspace 和 Communication 三类基础设施

协作时序

Multi-Agent 协作时序:用户提交任务后,Coordinator 分解任务,Research 与 Analysis Agent 并行执行并返回结果;Writing Agent 基于整合信息撰写初稿;Review Agent 审核后根据结果分支——不通过则返回 Writing 迭代,通过则由 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 组织成主控 → 中层管理 → 执行层的金字塔结构。

Hierarchical Agent 三层架构:顶层 Master Agent 分解任务;中层 Supervisor 1/2/3 分别负责任务管理、资源管理、质量管理;执行层 Worker 1~6 由对应 Supervisor 直接管理,形成清晰的树状隶属关系

这种结构的关键收益:

  1. 关注点分离:Master 只看战略,Supervisor 管战术,Worker 抓执行;
  2. 并行加速:同一层内的节点天然可以并行执行;
  3. 模型异构:每一层使用匹配其职责的模型规格(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(反思)模式的设计灵感来自人类"写完一稿放一放,回头再改"的工作习惯。它在每次产出后,让一个独立的"反思者"对产出进行多维度评估,并基于评估反馈进行改进,直至质量达标。

Reflection 反思循环:Action(执行)→ Reflect(评估)→ Improve(改进)→ Plan(重规划)→ 回到 Action 形成闭环;Reflect 节点从效果评估、方法分析、目标对齐、经验学习四个维度对产出进行打分

关键设计:Actor / Reflector 角色分离

Reflection 模式明确地把生成者评判者分离为两个 LLM 实例,这样做有两个好处:

  1. 避免自我偏见:同一个模型往往难以发现自己的错误,独立的 Reflector 更容易跳出来;
  2. 配置差异化: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_thresholdmax_iterations 共同保护系统不会为了"追求完美"而陷入无限循环。


四、模式对比与选型决策

4.1 七种模式横向对比

设计模式 复杂度 学习能力 适应性 可解释性 执行效率 最佳场景
ReAct ★★ ★★★★ ★★★★★ ★★★★ 动态交互任务
Plan-Execute ★★★ ★★ ★★ ★★★ ★★★★★ 复杂结构化任务
Ralph Loop ★★★★★ ★★★★★ ★★★★★ ★★★ ★★★ 长期学习任务
Chain-of-Thought ★★ ★★ ★★★★★ ★★★ 推理密集任务
Multi-Agent ★★★★ ★★★ ★★★ ★★★ ★★★★ 协作复杂任务
Hierarchical ★★★★ ★★ ★★★ ★★ ★★★★★ 大规模任务
Reflection ★★★ ★★★★ ★★★★ ★★★★ ★★★ 质量优化任务

4.2 选型决策树

实际工程选型时,可以参考下图的决策路径——从"任务复杂度"入口出发,经由"是否需要交互"“是否可并行"“是否需要学习"三个关键问题,最终落地到具体模式。

智能体模式选型决策树:起点为&quot;任务分析&quot;节点,按任务复杂度分为简单/复杂两条分支;简单分支进一步按是否需要交互分为 ReAct 与 Chain-of-Thought;复杂分支按结构化程度分支,高结构化且可并行落到 Plan-and-Execute,不可并行落到 Multi-Agent;低结构化按是否需要学习分别落到 Ralph Loop 与 Hierarchical

4.3 选型经验法则

  1. 优先简单:能用 ReAct 解决的,不要上 Multi-Agent。复杂度带来的不是能力,而是故障面;
  2. 避免过早优化:不要一开始就引入 Ralph Loop。先用 ReAct 跑通主流程,再按瓶颈升级;
  3. 组合优于单一:真实场景常常是多种模式的组合——外层用 Plan-and-Execute 做骨架,内部关键步骤用 ReAct 驱动,最后用 Reflection 做质量把关;
  4. 工程可观测性优先:无论选什么模式,每一步的 Thought、Tool Call、Observation 都必须可追溯,否则线上故障定位将是噩梦。

五、实际应用案例

5.1 案例:智能客服系统(Multi-Agent + ReAct)

智能客服需要同时应对"技术支持"“销售咨询"“售后服务"三类截然不同的意图。架构上采用路由层用 ReAct 做意图识别,业务层按领域选用不同模式

智能客服系统架构:前端 Customer 请求先到 Router(ReAct 模式)做意图识别;按意图路由到三个专业 Agent——Tech(Plan-Execute)、Sales(ReAct)、Service(Ralph Loop);三个 Agent 各自连接对应的后台系统:知识库、CRM、工单系统

关键设计:

  • Tech 用 Plan-Execute:技术问题通常涉及多步骤诊断,预先规划能提高命中率;
  • Sales 用 ReAct:销售场景对话节奏快,需要根据客户反馈灵活调整;
  • Service 用 Ralph Loop:售后服务是长期关系,学习客户历史问题能显著提升体验。

5.2 案例:自动化研究助手(Ralph + CoT)

研究助手需要覆盖从"问题提出"到"报告产出"的完整链条,不同环节对模式的要求差异巨大:

自动化研究助手工作流:研究问题 → 文献检索(ReAct)→ 文献分析(CoT)→ 假设生成(Ralph)→ 假设验证(Plan-Execute)→ 报告生成(Multi-Agent);每一环节采用最适配的模式,形成多模式组合 Pipeline

5.3 案例:智能代码审查(Hierarchical + Reflection)

代码审查需要从多个维度(语法、逻辑、性能、安全)并行分析,再通过反思环节形成一致的改进建议:

智能代码审查系统:Master Agent 分派到语法、逻辑、性能、安全四个专项检查 Worker,所有 Worker 的结果汇入 Reflect 节点做跨维度一致性评估,再由 Improve 节点产出可执行的代码优化建议,最终形成审查报告


六、未来发展趋势

6.1 技术演进主线

智能体技术演进的五大主线:模式融合(自适应切换、混合架构、动态组合)、能力增强(多模态感知、跨域迁移、元学习)、协作进化(大规模协作、去中心化、集群智能)、安全可控(可解释 AI、对齐机制、防护)、应用拓展(垂直深化、边缘部署、实时优化)

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 应用的核心工程能力。


参考资料

  1. Yao, S., et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models.
  2. Wang, L., et al. (2023). Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning.
  3. Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.
  4. Shinn, N., et al. (2023). Reflexion: Language Agents with Verbal Reinforcement Learning.
  5. LangChain Documentation — Agent Architectures.
  6. AutoGPT Project — Autonomous Agent Design Patterns.
  7. OpenAI (2023). GPT-4 Technical Report.
  8. Anthropic (2023). Constitutional AI: Harmlessness from AI Feedback.

「真诚赞赏,手留余香」

爱折腾的工程师

真诚赞赏,手留余香

使用微信扫描二维码完成支付