三种Agent架构选型指南:从ReAct到Multi-Agent

Agent架构全景图:ReAct / Plan-Execute / Multi-Agent 怎么选

系列 :Agent实战系列 第01篇 预计阅读 :15分钟 难度:⭐⭐⭐⭐☆


引子

上周面试官问我:「你的Agent项目用的什么架构?」

我答:「ReAct,让大模型自己想一步做一步。」

他追问:「那如果任务有20个步骤,ReAct还能撑住吗?」

我愣了一下------我的项目最多就5步,从来没想过20步的情况。面试官笑了笑:「回去了解一下Plan-Execute和Multi-Agent吧。」

回去后我把三种架构从头到尾拆了一遍,发现这根本不是「哪个更好」的问题,而是**「什么场景该用什么」**的问题。这篇就把三种架构的原理、代码和落地选型一次讲透。


一、原理:三种架构到底在干什么

1.1 一句话理解

ReAct是「走一步看一步」

Plan-Execute是「先规划路线再出发」

Multi-Agent是「组个团队分工干」。

1.2 三种架构全景图

一图看全:左边是ReAct(逐步推理),中间是Plan-Execute(先规划再执行),右边是Multi-Agent(多角色协作)。三种架构的复杂度递增,但适用场景不同。

1.3 ReAct:推理+行动的交替循环

核心思想:让大模型在「思考」和「行动」之间交替。每一步先想清楚(Thought),再决定做什么(Action),看到结果后(Observation),再决定下一步。

这个模式来自2022年Yao等人的论文《ReAct: Synergizing Reasoning and Acting in Language Models》,核心贡献是发现单独的推理(Chain-of-Thought)容易幻觉,单独的行动(工具调用)缺乏规划,两者交替才能既准又能干

图解:Thought-Action-Observation的循环本质。右侧展示了查天气+查紫外线的完整运行链路,每一步都基于上一步的Observation动态决策------这就是ReAct「走一步看一步」的精髓。

1.4 Plan-Execute:先画路线再出发

核心思想 :把「规划」和「执行」拆成两个阶段。先用一个Planner(规划器)生成完整的步骤计划,再交给Executor(执行器,通常本身是个ReAct Agent)逐步执行。如果执行中发现计划有问题,可以触发重新规划

这个思路受BabyAGI和Plan-and-Solve论文启发,LangChain官方提供了标准实现。

图解:先由Planner生成完整计划(4步),再由Executor(通常是ReAct Agent)逐步执行,执行中发现问题可触发Replan(带着已有结果重新规划)。右侧列出了架构的优缺点。

1.5 Multi-Agent:组团队分工干

核心思想:不靠一个超级Agent包揽一切,而是构建多个角色明确的Agent,各司其职,通过通信协议协作完成复杂任务。通常有一个Supervisor(协调者)负责任务分配和结果汇总。

代表框架各有特色:

框架 核心机制 适合场景 特点
AutoGen (微软) 对话涌现式,GroupChat群聊协商 研究/探索型任务 最灵活,但难调试
CrewAI 角色驱动,API极简 内容创作、报告生成 最易上手,流程可预测
MetaGPT SOP驱动,模拟软件公司 软件开发类 文档交接,减少幻觉传播
LangGraph 状态机/图编排 精细控制型任务 最灵活的工程化方案

图解:Multi-Agent的典型协作模式------Supervisor接收用户请求后做任务分解,分别派给研究员/工程师/测试员三个子Agent,最后汇总结果。右侧列出了4个代表框架的定位。

1.6 三种架构对比总览

维度 ReAct Plan-Execute Multi-Agent
核心循环 Thought→Action→Observation Plan→Execute→Replan 协商→执行→汇总
架构复杂度
Token消耗 很高
短任务成功率(~5步) ~90% ~92% ~88%
长任务成功率(~20步) ~40% ⚠️ ~70% ~80%
灵活性 极高(实时调整) 中(需重新规划) 低(分工固定)
可调试性 简单(单链路) 中等 困难(多链路交叉)
延迟 简单任务低/复杂任务高 中等且可预测 高(通信开销)

