备选标题(提高点击率):
- 为什么你的多 Agent 总是死循环?从 if-else 到状态机,我踩过的坑
- 别让大模型瞎跑!前端开发者秒懂的 LangGraph 状态机指南
- 写了 20 个 if-else 之后,我终于懂了为什么 AI 工程需要状态机
- 把 Redux 思想放进 AI:前端视角下的复杂多 Agent 编排实战
- 生产环境避坑:为什么复杂 AI 业务流必须用"图"来控制?
【省流助手/核心观点】
多 Agent 协作的核心痛点在于 "流程失控" 。如果只靠大模型的自由发挥或者硬编码的 if-else 来控制多个 Agent 之间的交接,系统极易崩溃、死循环或丢失上下文。
破局之道是:引入状态机(State Machine)和有向图(Graph)架构。
对于前端开发者而言,理解当下最火的 LangGraph 极其简单------把它当作后端的 Redux + XState 即可。代码控制业务流程走向,大模型只负责节点内的具体执行,这是目前最稳健的生产级方案。
一、痛点:为什么 if-else 控制不住多 Agent?
在上一篇文章中,我们聊到了从单体 Agent 走向 Orchestrator(主控分发)模式。很多同学看完后一拍大腿:"这题我会!不就是一个 switch/case 或者一堆 if-else 吗?"
设想这样一个真实的售后退款流程:
- Router Agent 判断意图,交给【售后 Agent】。
- 售后 Agent 发现订单超过 30 天,无权处理,需要转交【主管 Agent】审批。
- 主管 Agent 补充询问用户,审批通过后,又需要把流程退回给【售后 Agent】继续打款。
❌ 错误做法:硬编码嵌套逻辑
python
if intent == "REFUND":
res = refund_agent.run()
if res == "NEED_MANAGER":
res2 = manager_agent.run()
if res2 == "APPROVED":
# 糟糕,这里还要调一遍 refund_agent
# 如果中间又要重新问用户怎么办?代码直接变成嵌套地狱!
refund_agent.run_again()
硬编码的缺陷在于:一旦流程出现回环(循环),或者需要随时挂起(等用户点击页面按钮再继续),传统的同步流代码根本无法维护。
二、降维打击:把多 Agent 当成 Redux 状态机
前端开发者做复杂页面时,遇到状态极其复杂的情况会怎么办?引入 Redux 或者是状态机(如 XState)。 多 Agent 架构(比如火遍全网的 LangGraph 框架)完全是一模一样的思想:
- State(全局状态):一个包含上下文的字典(类似 Redux Store)。
- Nodes(节点):一个个具体的 Agent,它们就像 Reducer,接收 State,处理后返回更新的 State。
- Edges(边):根据当前 State 判断下一个执行的 Node 是哪个。
✅ 正确做法:基于图循环的状态机控制
抛开复杂的框架概念,我们可以自己手撸一个极简的 Agent 状态机:
python
# 1. 类似 Redux Store 的全局状态
state = {
"current_agent": "router_node",
"is_approved": False,
"status": "running"
}
# 2. 类似 Reducer 的具体 Agent (节点)
def refund_node(state):
if not state["is_approved"]:
# 没有权限,改变状态并指引流向主管节点
state["current_agent"] = "manager_node"
else:
# 已经审批过,执行退款
state["status"] = "finished"
return state
# 3. 驱动引擎:一个 While 循环
while state["status"] == "running":
if state["current_agent"] == "refund_node":
state = refund_node(state)
elif state["current_agent"] == "manager_node":
state = manager_node(state)
# ...
这种模式下,控制流是确定的(由代码 While 循环和状态变化决定),而内容生成是动态的(由模型决定)。
三、为什么这是工业界的最佳实践?
- 可预测性与调试 :因为每一次流转都必须修改
state对象。出了问题,把state打印出来,立马知道死在了哪一步,就像在 Redux DevTools 里查 bug 一样爽。 - 随时打断与恢复(Human-in-the-loop) :如果你需要"人类主管点击审批"才能继续,只需要把当前的
state存进数据库,循环停止。人类点完按钮后,把state取出来,把is_approved改为 true,循环继续跑。 - 避免大模型幻觉:我们不再依靠模型自己去思考"我下一步该调用谁",而是由图规则(Edges)强行规定。大模型只需乖乖做好手头那个节点的任务。
四、【生产环境避坑指南】
在真正将多Agent流转落地到生产环境时,前端和 AI 工程师请务必注意:
- 防止无限死循环 :多 Agent 互相推诿极易产生死循环。务必在图循环里加上
max_steps限制(比如超过 10 步强制抛出异常或转交人工)。 - 状态裁剪(State Trimming) :随着流程推进,
state里的对话历史(messages)会越来越长,极其消耗 Token。在传给下一个 Agent 时,只传必要的上下文,而不是整个全局 Store。 - 持久化必须跟上:如果 Agent 执行时间长达 1 分钟,你的前端请求早就超时了。务必搭配 WebSocket 方案,同时后端利用数据库(如 Postgres/Redis)实时保存 checkpoint(检查点)。
总结
别再试图用 Prompt 把一个大模型教成万能超人了!把系统拆成多个专门的 Agent,然后用状态机/图结构把它们串起来。用代码来保障流程的下限,用 AI 来提升业务的上限,这才是真正的 AI 工程师思维。