阶段:G3-持久化与人机协作 | 预计耗时:60 分钟 | 前置:G2 全部验收通过 新依赖:
pip install langgraph-checkpoint-sqlite -i https://pypi.tuna.tsinghua.edu.cn/simple(MemorySaver 已内置不用装) 代码:要你自己敲成langgraph-learn/examples/g3_memory.py
学习目标
- 理解 Checkpointer 存的是什么:每一步之后的完整状态快照
- 掌握 thread_id:同一个 id 有记忆,换 id 失忆——多用户/多会话隔离的全部秘密
- 亲眼验证:换 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 在关键时刻停下来问你。