Part 2 · 核心能力
06 记忆系统:短期 + 长期
06.1 先给结论:记忆分两层
2026 年的 LangGraph,记忆是两套互补的机制:
| 机制 | 存什么 | 范围 | 用途 |
|---|---|---|---|
| Checkpointer | 图的状态快照 | 单个会话(thread) | 续聊、人机协同、时光回溯 |
| Store | 应用自定义数据 | 跨会话 | 用户偏好、长期事实 |
很多人只知其一。两者一起用,Agent 才又"记得刚才聊啥",又"记得你是谁"。
06.2 短期记忆:Checkpointer
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver()
graph = g.compile(checkpointer=checkpointer)
cfg = {"configurable": {"thread_id": "user-001"}}
graph.invoke({"messages": "我叫小明"}, cfg)
graph.invoke({"messages": "我叫什么?"}, cfg)
生产换持久化的:
from langgraph.checkpoint.sqlite import SqliteSaver
cp = SqliteSaver.from_conn_string("sqlite:///state.db")
from langgraph.checkpoint.postgres import PostgresSaver
cp = PostgresSaver.from_conn_string("postgresql://user:pwd@host/db")
cp.setup()
重点看:
thread_id必须稳定。 同一用户的每次对话用同一个thread_id,记忆才连得上。用 UUID 最稳。
06.3 长期记忆:Store
短期记忆跟着会话走。长期记忆要跨会话保留:
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
graph = g.compile(checkpointer=cp, store=store)
节点里读写长期记忆:
def remember(state, *, store):
# 按 user_id 存一条偏好
store.put(("prefs",), state["user_id"], {"like": "足球"})
return {}
跨会话、跨线程都能读到。这就是"它记得你是球迷"的来源。
06.4 更高级的记忆:langmem
如果你不想自己设计抽取逻辑,官方有 langmem 库:
- 自动从对话里抽取重要信息
- 维护长期记忆,和 Store 打通
- 还能反哺优化 Agent 的提示词
核心建议:Store 管"存",langmem 管"学" 简单偏好用 Store 直接存。要"越用越懂用户",上 langmem。
▸ 向前桥接 记忆有了。可有些事不能全信 AI,下一章讲"人何时插手"。