首页 › G LangGraph Agent 编排 › G3 持久化与人机协作 › 01

G3-01 · Checkpointer 与 thread_id:给 Agent 装上记忆

进阶阶段约 240 分钟阶段:G3 持久化与人机协作

阶段:G3-持久化与人机协作 | 预计耗时:60 分钟 | 前置:G2 全部验收通过 新依赖:pip install langgraph-checkpoint-sqlite -i https://pypi.tuna.tsinghua.edu.cn/simple(MemorySaver 已内置不用装) 代码:要你自己敲成 langgraph-learn/examples/g3_memory.py

学习目标

  1. 理解 Checkpointer 存的是什么:每一步之后的完整状态快照
  2. 掌握 thread_id:同一个 id 有记忆,换 id 失忆——多用户/多会话隔离的全部秘密
  3. 亲眼验证:换 MemorySaver(内存,重启清零)vs SqliteSaver(落盘,重启保留)

核心知识

1. 为什么默认无记忆

graph.compile() 不带 checkpointer → 每次 invoke 都是新世界。加一行就有记忆:

from langgraph.checkpoint.memory import MemorySaver
graph = builder.compile(checkpointer=MemorySaver())

from langgraph.checkpoint.sqlite import SqliteSaver
saver = SqliteSaver.from_conn_string("checkpoints.db")     # 落盘版
graph = builder.compile(checkpointer=saver)

cfg = {"configurable": {"thread_id": "user-001"}}          # 调用时必须带
graph.invoke({"messages": [...]}, cfg)

2. thread_id:会话的身份证

  • 同 thread_id 连续 invoke:LangGraph 自动把上次的最终 State 接上(对话延续)
  • 换 thread_id:干净开始——这就是多租户:每用户一个 id,记忆永不串台
  • 生产上 id 常是 "user-{uid}" 甚至 "user-{uid}-{topic}"(同用户多话题隔离)

3. 快照不止给对话用

检查点 = 每步后的 State 存档。它同时支撑本阶段后面三件事:interrupt 恢复(G3-02)、断点续跑(G3-03)、时间旅行(G3-03)。所以检查点数据里还会记"这一步是谁、在哪个节点"。

实验任务

任务 1:记忆三连测(25 分钟)

用 G1-03 的 handmade ReAct 图加 checkpointer,脚本里连做三个实验: 1. thread_id="a" 问"我叫小明" → 同 id 再问"我叫什么?"(应答对) 2. thread_id="b" 问同样问题(应答不上) 3. thread_id="a" 第三问(还应该记得)——验证记忆跟 id 走不跟人走

任务 2:重启测试(15 分钟)

SqliteSaver 版跑实验 1 → 关掉进程重新运行脚本 → 直接问"我叫什么"(thread_id="a")——应然记得。这就是内存版做不到的持久化。顺手打开 checkpoints.db 看一眼(SQLite 文件,表里有序列化的状态)。

任务 3:隔离测试(15 分钟)

两个线程/两次运行各自不同 thread_id 交替对话——确认不会串台。多用户产品的基础就这一条。

验收标准

衔接下一阶段

有记忆了 → G3-02 interrupt 人工审批:让 Agent 在关键时刻停下来问你。

小测验(3 题)

答完立即判分,错题给解析;得分存本地。实验与实操题不上网测:回对话找老师验收。