核心结论 :没有最好的架构,只有最合适的架构。选型的关键变量是任务步骤数是否需要多专业分工


二、实现:三种架构的极简代码

以下代码基于LangChain最新API,全部本地可运行。完整代码已上传GitHub(文末链接)。

2.1 环境准备

复制代码
pip install langchain langchain-openai langgraph
复制代码
import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

os.environ["OPENAI_API_KEY"] = "your-api-key"

# 准备两个简单工具
@tool
def search(query: str) -> str:
    """搜索互联网获取信息"""
    # 实际项目中接入搜索API
    return f"搜索结果:{query}的相关信息..."

@tool
def calculate(expression: str) -> str:
    """数学计算"""
    try:
        return str(eval(expression))
    except:
        return "计算失败"

tools = [search, calculate]
llm = ChatOpenAI(model="gpt-4o", temperature=0)

2.2 ReAct Agent(10行核心代码)

复制代码
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

# ReAct的核心:让LLM在"思考-行动-观察"中循环
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手。根据需要使用工具来回答问题。\n"
               "思考过程:先Thought(思考),再Action(调用工具),"
               "看到Observation(观察结果)后继续,直到得出Final Answer。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),  # ← 关键:存放Thought-Action-Observation历史
])

# 创建ReAct Agent
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 运行
result = agent_executor.invoke({
    "input": "搜索2026年中国GDP增长率,然后乘以1.5,告诉我结果"
})
print(result["output"])

运行时会看到完整的Thought→Action→Observation链路:

复制代码
> Entering new AgentExecutor chain...

Thought: 我需要先搜索2026年中国GDP增长率
Action: search
Action Input: "2026年中国GDP增长率"
Observation: 搜索结果:预计2026年中国GDP增长率约为5.2%...

Thought: 现在需要把5.2乘以1.5
Action: calculate
Action Input: "5.2 * 1.5"
Observation: 7.8

Thought: 得到最终结果
Final Answer: 2026年中国GDP增长率约为5.2%,乘以1.5后结果为7.8。

> Finished chain.

2.3 Plan-Execute Agent

复制代码
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import List

# 阶段1:定义规划器 —— 生成多步计划
class Plan(BaseModel):
    """多步执行计划"""
    steps: List[str] = Field(description="按顺序执行的步骤列表")

planner_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个规划专家。将用户需求拆解为明确的执行步骤。"),
    ("human", "{objective}"),
])
planner = planner_prompt | llm.with_structured_output(Plan)

# 阶段2:执行器 —— 复用上面的ReAct Agent逐步执行
def execute_step(step: str) -> str:
    """用ReAct Agent执行单个步骤"""
    result = agent_executor.invoke({"input": step})
    return result["output"]

# 阶段3:主流程 —— 先规划,再逐步执行
def plan_and_execute(objective: str) -> str:
    # 1. 生成计划
    plan = planner.invoke({"objective": objective})
    print(f"计划:{plan.steps}")

    # 2. 逐步执行
    results = []
    for i, step in enumerate(plan.steps):
        print(f"执行步骤 {i+1}/{len(plan.steps)}: {step}")
        result = execute_step(step)
        results.append(f"步骤{i+1}: {result}")

        # 3. 可选:检查是否需要重新规划(简化版,实际可加Replan逻辑)
        # if need_replan(result): plan = replan(objective, results)

    # 4. 汇总结果
    return "\n".join(results)

# 运行
result = plan_and_execute("调研Python和Rust两门语言的优缺点,给出学习建议")
print(result)

2.4 Multi-Agent(基于LangGraph)

复制代码
from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated
import operator

# 定义协作状态
class TeamState(TypedDict):
    task: str
    research_result: str
    code_result: str
    final_report: str

# Agent A:研究员
def researcher(state: TeamState) -> dict:
    """负责调研分析"""
    result = llm.invoke(f"作为研究员,针对以下任务做技术调研:{state['task']}")
    return {"research_result": result.content}

