前面三课,我们搞清楚了 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 雏形。

本课重点回顾

  1. 状态外置

  2. LLM 无记忆,进度必须存外部。

  3. 状态结构

  4. goal / step / 任务队列 / 工具历史。

  5. DAG

  6. 杜绝循环依赖与重复执行。

  7. LangGraph

  8. Node / Edge / Conditional Edge / State Reducer。

  9. 防循环

  10. 指纹 + 轨迹 + 退出条件。

  11. Checkpoint

  12. 崩溃后从快照恢复。

  13. 实战

  14. 长任务 Research Agent 全链路。