Agent 架构怎么选?ReAct、Workflow、Graph 与 Multi-Agent 的边界
文章摘要:架构选型不是追逐新名词,而是判断任务中有多少不确定性、状态和风险必须交给模型。本文用最小代码、决策树、调用量级和真实演进路径,选择 ReAct、Workflow、Graph 或 Multi-Agent。
所属系列:ReAct 与 Agent Loop 工程(6/6)
很多 Agent 项目一上来就画出五六个角色:规划 Agent、搜索 Agent、分析 Agent、写作 Agent、审查 Agent。图很好看,系统却更慢、更贵,也更难调试。
选型的第一原则不是哪个词更新,而是:任务里到底有多少不确定性必须交给模型。
三种最小代码形态
先看代码结构,差异会比名词更直观。下面都省略业务实现,只对比控制权放在哪里。
固定 Workflow:步骤和顺序由代码决定。
async def workflow(order_id: str) -> dict:
order = await read_order(order_id)
eligibility = check_refund_rules(order)
if not eligibility["allowed"]:
return eligibility
return await create_refund(order_id, order["amount"])
ReAct:模型根据每轮工具反馈决定下一步,一次应用调用内部可能包含多次模型调用。
import os
from langchain.agents import create_agent
MODEL = os.getenv("AGENT_MODEL")
if not MODEL:
raise RuntimeError("请设置 AGENT_MODEL")
agent = create_agent(model=MODEL, tools=[read_order, search_policy])
async def run_react(request: str) -> dict:
return await agent.ainvoke(
{"messages": [{"role": "user", "content": request}]}
)
Graph:节点、条件边、恢复点和人工中断由显式状态机决定;节点本身可以是普通函数,也可以是 Agent。
from langgraph.graph import END, START, StateGraph
builder = StateGraph(OrderState)
builder.add_node("read", read_node)
builder.add_node("judge", rule_node)
builder.add_node("review", human_review_node)
builder.add_edge(START, "read")
builder.add_edge("read", "judge")
builder.add_conditional_edges("judge", route_risk, {"review": "review", "end": END})
graph = builder.compile(checkpointer=checkpointer)
第三篇的 StateGraph 就是典型案例:Plan-and-Execute 负责生成和补齐计划,Graph 负责保存状态、执行节点和控制路由。
四种模式分别适合什么
- 模式:Workflow;控制权:代码;适合场景:路径固定、规则明确、稳定执行;主要代价:灵活性低,新增分支要改代码
- 模式:ReAct;控制权:模型局部决策;适合场景:少量动态步骤,下一步依赖即时反馈;主要代价:调用次数和延迟有波动
- 模式:Plan/Graph;控制权:显式状态与路由;适合场景:多分支、全局覆盖、恢复、人审;主要代价:状态设计和测试成本更高
- 模式:Multi-Agent;控制权:多个隔离执行体;适合场景:上下文、工具、权限确有隔离收益;主要代价:调用、协调和错误传播最多
Plan-and-Execute 不是第五种底层运行时。它通常落在 Workflow 或 Graph 之上:先得到结构化计划,再由执行图管理依赖、worker 和审查。
一个可执行的决策树
能否用普通函数完成?
能 -> 普通代码
不能 -> 执行路径是否固定?
是 -> Workflow
否 -> 是否只有少量动态步骤?
是 -> ReAct
否 -> 是否需要全局覆盖、恢复或人工审批?
是 -> Plan-and-Execute / Graph
否 -> 先把任务缩成可验收 PoC
只有当拆分能带来上下文、工具或权限隔离时,才继续考虑 Multi-Agent。
“先缩小问题范围”具体做什么
这不是让读者回去把需求想清楚,而是做五个可执行动作:
- 先定义 verifier: 写出什么结果算通过,最好能自动检查。
- 拆可独立验收的子任务: 例如先完成“收集 3 家竞品定价”,不要一口气做完整战略报告。
- 砍非核心交付物: PoC 先不要自动发邮件、做幻灯片和写数据库。
- 固定输入源与工具: 先限定一个知识库、两个只读工具,减少搜索空间。
- 只跑一条主路径: 先证明最常见路径可靠,再增加异常分支、恢复和审批。
如果缩小后变成固定步骤,就用 Workflow;如果只剩两三个动态判断,就用 ReAct。不要因为原始需求很大,就默认需要多 Agent。
成本和延迟怎样估
不要引用没有测试环境的“平均 3.2 秒”之类数字。更可靠的是先数模型调用,再乘以你自己环境的单次延迟和 token 分布。
- 模式:Workflow;典型模型调用量级:0,或固定的少量调用;延迟方差:低;调试难度:低
- 模式:ReAct;典型模型调用量级:初始调用 + 每轮工具反馈后的继续调用;延迟方差:中到高;调试难度:中
- 模式:Plan-and-Execute / Graph;典型模型调用量级:planner + 各 worker 循环 + reviewer + 可选 replan;延迟方差:高;调试难度:中到高
- 模式:Multi-Agent;典型模型调用量级:各 Agent 调用之和 + handoff + 汇总;延迟方差:最高;调试难度:高
可以用下面的近似式做容量规划:
ReAct 调用数 ≈ 1 + 工具反馈轮数
Plan-and-Execute ≈ planner + Σ(worker 各自调用) + reviewer + replan
Multi-Agent ≈ Σ(各 Agent 调用) + 交接/汇总调用
总延迟 ≈ 关键路径上的串行调用延迟 + 工具延迟 + 排队/重试
并行只能缩短关键路径,不能自动降低 token 或费用。五个 worker 同时运行,墙钟时间可能下降,总调用成本仍然存在。
架构通常是演进出来的
真实项目很少一次选对,更常见的路径是:
固定 Workflow
-> 少量步骤需要动态判断,引入 ReAct
-> 经常漏项,引入 Plan-and-Execute
-> 需要恢复、审批和复杂分支,落到 Graph
-> 上下文、工具或权限互相污染,再拆 Multi-Agent
这不是要求每个项目依次升级。只在当前形态暴露了可测量问题时演进:漏项率、失败恢复时间、上下文污染、权限冲突或关键路径延迟。没有问题就不升级。
反向迁移也合理。一个探索期 ReAct 流程稳定以后,可以把高频路径固化成 Workflow,减少成本和不确定性。
为什么 Multi-Agent 不应成为默认答案
每增加一个 Agent,系统都会增加一份上下文、一组模型调用、一条错误传播路径和一套工具权限。如果所谓“研究 Agent”和“写作 Agent”读取同一批资料、使用相同工具、拥有相同权限,只是角色提示词不同,拆分收益通常很小。
真正合理的拆分需要至少一种真实边界:
- 法务资料不能进入营销上下文;
- 研究 Agent 只有读权限,发布 Agent 才有写权限;
- 节点需要不同模型、评测集或验收标准;
- 独立子任务能并行,且结果可以结构化聚合。
Graph 也不等于多个 Agent 连起来。稳定的生产图往往混合普通函数、规则引擎、Agent、人工中断和幂等工具。
用风险决定是否人工介入
不要只写:
if confidence < 0.7:
ask_human()
模型自报置信度未必经过校准。更可靠的触发条件是金额阈值、敏感数据、生产环境、不可逆操作、证据冲突、业务拒绝和预算即将耗尽。
人工介入是风险控制点,不是模型犹豫时的万能兜底。
什么时候什么都不该用
- 一步查天气、做算术、查单个订单:普通函数或一次 tool calling 足够;
- 流程完全确定:Workflow 比 ReAct 更稳定;
- 没有客观验收条件的开放问题:先定义交付标准,不要先堆循环;
- 团队没有 trace、评测、权限和故障处理能力:先补运行基础,再扩大 Agent 自主性。
最小架构不是保守,而是给未来演进留下可诊断的基线。
六篇文章解决了什么
- 第 1 篇:ReAct 的核心是根据观察继续行动,不是
Thought:文本模板。 - 第 2 篇:Harness 给单次 Agent 运行增加预算、审批、幂等和恢复。
- 第 3 篇:Plan-and-Execute 用结构化计划、worker 和 reviewer 管长任务。
- 第 4 篇:Ralph Loop 用外部验证器驱动 Coding Agent 提交小增量。
- 第 5 篇:MCP 统一外部能力接入,但不替代 Runtime 和业务安全。
- 第 6 篇:用最少的不确定性选择并演进架构。
小结
确定的事情用代码。
固定路径用 Workflow。
少量动态步骤用 ReAct。
长任务、恢复和复杂状态用 Plan-and-Execute / Graph。
只有存在真实隔离收益时才用 Multi-Agent。
Agent 架构的目标不是让图更壮观,而是用最少的不确定性完成任务,并且能解释失败、恢复执行和验证结果。
参考资料
- Anthropic, Building effective agents
- Lilian Weng, LLM Powered Autonomous Agents
- LangGraph, Workflows and agents
- LangGraph, Overview
- LangChain, Multi-agent
- OpenAI Agents SDK, Agent orchestration
更多推荐


所有评论(0)