# Agent B:工程师
def coder(state: TeamState) -> dict:
    """负责写代码"""
    result = llm.invoke(
        f"作为工程师,基于以下调研结果写代码实现:{state['research_result']}"
    )
    return {"code_result": result.content}

# Agent C:总结者
def summarizer(state: TeamState) -> dict:
    """负责汇总报告"""
    result = llm.invoke(
        f"汇总以下内容为最终报告:\n调研:{state['research_result']}\n代码:{state['code_result']}"
    )
    return {"final_report": result.content}

# 构建协作图
workflow = StateGraph(TeamState)
workflow.add_node("researcher", researcher)
workflow.add_node("coder", coder)
workflow.add_node("summarizer", summarizer)

# 定义执行顺序:研究 → 编码 → 汇总
workflow.add_edge(START, "researcher")
workflow.add_edge("researcher", "coder")
workflow.add_edge("coder", "summarizer")
workflow.add_edge("summarizer", END)

# 编译运行
app = workflow.compile()
result = app.invoke({"task": "实现一个简单的网页爬虫"})
print(result["final_report"])

代码要点:ReAct最简单(一个Agent+工具循环);Plan-Execute是「ReAct外面套一层规划」;Multi-Agent需要设计多个Agent角色和协作图,复杂度跳升。


三、落地:工程中到底怎么选

这一层是核心。原理和代码谁都能搜到,但什么场景用哪种架构、踩过什么坑、怎么决策------这才是工程价值。

3.1 选型决策矩阵

场景特征 推荐架构 理由
问答/客服/单次工具调用 ReAct 步骤少(1-5步),实时性好
数据调研/报告生成/批量任务 Plan-Execute 步骤多(5-20步),需要全局规划
代码开发+测试+文档 Multi-Agent 需要多专业角色分工
不确定复杂度的任务 ReAct起步 先跑通,复杂度按需加
20步以上的长流程 Plan-Execute ReAct在长链任务成功率骤降至40%
需要并行处理子任务 Multi-Agent 多Agent可并行,但协调成本高

选型黄金法则

80%的场景,用ReAct起步就够了。 不要一上来就上Multi-Agent------那是过度工程。先让简单架构跑起来,遇到瓶颈再演进。

3.2 踩坑实录

坑1:ReAct陷入死循环

复制代码
现象:
Agent反复调用同一个工具,Thought一直在"我再试试"
循环了8次才报错退出,烧了2万token

原因:
工具返回结果质量不稳定,Agent无法判断"已经够了"
ReAct没有全局终止条件,依赖LLM自己判断"信息够了"

解法:
1. 设置 max_iterations=5  ← 硬性兜底
2. 在System Prompt中加约束:
   "如果连续2次获得相同结果,直接给出当前最佳答案"
3. 对工具返回结果加置信度评分,低于阈值直接终止

效果:
循环率从30%降到3%,平均token消耗减少60%

坑2:Plan-Execute的计划全是幻觉

复制代码
现象:
Planner生成的计划看起来合理,但Step 2依赖Step 1的结果
而Step 1的输出格式和Planner预期完全不同,导致Step 2直接失败

原因:
Planner是"空想"计划,没有考虑每步实际输出的格式和内容
这是Plan-Execute的固有缺陷——计划和执行之间存在信息断层

解法:
1. 在每步执行后,检查结果是否满足下一步的前置条件
2. 不满足时触发Replan,把已有结果喂给Planner重新规划
3. 关键步骤的输出用structured output约束格式

代码:
def execute_with_replan(plan, objective):
    results = []
    for i, step in enumerate(plan.steps):
        result = execute_step(step)
        results.append(result)
        # 检查是否需要重新规划
        if i < len(plan.steps) - 1:
            if not check_prerequisite(result, plan.steps[i+1]):
                plan = replan(objective, results)  # ← 带着已有结果重新规划
                break  # 用新计划继续执行
    return results

坑3:Multi-Agent通信灾难

复制代码
现象:
3个Agent互相对话,30轮还没出结果
日志里全是"我认为你应该..." "不,我觉得..."
token消耗是ReAct的10倍,结果还不如单Agent

