阶段:G3-持久化与人机协作 | 预计耗时:50 分钟 | 前置:G3-03 断点续跑与时间旅行 代码:要你自己敲成
langgraph-learn/examples/g3_store.py一句话定位:Checkpointer 管对话内记忆(thread_id 维度),Store 管跨对话记忆(用户维度)——客服产品"记住老客户偏好"就是它
学习目标
- 理解两层记忆的分工:thread 记忆 vs Store 记忆(别混)
- 掌握 InMemoryStore 三操作:
put / get / search,理解 namespace 分层 - 做一个"跨会话记住用户偏好"的对话 agent(最小可用版)
核心知识
1. 两层记忆对照表(背下来)
| Checkpointer | Store | |
|---|---|---|
| 维度 | thread_id(一次对话) | 用户/实体(跨所有对话) |
| 内容 | 完整 State 快照链 | 你主动存的键值对 |
| 生命周期 | 会话结束仍在,但属于该会话 | 永久,所有会话可读 |
| 典型用途 | 断点续跑、审批恢复 | 用户画像、偏好、历史结论 |
2. Store 的结构与操作
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
graph = builder.compile(checkpointer=saver, store=store)
# namespace 是"文件夹路径",key 是文件名,value 是任意 dict
store.put(("users", "u001"), "preference", {"tone": "简洁", "language": "中文"})
store.get(("users", "u001"), "preference")
store.search(("users", "u001")) # 列出该文件夹全部
节点内拿 store:节点函数多声明一个参数 def node(state, *, store)(框架自动注入),或运行时 graph.get_store()。
3. 生产换 Postgres 版只改一行
InMemoryStore 用于开发;上线换 langgraph-checkpoint-postgres 的 PostgresStore——接口不变,这就是框架分层的好处。(你的本机/私有化路线:SQLite/Postgres 都可行,G7 项目里落地。)
实验任务
任务 1:偏好存取(20 分钟)
写 g3_store.py:
- agent 有两个节点:chat(回答)与 remember(从对话里提取偏好写 Store)
- 第一轮对话:用户说"我喜欢简洁回答" → remember 节点 put 进 ("users", "u001")
- 换一个全新 thread_id 开第二轮:chat 节点先 store.search 读偏好 → 回答风格应体现"简洁"
- 验证点:thread 换了(checkpointer 记忆没了),Store 记忆还在
任务 2:画像页(15 分钟)
store.search(("users", "u001")) 打印该用户全部记忆,做成"用户画像卡"输出——产品里"个人中心-我的偏好"就是这么做出来的。
任务 3:边界思考(10 分钟)
写进笔记:① 什么信息该进 Store?(稳定偏好/结论)什么不该?(本轮临时上下文)② 记得太多会怎样?(检索噪声——所以 namespace 设计要像文件夹一样有条理)
验收标准
G3 毕业检查点(对应路线图检查点 2):能演示杀进程后从检查点恢复;能解释 interrupt 配 checkpointer 的原因;能给老用户"记住偏好"。
衔接下一阶段
Agent 有记忆有审批了 → G4-01 结构化输出与工具进阶:接真实世界的工具。