Agent学习系列 第4课:Agent 状态机与工作流编排
前面三课,我们搞清楚了 Agent 是什么、怎么用 Prompt 调教它、怎么给它接工具。到这儿,一个残酷的问题就冒出来了——
你以为能跑的 Agent,十次里有六次跑飞。
同样的输入,这次答对了下次答错;任务跑到一半开始胡说;机器一重启,之前跑了一半的长任务全废了。这不是你 Prompt 写得差,是Agent 缺了一样后端系统天生就有的东西:可控性。
第 4 课,我们就来解决 Agent 最大的痛点——不稳定。把"靠运气"变成"像后端系统一样可控"。
这一课,我们要让 Agent 具备三样能力
可观测:每一步都能被记录、被回放,不是黑盒。
可控制:有状态机约束执行路径,不随意乱跑。
可恢复:中断后能从检查点接着跑,不用从头再来。
这三样能力,普通 ChatBot 一个都没有。而企业级 Agent,缺一不可。
一、为什么 Agent 需要状态机
先戳破一个幻觉:LLM 没有真正的记忆。
每次 API 调用都是一次独立的推理,上下文窗口之外的内容它一概不知。多轮对话看起来"记得你",本质是把历史原样塞回 prompt——窗口一满就丢,换个进程就没了。
所以 Agent 的"记忆"不能寄希望于模型,必须外部维护:用数据库、用 JSON、用任何持久化存储,把"我做到哪了、做完了什么、哪些失败了"记下来。Agent 每次行动前先读状态,行动后再写回状态。
一句话:LLM 负责推理,状态机负责"记住自己在哪"。
二、Agent 状态结构设计
一个最小可用的 Agent 状态,通常就这么五个字段:
这五个字段各管一摊:
| 字段
|
作用
goal |
锚定方向,防止 Agent 跑偏
|
| current_step |
标记进度,防止同一节点重复执行
|
| completed_tasks |
已完成队列,反思时参考
|
| pending_tasks |
待做队列,驱动下一步规划
|
| tool_history |
工具调用全记录,支撑反思与防循环
|
别小看这个结构。它是后面所有"可控"能力的地基。
三、DAG 工作流(有向无环图)
复杂任务不能让 Agent 想到哪做到哪,得有结构。最经典的就是 DAG(有向无环图)。
为什么必须是"无环"?
禁止循环依赖:A 等 B、B 等 A,直接死锁。
避免重复执行:同一个节点只跑一次,不浪费调用也不污染状态。
支持并行:没有依赖关系的节点可以同时跑,长任务提速明显。
把任务拆成 DAG 之后,Agent 不再是"一条线走到黑",而是一个有拓扑顺序的执行图。
四、LangGraph 深度设计
如果 DAG 是思想,LangGraph就是把这个思想变成代码的主流框架。它有四个核心概念:
| 概念
|
含义
| Node 节点 |
一个执行单元,可以是 LLM / 工具 / 函数
| | Edge 边 |
节点间的固定流转,定义执行顺序
| | Conditional Edge 条件边 |
根据状态动态决定下一步走哪个节点
| | State Reducer 状态归约 |
多节点写同一状态时按规则合并,而非覆盖
|
其中State Reducer 是最容易被低估的一个。当多个节点并发修改状态,如果直接"后写覆盖前写",数据就丢了。Reducer 定义合并规则(比如 append 列表、取最大值),才保证状态一致性。
正是这四个概念,把 Agent 从"单线脚本"升级为可控的状态图。
五、企业级防循环设计
死循环是 Agent 线上最贵的 bug——它不报错,只是默默烧钱。三个机制组合才能挡住:
① 调用指纹(fingerprint)
把 ToolName + 参数 取 Hash 当作指纹。两个调用指纹相同,就是"同一件事"。
② 执行轨迹(trace)
每次调用都记录:工具、参数、返回结果、时间戳。既支撑回放,也支撑审计——出问题了能查到是哪一步疯的。
③ 阶段退出条件
最多 retry 3 次,超过就放弃该分支,不死磕。
相似调用(指纹命中)禁止重复,避免 A→B→A→B 打转。
超时熔断:单个工具超过 N 秒强制终止。
三者在一起,死循环、重复调用、雪崩式重试,全被挡在门外。
六、长任务恢复机制(Checkpoint)
研究类、分析类任务动辄跑十几分钟甚至更久。中间进程崩溃、机器重启,难道要从头再来?
Checkpoint(检查点)就是解药:把当前状态序列化落盘。
每完成一个阶段,就存一次状态快照。
进程崩溃 / 机器重启后,读取最近的快照。
从断点续跑,而不是重新来过。
配合上一节的 tool_history,恢复后的 Agent 既知道"做到哪了",也知道"之前调过什么、结果如何"。
七、实战:长任务 Research Agent
把前面所有能力串起来,做一个能真正干活的 Research Agent:
① 自动拆任务:用户给一个研究主题,Agent 先生成 DAG——拆成"搜背景 / 找论文 / 读数据 / 做对比"等子任务。
② 分阶段执行:按 DAG 顺序调用搜索、读文献、执行代码。每个阶段结束写 Checkpoint,并用调用指纹去重。
③ 支持恢复:
中断后读取 Checkpoint 续跑,不重头再来。
tool_history
支撑反思(这一步为什么失败?)和去重(这个搜索做过了)。
全部完成 → 汇总成一份结构化的研究报告。
这就是一个"像后端系统一样可控"的 Agent 雏形。
本课重点回顾
-
状态外置
-
LLM 无记忆,进度必须存外部。
-
状态结构
-
goal / step / 任务队列 / 工具历史。
-
DAG
-
杜绝循环依赖与重复执行。
-
LangGraph
-
Node / Edge / Conditional Edge / State Reducer。
-
防循环
-
指纹 + 轨迹 + 退出条件。
-
Checkpoint
-
崩溃后从快照恢复。
-
实战
-
长任务 Research Agent 全链路。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/ai001/post/20260817/Agent%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97-%E7%AC%AC4%E8%AF%BEAgent-%E7%8A%B6%E6%80%81%E6%9C%BA%E4%B8%8E%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%BC%96%E6%8E%92/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com