原因:
Agent之间没有明确的"对话终止协议"
每个Agent都想"帮助对方",导致无限协商
这是AutoGen GroupChat模式的经典问题

解法:
1. 用LangGraph的状态机模式替代自由对话
   — 明确定义"谁说话、什么时候结束"
2. 限制每个Agent最多发言2轮
3. 设置Supervisor强制做决策,而不是让Agent自己协商
4. 如果任务能拆成"流水线"(A→B→C),
   就不要用"圆桌讨论"模式

教训:
Multi-Agent最大的坑不是技术实现,
而是"到底需不需要多Agent"。
大多数场景,一个带好工具的ReAct Agent就能搞定。

3.3 成本对比数据

这是我在实际项目中的测算(GPT-4o,2026年初价格):

图解解读 : - 左图 :Multi-Agent单次成本(¥0.52)是简单ReAct(¥0.03)的17倍 - 右图 :ReAct在5步之前成功率很高(>90%),但超过20步骤降至40%------这正是你该切换到Plan-Execute的临界点 - 核心结论:任务步骤数和成本是选型的两大硬约束

3.4 架构演进路径(推荐)

不要一步到位,按需演进:

图解 :从ReAct起步,遇到瓶颈才升级。80%项目止步于阶段2就够了------别一上来就上Multi-Agent,那是过度工程。

3.5 选型决策树

最后送一个一图决策法:

决策路径 :先看步骤数(≤5走ReAct,否则继续判断),再看是否需要多专业分工(否则Plan-Execute,否则Multi-Agent)。不确定复杂度时,永远先选ReAct

核心原则 :每一步演进都是因为前一步遇到了真实瓶颈,而不是因为「Multi-Agent听起来更高级」。


四、总结

核心要点

1. ReAct = 走一步看一步,适合短任务(1-5步),灵活但长链容易跑偏

2. Plan-Execute = 先规划再执行,适合长流程(5-20步),有全局视野但重新规划成本高

3. Multi-Agent = 组团队分工干,适合多专业协作任务,但通信开销和调试复杂度最高

4. 选型法则:80%场景ReAct起步,长链任务上Plan-Execute,多专业分工才上Multi-Agent

5. 演进路径:ReAct → Plan-Execute → 轻量Multi-Agent → 完整Multi-Agent,按需升级

下期预告

下一篇:《手写ReAct Agent:从Thought到Action全流程拆解》 我们将从零手写一个ReAct Agent(不用LangChain),彻底搞懂Thought-Action-Observation循环的底层实现。

互动

你的Agent项目用的是哪种架构?遇到过什么坑?评论区聊聊,下一篇我可以针对性拆解。

相关推荐
dfbz1234561 小时前
山茶油礼盒包装工程手记:材质、结构与工艺的参数化拆
大数据·人工智能·经验分享
做萤石二次开发的哈哈1 小时前
基于萤石蓝海 AIoT 的饲料原料监管溯源视频管理平台建设方案:面向多年存档与按工单调阅的监管要求
人工智能·物联网·萤石开放平台·蓝海aiot一站式工作台·aiot开发
why-geo1 小时前
AI时代,AI入口流量会全面颠覆搜索引擎流量吗?
大数据·人工智能
小白学大数据1 小时前
Python 小工具实战:用问财接口搭建金融数据采集器
开发语言·人工智能·python
爱学堂IT课程大全1 小时前
尚硅谷-AI大模型之深度学习,AI大模型就业班线下2026版
人工智能
意图共鸣1 小时前
思想开源:意图共鸣科技把一整套“AI认知体系”带进了AtomGit
人工智能·科技
wshzd1 小时前
LLM之Agent(七十三)|PI(十二)对话循环与消息状态机
人工智能
IT_陈寒1 小时前
Redis并发写入踩坑记录:别让超时设置坑了你
前端·人工智能·后端
俊哥V1 小时前
AI一周事件 · 2026-09-09 至 2026-09-15
人工智能·ai