前六篇围绕"一张图"展开:怎么画、怎么走、怎么存档、怎么暂停。这是本系列的最后一篇,视野放大一圈,回答三个问题:**一个用户换了新会话,Agent 还能记得他吗?一张图越画越大,怎么拆?一个 Agent 忙不过来,怎么让多个 Agent 分工?**它们分别对应长期记忆 Store、子图和多 Agent 协作。文末对整个系列做一次总结。
一、长期记忆:跨会话记住用户#
1.1 Checkpointer 的记忆边界#
第五篇用 Checkpointer 实现了会话记忆:同一个 thread_id 下,Agent 记得之前说过的话。但这份记忆被锁在线程里。用户今天在一个对话里说"我喜欢简短的回答",明天开一个新对话,thread_id 换了,Agent 就什么都不知道了。
这其实很合理:线程存的是"这次对话的完整过程",内容又多又杂,本来就不该带到别的对话里。用户偏好、个人信息、长期积累的知识,需要另一种存储——不属于任何一次对话,属于这个用户本身。
| Checkpointer(短期记忆) | Store(长期记忆) | |
|---|---|---|
| 存什么 | 一次会话的完整执行过程 | 提炼出来的事实、偏好、知识 |
| 按什么区分 | thread_id | 自定义的命名空间,通常含 user_id |
| 作用范围 | 同一线程内 | 跨线程、跨会话 |
| 谁来写 | LangGraph 每个超步自动存档 | 你在节点里主动写入 |
最后一行是关键区别:Checkpointer 是全自动的,Store 则完全由你决定"什么值得长期记住"。
1.2 Store 的基本操作#
Store 是一个键值存储,数据按命名空间组织。命名空间是一个元组,像文件夹路径一样,比如 ("alice", "profile") 表示"用户 alice 的个人资料":
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
store.put(("alice", "profile"), "pref-1", {"fact": "喜欢简短的回答"}) # 写入:命名空间、键、值
store.get(("alice", "profile"), "pref-1") # 按键读取一条
store.search(("alice", "profile")) # 列出命名空间下的所有条目


还没有公开留言,成为第一个写下回声的人。