Checkpointer:持久化检查点

面试官:「对话中断后怎么恢复?」

你:「用 Checkpointer 保存状态。」

面试官:「线程 ID 是干嘛的?」

你:「区分不同用户的对话会话,实现多线程并发。」

🤔 这一章,Checkpointer 检查点一篇搞懂。

5.1 Checkpointer 简介

Checkpointer 是 LangGraph 的状态持久化机制,让你的 Agent 可以:

  • 暂停和恢复执行
  • 维护多轮对话上下文
  • 实现线程隔离
python
from langgraph.checkpoint.memory import MemorySaver # 内存存储(适合开发和测试) checkpointer = MemorySaver() # 编译时传入 checkpointer app = graph.compile(checkpointer=checkpointer)

5.2 线程与会话

每个对话会话对应一个thread_id,状态在不同线程间完全隔离。

python
# 线程 A 的对话 config_a = {"configurable": {"thread_id": "user_123_session_1"}} result_a = app.invoke({"messages": ["你好"]}, config_a) # 线程 B 的对话(完全独立) config_b = {"configurable": {"thread_id": "user_456_session_1"}} result_b = app.invoke({"messages": ["你好"]}, config_b) # 恢复线程 A 的对话(从上次暂停的地方继续) result_a2 = app.invoke({"messages": ["继续刚才的话题"]}, config_a)
图 5-1:多线程状态隔离
thread_id: "user_123" 状态 A thread_id: "user_456" 状态 B Checkpointer Storage 独立 独立

5.3 持久化后端对比

三种 Checkpointer 后端,适用于不同场景:

图 5-2:三种 Checkpointer 后端对比
MemorySaver 内存存储 ✓ 最快 ✗ 进程重启丢失 适合:开发调试 SqliteSaver SQLite 本地文件 ✓ 单机持久化 ✗ 不支持并发 适合:生产入门 PostgresSaver PostgreSQL 数据库 ✓ 高并发 ✓ 分布式 适合:生产环境

5.3.1 内存存储(开发用)

python
from langgraph.checkpoint.memory import MemorySaver checkpointer = MemorySaver() # 进程重启后丢失

5.3.2 SQLite(生产入门)

python
from langgraph.checkpoint.sqlite import SqliteSaver checkpointer = SqliteSaver.from_conn_string("messages.db")

5.3.3 PostgreSQL(生产级)

python
from langgraph.checkpoint.postgres import PostgresSaver checkpointer = PostgresSaver.from_conn_string( "postgresql://user:pass@localhost/db" )

5.4 中断与恢复

使用 interrupt 暂停执行,等待外部处理后再恢复。

图 5-3:中断恢复完整流程
执行 中断 Checkpoint 状态快照 人工处理 恢复 进行中 暂停 处理 完成
python
from langgraph.errors import NodeInterrupt def approval_node(state: AgentState) -> dict: if state["amount"] > 10000: # 暂停执行,等待审批 raise NodeInterrupt(f"需要审批:金额 {state['amount']}") return {"approved": True} # 恢复执行(外部审批后) app.invoke( None, # 不传新输入 config={"configurable": {"thread_id": "tx_123"}} )
使用场景
  • 大额订单需要人工审批
  • 发送敏感内容需要确认
  • 需要调用外部 API 获取数据

5.5 本章小结

  • Checkpointer 实现状态持久化,让 Agent 具备记忆能力
  • 每个会话对应一个 thread_id,状态完全隔离
  • 支持多种后端:MemorySaver(开发)、SqliteSaver(单机生产)、PostgresSaver(分布式生产)
  • NodeInterrupt 实现人工审批流程,常用于大额订单、敏感操作
  • 使用 config 参数控制线程、checkpoint 和配置
面试要点

高频题:Checkpointer 和 session 的区别?两者都管理状态,但 Checkpointer 负责持久化和恢复,session 是运行时的上下文容器。

下章预告

第 6 章我们将学习 Human-in-the-Loop:如何在 Agent 执行过程中插入人工干预,实现更复杂的审批和反馈流程。