kp-018 核心 25 分钟 编排与状态

检查点与恢复:持久化、重放与人机协同

#检查点 #持久化 #human-in-the-loop #幂等

前置知识

一句话定义

检查点(Checkpoint)在图编排的每个节点边界把完整 State 快照持久化,使长任务获得三项能力:崩溃后从最近快照恢复、带着任意快照重放调试、以及在人机协同(Human-in-the-Loop)中中断-审批-续跑。

直观类比

游戏存档:打 Boss 前存档(高危操作前中断),打输了读档重来(恢复),还能回看三个存档之前的选择(时间旅行调试)。存档里保存的是整个世界状态,而不是只存「你打了几下」。

为什么重要

多智能体任务动辄数十步、数十分钟、真金白银的 token 费用:没有检查点,进程崩溃或模型抽风就要从头再来;没有重放,kp-023 排错只能靠日志猜;没有中断机制,高风险操作(发邮件、写数据库、花钱)无法接人工审批。检查点是「可靠性三件套」(恢复/重放/人审)的共同地基。

前置知识

kp-017(节点边界——检查点的天然保存时机)。

核心概念

  • 检查点(Checkpoint):节点执行后写入的 State 完整快照,含版本与时间戳;
  • 线程(Thread / thread_id):一次任务运行的状态序列标识,检查点按线程串成历史链;
  • 恢复(Resume):从最近有效快照继续执行;
  • 重放 / 时间旅行(Replay / Time Travel):从任意历史快照重新执行后续图(改输入或改分支);
  • 中断(Interrupt):在指定节点前暂停并落盘,等待外部输入(人工审批)后恢复;
  • 幂等性(Idempotency):操作重复执行结果不变——恢复语义安全的前提。

原理与机制

保存什么:完整 State + 当前节点位置 + 配置(模型版本、参数)。检查点存储按可靠性阶梯选择:内存(开发用)→ SQLite(单机)→ Postgres(生产多实例)。恢复的不对称性:State 是纯数据可完美恢复,但副作用不能——节点里发过的邮件、扣过的款不会随回滚消失。由此得出恢复语义:恢复是 at-least-once(至少一次),可能重复执行「已执行一半的节点」。两条工程纪律保证安全:(1) 幂等键(Idempotency Key):副作用操作携带唯一键,服务端去重(写数据库用 upsert,调外部 API 用请求 ID);(2) 副作用外置与延迟提交:把不可逆操作挪到「审批门之后」的独立节点,检查点先落盘、动作后执行。人机协同的标准接线:在工具调用节点前设 interrupt → 系统保存快照并返回「待审批」→ 人审后以 Command(resume=批准/修改) 恢复 → 图从中断点继续。重放调试:kp-023 排错的核心手法——把怀疑有问题的上游节点产物替换为理想值,从该检查点重放下游,若下游恢复正常则根因锁定在上游(二分定位)。

图示

 节点A ──▶ [CP-1] ──▶ 节点B ──▶ [CP-2] ──▶ ▌interrupt ▐ ──▶ 节点C(发邮件) ──▶ [CP-3]
                        ▲                   │人工审批               │
                        │                   ✗驳回                  │
                        └────── 从 CP-2 恢复/重放 ◀── 修改输入 ──────┘
 恢复语义: at-least-once ⇒ 副作用必须幂等(幂等键)或外置到审批门之后

实例或案例

报告系统在第 6 节点(调用付费数据库)前设审批门:运行至 CP-5 暂停,运营在面板看到「本次预计消耗 ¥12,批准?」;批准后从 CP-5 续跑。20 分钟后进程因供应商故障崩溃——重启后从 CP-9 继续,此前 9 步成果无损;事后为验证某次结论偏差,工程师从 CP-4 带修改后的检索结果重放第 5–9 节点,十分钟完成归因。

常见误区

  • 误区一:检查点只存「进度百分比」。 只存步数不存 State,恢复后状态对不齐,等于没存;
  • 误区二:以为回滚能撤销副作用。 发出去的邮件回不来——不可逆操作必须幂等化或挪到审批后;
  • 误区三:所有节点都设中断点。 人审是稀缺资源,只挂在高危/不可逆节点,否则人工成为吞吐瓶颈。

与其他知识点的关系

kp-015 的压缩前后各留检查点可对比恢复质量;中断-审批是 kp-022 防护栏的「人工层」实现;重放是 kp-023 排错工作流的核心动作;重放产生的运行差异用 kp-025 的 trace 对齐比较。

自测题

  1. 检查点支撑的三项能力?

要点:崩溃恢复、任意快照重放(时间旅行调试)、中断-审批-续跑(人机协同)。

  1. 为什么恢复语义是 at-least-once?两条配套纪律?

要点:State 可完美恢复而副作用不能回滚,节点可能被重复执行;配套幂等键与「副作用外置到审批门后」。

  1. thread_id 的作用?

要点:标识一次运行的检查点链,是恢复、重放与多实例间续跑的寻址单位。

延伸阅读

LangGraph 官方文档的 Persistence 与 Human-in-the-loop 章节给出了 checkpointer、interrupt 与 Command 的完整 API 形态。

相关知识点

学习状态:
未学