【LangGraph】新篇章:LangGraph 持久化(Persistence)*重点*
- 前言
-
- 一、什么是持久化能力?
- 二、为什么需要持久化?两个真实场景告诉你
- [三、LangGraph 持久化的核心能力](#三、LangGraph 持久化的核心能力)
- [四、两种持久化层次:线程级 vs 跨会话](#四、两种持久化层次:线程级 vs 跨会话)
- 五、快速上手:内存持久化示例
- 六、小结
前言
LangGraph 持久化机制详解:让 AI Agent 拥有"记忆"
在构建 AI Agent 时,我们往往希望它能"记住"之前说过的话、做过的操作
比如一个多轮对话助手,如果每次调用都像第一次见面,体验会非常糟糕
LangGraph 提供了持久化(Persistence)能力,让 Agent 不再是"一次性程序",而是一个有记忆的系统
一、什么是持久化能力?
简单来说:
持久化就是将 Agent 的执行状态(对话历史、中间结果、用户信息等)保存下来
即使程序重启、系统崩溃,也能恢复之前的状态,让 AI "记住"之前发生的一切
你可以把它理解为:
给 Agent 装上一个"大脑外挂"------它不会因为关机就失忆
二、为什么需要持久化?两个真实场景告诉你
场景一:跨会话的记忆
你今天告诉智能助手:"我有高血压病史。"
然后关闭了应用
明天重新打开,继续问:"我适合吃哪种感冒药?"
如果没有持久化,助手根本不记得你的病史,只能给出通用建议,甚至可能给出不良药物
有持久化后,助手会加载你之前存储的健康信息,给出个性化、安全的回答
我们可以看个实例:
第一个对话

第二个对话:

场景二:多步推理中的容错恢复
考虑一个需要调用搜索工具的 Agent:
用户问:"今天天气怎么样?"
Agent 调用搜索工具,得到结果:"今天晴天,25度。"
程序突然崩溃!
用户再问:"那我需要带伞吗?"
无持久化:
Agent 丢失了"晴天"这个上下文,可能会再次搜索天气,或者回答"我不知道"
有持久化:
Agent 加载崩溃前的状态快照,知道已经是晴天,直接回答:"今天是晴天,您不需要带伞。"
这个例子说明,持久化不仅用于记忆,还让 Agent 具备恢复能力,避免重复劳动
三、LangGraph 持久化的核心能力
-
状态保存
自动保存工作流中每一步的 State 快照 每执行一步就自动存盘,防止状态丢失
-
历史追踪
可以回溯 Agent 执行过的节点、工具调用、消息 随时回放 Agent 的完整执行轨迹,方便调试审计
-
执行恢复
从任意保存点恢复执行(类似断点续传) 程序崩溃后能从上次断点继续,不用重跑
-
多轮上下文
同一会话内的多次交互共享记忆 相同 thread_id 会自动继承之前对话,实现连续聊天
四、两种持久化层次:线程级 vs 跨会话
LangGraph 的持久化分为两个层次,解决不同的问题
- 线程级持久化(Thread-level Persistence)
作用:自动保存单次会话(一个 thread_id)中的完整执行轨迹。
保存内容:对话历史、工具调用结果、当前节点位置、下一步要执行的动作等(不仅仅是 State)
用途:维持一个会话内的上下文,支持中断恢复、人机协作、长时间运行的任务
注意:这里的"线程Thread"与操作系统线程无关,只是一个会话标识符
- 跨会话持久化(Cross-session Persistence)
作用:存储长期有效的用户信息、偏好、知识库,可以在不同会话之间共享
保存内容:用户画像(如病史、兴趣)、全局配置、文档等
用途:实现个性化服务,让 Agent 在不同对话窗口中都"认识"同一个用户
举个栗子:
python
# 线程级:保存当前聊天上下文
checkpointer.save(thread_id="123", state=state)
# 跨会话:保存用户偏好
store.set(("user", "456"),
"preferences",
{"theme": "dark", "language": "zh"})
在实际使用中,线程级通常用 InMemorySaver 或 SqliteSaver 实现,跨会话则需要 BaseStore 接口(如 Redis、PostgreSQL)
五、快速上手:内存持久化示例
LangGraph 提供了开箱即用的内存检查点存储器 InMemorySaver
python
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.graph import StateGraph, MessagesState
from langchain_core.messages import HumanMessage
# 创建检查点存储器(内存版)
checkpointer = InMemorySaver()
# 构建你的 Agent(假设已经定义节点等)
agent_builder = StateGraph(MessagesState)
# ... 添加节点、边
agent = agent_builder.compile(checkpointer=checkpointer)
# 配置会话 ID------这是记忆的"钥匙"
config = {"configurable": {"thread_id": "123"}}
# 第一次调用
agent.invoke(
{"messages": [HumanMessage(content="今天北京的天气怎么样")]},
config=config
)
# 程序可以重启,但只要 thread_id 不变,Agent 会记住之前的消息
agent.invoke(
{"messages": [HumanMessage(content="我刚才问你什么?")]},
config=config
)
# 输出:你刚才问了北京的天气怎么样。
核心要点:
thread_id 是会话的唯一标识。
相同的 thread_id 共享状态,不同的 thread_id 相互隔离
InMemorySaver 适合开发测试,生产环境推荐使用
SqliteSaver 或 PostgresSaver
这里推荐使用 PostgresSaver(推荐用docker拉取)
因为 LangGraph 官方只原生支持 PostgreSQL 做持久化,功能完整、稳定、支持断点续跑与状态回溯
而 MySQL 没有官方支持,无法直接使用,必须自己手写存储层
六、小结
LangGraph 的持久化能力,让 AI Agent 从"无状态函数"进化为"有状态的服务"
它包含两个层次:
-
线程级:维持一次会话的完整上下文,支持断点恢复
-
跨会话:存储用户长期信息,实现个性化
通过几行代码加上一个 checkpointer,你的 Agent 就能拥有记忆,变得更智能、更可靠,成为你的合格小助手
本次分享就到这里了,下期详细讲一下线程级持久化和跨会话持久化,拜拜~
