Checkpoint 持久化 + HITL 中断恢复
场景:用户让 Agent"删除生产库用户表"。Agent 一路检查权限 → 执行到敏感操作 interruptBefore 暂停 → 释放 HTTP 线程等人工审批 → 批准后从 Checkpoint 继续。ReAct 编译成 StateGraph 后,持久化/中断/嵌套/可观测四件事从"自己实现"变成"图引擎赠送"——前提是先挂上 checkpointer,代价是节点会被重跑。
1x2x
待播放
while 循环致命缺陷 → 编译成状态图 → 条件路由 → Checkpoint 每步存盘 → interruptBefore 暂停等审批 → resume 从断点继续
光点 = 当前环节 · 挂上 checkpointer 才送得到:持久化 / 中断 / 嵌套 / 可观测(代价是节点会被重跑)
StateGraph 节点链路(删除生产库用户表)—
AGENT_MODELLLM 推理:要删用户表—
AGENT_TOOLcheck_permission:仅 DBA—
条件路由有 tool_calls → 工具节点—
Checkpoint每步存 全局状态—
interruptBefore敏感节点前暂停—
resume批准后从断点继续—
就绪点 ▶ 播放,看"删生产库"任务如何在敏感节点前暂停等审批。Checkpoint+HITL
⚡ 运行时动作:正在发生什么💡 知识讲解:为什么这么设计
知识点一句话总结:ReAct 循环编译成 StateGraph 有向状态图(LLM 节点 ↔ Tool 节点 + 条件边 makeModelToTools),持久化/中断/嵌套/可观测四件事从"自己实现"变成"图引擎赠送"——但前提是编译时挂上 checkpointer,且 state 可序列化、节点幂等。Checkpoint:节点只返回增量(Map<String,Object> + KeyStrategy:Replace/Append/Merge),引擎合并到全局状态并在每个 super-step 落盘(state + 下一步节点 + checkpoint_id)——崩溃后最多退一个节点恢复。HITL:interruptBefore 在敏感节点前暂停 → 存 Checkpoint + 释放 HTTP 线程 → 等人工审批(接受/拒绝/修改)→ resume 执行那个尚未跑过的节点。最容易踩的反转:中断若写在节点内,恢复时整节点从头重跑,它之前的写操作会重复——所以要么把副作用收在节点末尾,要么带幂等键;选断点位置就是在选"重跑是否无害"。状态外化是基础——"可打断可恢复"是"状态全量可存盘"的自然结果。