【LangGraph 持久化】让 AI Agent 拥有“记忆”

【LangGraph】新篇章:LangGraph 持久化(Persistence)*重点*

前言

LangGraph 持久化机制详解:让 AI Agent 拥有"记忆"

在构建 AI Agent 时,我们往往希望它能"记住"之前说过的话、做过的操作

比如一个多轮对话助手,如果每次调用都像第一次见面,体验会非常糟糕

LangGraph 提供了持久化(Persistence)能力,让 Agent 不再是"一次性程序",而是一个有记忆的系统

一、什么是持久化能力?

简单来说:

持久化就是将 Agent 的执行状态(对话历史、中间结果、用户信息等)保存下来

即使程序重启、系统崩溃,也能恢复之前的状态,让 AI "记住"之前发生的一切

你可以把它理解为:

给 Agent 装上一个"大脑外挂"------它不会因为关机就失忆


二、为什么需要持久化?两个真实场景告诉你

场景一:跨会话的记忆

复制代码
你今天告诉智能助手:"我有高血压病史。"
然后关闭了应用
明天重新打开,继续问:"我适合吃哪种感冒药?"

如果没有持久化,助手根本不记得你的病史,只能给出通用建议,甚至可能给出不良药物

有持久化后,助手会加载你之前存储的健康信息,给出个性化、安全的回答

我们可以看个实例:

第一个对话

第二个对话:


场景二:多步推理中的容错恢复

考虑一个需要调用搜索工具的 Agent:

复制代码
用户问:"今天天气怎么样?"

Agent 调用搜索工具,得到结果:"今天晴天,25度。"

程序突然崩溃!

用户再问:"那我需要带伞吗?"

无持久化:

Agent 丢失了"晴天"这个上下文,可能会再次搜索天气,或者回答"我不知道"

有持久化:

Agent 加载崩溃前的状态快照,知道已经是晴天,直接回答:"今天是晴天,您不需要带伞。"

这个例子说明,持久化不仅用于记忆,还让 Agent 具备恢复能力,避免重复劳动


三、LangGraph 持久化的核心能力

  1. 状态保存

    自动保存工作流中每一步的 State 快照 每执行一步就自动存盘,防止状态丢失

  2. 历史追踪

    可以回溯 Agent 执行过的节点、工具调用、消息 随时回放 Agent 的完整执行轨迹,方便调试审计

  3. 执行恢复

    从任意保存点恢复执行(类似断点续传) 程序崩溃后能从上次断点继续,不用重跑

  4. 多轮上下文

    同一会话内的多次交互共享记忆 相同 thread_id 会自动继承之前对话,实现连续聊天


四、两种持久化层次:线程级 vs 跨会话

LangGraph 的持久化分为两个层次,解决不同的问题

  1. 线程级持久化(Thread-level Persistence)
    作用:自动保存单次会话(一个 thread_id)中的完整执行轨迹。

保存内容:对话历史、工具调用结果、当前节点位置、下一步要执行的动作等(不仅仅是 State)

用途:维持一个会话内的上下文,支持中断恢复、人机协作、长时间运行的任务

注意:这里的"线程Thread"与操作系统线程无关,只是一个会话标识符


  1. 跨会话持久化(Cross-session Persistence)
    作用:存储长期有效的用户信息、偏好、知识库,可以在不同会话之间共享

保存内容:用户画像(如病史、兴趣)、全局配置、文档等

用途:实现个性化服务,让 Agent 在不同对话窗口中都"认识"同一个用户

举个栗子:

python 复制代码
# 线程级:保存当前聊天上下文
checkpointer.save(thread_id="123", state=state)

# 跨会话:保存用户偏好
store.set(("user", "456"), 
	"preferences", 
	{"theme": "dark", "language": "zh"})

在实际使用中,线程级通常用 InMemorySaverSqliteSaver 实现,跨会话则需要 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 适合开发测试,生产环境推荐使用
SqliteSaverPostgresSaver

这里推荐使用 PostgresSaver(推荐用docker拉取)

因为 LangGraph 官方只原生支持 PostgreSQL 做持久化,功能完整、稳定、支持断点续跑与状态回溯

而 MySQL 没有官方支持,无法直接使用,必须自己手写存储层


六、小结

LangGraph 的持久化能力,让 AI Agent 从"无状态函数"进化为"有状态的服务"

它包含两个层次:

  1. 线程级:维持一次会话的完整上下文,支持断点恢复

  2. 跨会话:存储用户长期信息,实现个性化

通过几行代码加上一个 checkpointer,你的 Agent 就能拥有记忆,变得更智能、更可靠,成为你的合格小助手


本次分享就到这里了,下期详细讲一下线程级持久化和跨会话持久化,拜拜~

相关推荐
玉小格2 小时前
对py作业的一个复盘
开发语言·python
冰西瓜6002 小时前
深度学习的数学原理(三十)—— Transformer的子层连接:残差+层归一化
人工智能·深度学习·transformer
β添砖java2 小时前
深度学习(6)softmax回归、损失函数、分类
人工智能·深度学习·回归
GISer_Jing2 小时前
前端视角:B端传统配置化现状与AI冲击趋势
前端·人工智能·ai编程
当战神遇到编程2 小时前
数据库表关系详解:一对一、一对多、多对多
数据库
脑子进水养啥鱼?2 小时前
PostgreSql CAST
数据库·postgresql
思麟呀2 小时前
Epoll的学习,在select和poll的基础上
网络·数据库·sql·学习·tcp/ip
zhangchaoxies2 小时前
c++怎么在Linux下获取文件被最后一次访问的精确纳秒时间【进阶】
jvm·数据库·python
拾-光2 小时前
LTX-Video 2.3 实战:用图片生成视频,消费级显卡也能跑的开源 I2V 模型(GPT Image 2)
java·人工智能·python·深度学习·算法·机器学习·音视频