LangGraph核心模块:使用 MemorySaver 进行持久化管理

理解langchain langgraph 官方文档示例代码中的MemorySaver 中间件有什么特征:它在程序执行过程中某些数据流的环节介入,并根据设定的逻辑对部分数据进行加工或调整数据的流向,而这一切对用户来说是透明的,看不见的,像一只看不见的手在那里做了些什么。在这里中的作用类似于一个“中间件”,workflow编译的时候提供了一个“检查点(Checkpointing)”让这个中间件介入进去,让这个看不见的手去捕获并加工里面数据。节点 (Nodes): 节点是工作流中的执行单元,每个节点都关联一个函数,该函数定义了节点的执行逻辑。:标记节点及节点的状态,定义节点之间的连接和流向。 阅读详情
AI摘要

本文围绕LangGraph框架中的MemorySaver展开,详细介绍如何用其实现对话状态的持久化管理。涵盖项目结构、环境配置、状态定义等步骤,通过测试验证其效果,分析工作原理并与其他方案对比,还提及适用场景与进阶应用,能助力构建有持久化对话功能的智能应用。

使用 MemorySaver 进行持久化管理

在构建复杂的 AI 应用时,持久化管理是一个非常重要的功能,它能让我们的应用在会话过程中保持状态,甚至在应用重启后恢复之前的对话记忆。本文将详细讲解如何使用 LangGraph 框架中的 MemorySaver 来实现对话状态的持久化管理。

1. 基本概念

MemorySaver 是 LangGraph 框架提供的一种内存式状态持久化工具,它允许我们在同一应用程序执行期间保存和恢复会话状态,非常适合实现多轮对话中的状态保持。

2. 项目结构概述

我们将构建一个具有以下功能的对话式应用:

  • 使用 OpenAI 的语言模型
  • 定义一个天气查询工具
  • 使用 LangGraph 构建对话流程图
  • 通过 MemorySaver 实现会话持久化

3. 环境配置与依赖导入

首先,我们需要导入必要的模块和类型注解:

import os
from typing import Annotated, Literal
from dotenv import load_dotenv
from typing_extensions import TypedDict
from langgraph.graph.message import add_messages

4. 定义状态结构

我们使用 TypedDict 定义一个状态类,包含一个带有特殊注解的消息列表:

class State(TypedDict):
    messages: Annotated[list, add_messages]

这里的 add_messages 注解告诉 LangGraph 如何处理这个列表中的新消息。

5. 创建工具函数

接下来,我们定义一个简单的天气查询工具:

from langchain_core.tools import tool

@tool
def get_weather(region: str) -> str:
    """
    获取指定地区的天气
    :param region: 地区
    :return: 天气信息
    """
    return f"{region}晴天,25度"

# 将工具函数存入列表
tools = [get_weather]

6. 初始化语言模型

我们使用 ChatOpenAI 模型,并将工具绑定到模型上:

from langchain_openai import ChatOpenAI

load_dotenv()
# 创建一个 ChatOpenAI 模型实例
llm = ChatOpenAI(base_url="https://ark.cn-beijing.volces.com/api/v3", 
                api_key=os.getenv("OB_OPENAI_KEY"),
                model="doubao-1.5-lite-32k-250115")

# 将工具绑定到模型上
bound_model = llm.bind_tools(tools)

7. 创建节点逻辑

我们需要定义图中的节点和它们的行为:

def call_model(state: State):
    response = bound_model.invoke(state["messages"])
    # 返回一个列表,因为这将被添加到现有列表中
    return {"messages": response}

def should_continue(state: State) -> Literal["tools", "__end__"]:
    messages = state["messages"]
    last_message = messages[-1]
    # 如果最后一条消息包含工具调用,则返回 "tools"
    if last_message.tool_calls:
        return "tools"
    # 否则返回 "__end__" 以结束流程
    return "__end__"

from langgraph.prebuilt import ToolNode

# 创建一个 ToolNode 实例
tool_node = ToolNode(tools)

这里定义了两个关键函数:

  • call_model: 调用语言模型处理当前状态
  • should_continue: 决定下一步的流向

8. 构建状态图

使用 LangGraph 的 StateGraph 构建对话流程:

from langgraph.graph import StateGraph, MessagesState, START

# 创建一个状态图,定义状态和转换
graph = StateGraph(State)

# 添加节点
graph.add_node("tools", tool_node)
graph.add_node("agent", call_model)

# 编写链接顺序
graph.add_edge(START, "agent")
graph.add_conditional_edges("agent", should_continue)
graph.add_edge("tools", "agent")

9. 使用 MemorySaver 进行持久化管理

这是本文的核心部分,我们引入 MemorySaver 并将其应用到图的编译过程中:

from langgraph.checkpoint.memory import MemorySaver

# 创建一个 MemorySaver 实例
memory = MemorySaver()

# 编译工作流,生成一个 LangChain Runnable,并传入 MemorySaver 实例
app = graph.compile(checkpointer=memory)

# 将生成的图保存到文件(可选)
graph_png = app.get_graph().draw_mermaid_png()
with open("persistence_case.png", "wb") as f:
    f.write(graph_png)

10. 运行测试并验证持久化效果

最后,我们运行应用程序并测试持久化效果:

from langchain_core.messages import HumanMessage

# 设置配置参数,thread_id作为线程ID,做会话隔离
config = {"configurable": {"thread_id": "2"}}

# 第一轮对话:询问天气
input_message = HumanMessage(content="今天上海的天气如何?")

for event in app.stream({"messages": [input_message]}, config, stream_mode="values"):
    event["messages"][-1].pretty_print()

# 第二轮对话:验证记忆功能
input_message = HumanMessage(content="我刚问你了什么问题?")

for event in app.stream({"messages": [input_message]}, config, stream_mode="values"):
    event["messages"][-1].pretty_print()

11. 输出结果分析

执行上面的代码,我们可以看到以下输出:

================================ Human Message =================================
今天上海的天气如何?
================================== Ai Message ==================================
用户想了解上海的天气,调用get_weather函数获取相关信息。
Tool Calls:
  get_weather (call_tdbiokyoeqxwb5rurplu6z0l)
 Call ID: call_tdbiokyoeqxwb5rurplu6z0l
  Args:
    region: 上海
================================= Tool Message =================================
Name: get_weather
上海晴天,25度
================================== Ai Message ==================================
上海今天的天气是晴天,气温为25度。
================================ Human Message =================================
我刚问你了什么问题?
================================== Ai Message ==================================
你问的问题是:今天上海的天气如何?

从输出结果可以看出,AI 成功地记住了之前的交互内容。当我们问"我刚问你了什么问题?"时,它能够回忆起我们之前询问了上海的天气。这证明了 MemorySaver 成功地保存了会话状态。

12. MemorySaver 的工作原理

MemorySaver 的工作原理如下:

  1. 状态存储: 它将每个会话的状态存储在内存中
  2. 线程隔离: 通过 thread_id 区分不同的会话
  3. 上下文维护: 在整个对话过程中保持上下文信息
  4. 会话恢复: 允许后续请求基于之前的状态继续对话

13. MemorySaver 与其他持久化方案的比较

持久化方案优点缺点
MemorySaver实现简单,速度快应用重启后数据丢失
FileSaver可跨应用重启保存数据读写文件带来额外开销
数据库存储可靠性高,适合生产环境实现复杂,需要额外依赖

14. 总结与应用场景

通过使用 MemorySaver,我们成功实现了对话状态的持久化管理,使得 AI 能够在多轮对话中保持上下文记忆。这种方案特别适合:

  1. 开发阶段的原型测试
  2. 单会话临时应用
  3. 不需要长期存储的简单应用场景

对于需要更可靠持久化的生产环境,可以考虑使用 FileSaver 或数据库存储方案。

15. 进阶应用

如果希望实现更复杂的持久化功能,可以考虑:

  1. 实现自定义 Checkpointer
  2. 将状态存储在数据库中
  3. 添加过期策略以管理内存使用

通过 LangGraph 框架和 MemorySaver,我们可以轻松构建具有持久化对话功能的智能应用,为用户提供连贯一致的交互体验。

LangGraph记忆存储对比:MemorySaver vs SqliteSaver,哪个更适合你的项目? 本文深入对比了LangGraph框架中两种核心记忆存储方案MemorySaver与SqliteSaver。MemorySaver将数据存储在内存,适合快速原型验证和单元测试;而SqliteSaver将数据持久化至本地数据库文件,适用于需要长期运行、数据可保留的轻量级生产或演示环境。文章从性能、数据安全、部署复杂度等维度提供了详细的选型指南,帮助开发者根据项目阶段(从实验到生产)做出最佳决策。 阅读详情

相关推荐

LangGraph基础知识(MemorySaver/SqliteSaver )(三)

不论是简单还是复杂的图,一个明显的限制是:之前内容中的所有实现都只能执行单一任务。也就是说,一旦图被编译并根据用户的输入运行以后,它虽然可以按照既定的图流程输出结果,但在下一次交互时,这个图将无法记住之前的对话内容。通过两次询问,我们可以确定当前的`graph`实例不具备任何的上下文记忆能力。

m0_37242314的博客 2002

AI大模型综合(二)LangGraph4j(完整示例)

LangGraph4j 是一个专为 Java设计的开源库,用于构建状态ful、多智能体应用,并与语言模型(LLMs)无缝集成‌,支持复杂任务协作与流程管理。‌LangGraph4j 基于状态图(StateGraph)模型,通过节点(Node)、边(Edge)和检查点(State)实现智能体协作。

我的E家 4585

LangGraph持久化实战:MemorySaver在智能对话中的状态管理

本文深入探讨了LangGraph框架中MemorySaver模块在智能对话状态管理中的实战应用。通过构建一个旅行规划助手实例,详细演示了如何利用MemorySaver实现对话状态的持久化,确保多轮、跨时段对话的连贯性,从而解决传统聊天机器人因缺乏记忆而导致的用户体验中断问题。

weixin_29214559的博客 570

【免费下载】 langgraph4j:构建状态丰富多智能体应用的利器

在当今技术快速发展的时代,构建高效且灵活的状态ful多智能体应用已成为开发者追求的目标。langgraph4j 正是这样一款开源库,为Java开发者提供了一种构建与LLMs协同工作的多智能体应用的新方法。下面,让我们一起来探索langgraph4j的核心功能、技术分析、应用场景和项目特点。 ## 项目介绍 langgraph4j 是一个专为Java设计的库,它支持开发者构建状态ful、多智能体...

gitblog_01043的博客 3905

LangGraph实战:如何通过MemorySaver与SqliteSaver实现对话状态持久化

本文详细介绍了如何在LangGraph框架中通过MemorySaver与SqliteSaver实现对话状态持久化,解决对话系统'健忘症'问题。MemorySaver适合开发调试,而SqliteSaver则是轻量级生产方案,确保对话记录不丢失。文章还提供了优化技巧和避坑指南,帮助开发者高效部署稳定的对话系统。

weixin_30338497的博客 319

LangGraph实战:如何用MemorySaver为Agent添加短期记忆(附完整代码)

本文详细介绍了如何利用LangGraph的MemorySaver组件为智能体(Agent)添加短期记忆功能。通过实战代码演示,阐述了如何通过检查点机制管理会话状态,实现多轮对话的上下文关联,从而解决智能客服等场景中Agent“说完就忘”的问题,提升交互体验。

weixin_29083475的博客 367

大模型记忆模块实战:LangChain与LangGraph状态管理解析

大模型本质上是无状态的,每次调用都独立,因此构建多轮对话和智能Agent应用时,记忆机制成为决定性工程模块。从Chatbot到复杂工作流,开发者需要解决历史消息存储、上下文窗口限制、多会话隔离与断点恢复等问题。LangChain与LangGraph分别代表两种记忆管理范式:前者通过链式管道与外部Memory组件拼接历史消息,适合线性快速原型;后者将记忆下沉为图状态(State)与Checkpointer自动持久化,通过thread_id实现天然隔离,并支持interrupt暂停与恢复。本文结合实际代码演示S

weixin_29056781的博客 134

LangGraph实战:如何用MemorySaver为AI Agent添加记忆功能(附完整代码)

本文详细介绍了如何利用LangGraph框架的MemorySaver组件为AI Agent构建长期记忆功能。通过完整的代码示例,演示了如何实现对话历史、用户偏好等状态的持久化管理,使Agent能够理解上下文关联,实现从‘瞬时反应’到‘持续认知’的跨越,从而打造真正智能、连贯的交互体验。

weixin_29268267的博客 565

LangGraph核心模块拆解:状态图、条件路由与检查点机制

在大模型应用开发中,状态机是一种基础且通用的设计模式,用于描述系统在不同状态之间的流转和决策。LangGraph作为Agent编排框架,将这种思想引入AI工作流,用有向图替代线性链式结构,让分支、循环、状态恢复等复杂控制流变得清晰可控。其核心在于StateGraph对状态的驱动:节点之间通过State对象通信,借助Annotated reducer实现字段的覆盖或合并;条件边则根据当前状态动态决定下一步走向,从而支持工具调用循环和逻辑判断。检查点模块进一步赋予图运行可持久化、可回放的能力,通过thread_

weixin_29061509的博客 163

LangGraph框架:构建持久化智能体系统的核心技术

图计算模型作为分布式系统的重要范式,通过节点和边的抽象实现复杂工作流的可视化编排。LangGraph框架基于此原理,为AI智能体系统提供了持久化状态管理和自动恢复能力,解决了传统链式调用在长时间运行任务中的状态丢失问题。该技术通过检查点机制和混合执行模式,显著提升了业务流程自动化系统的可靠性,特别适用于需要跨会话保持状态的客服对话、订单处理等场景。结合LangChain生态的工具链,开发者可以快速构建具备容错能力的智能体应用,其中持久化执行和状态显式管理成为区别于常规任务编排工具的核心竞争力。

weixin_30906185的博客 419

LangGraph记忆系统深度对比:InMemoryStore和MemorySaver该如何选择?

本文深入对比了LangGraph框架中的InMemoryStore和MemorySaver两种记忆系统,帮助开发者在构建Agent AI时做出明智选择。InMemoryStore适合需要高性能临时记忆的场景,而MemorySaver则提供可靠的持久化状态存储。文章详细分析了两者的架构差异、性能特点和适用场景,并提供了混合架构的最佳实践。

weixin_29054245的博客 251

【大模型应用开发】第四阶段:智能体(Agent)核心设计模式与工程实现

摘要 本章深入探讨智能体(Agent)的设计模式与工程实现,涵盖以下核心内容: Agent工作流:从零样本提示转向迭代式工作流(规划→执行→反思),提升任务完成质量 关键技术: 规划模式:ReAct(思考-行动-观察循环)与Plan-and-Solve(先规划后执行) 工具调用:通过JSON Schema定义外部工具接口 MCP协议:标准化模型上下文交互格式 记忆系统:实现短期/长期记忆机制 工程实现: LangGraph状态机编程范式 多智能体协作模式(Supervisor/Hierarchical) 结

1289

(3)LangGraph4j框架入门

langgraph4j 是一个专为Java设计的库,它支持开发者构建状态ful、多智能体应用,并能够与语言模型(LLMs)无缝集成。这个项目是对LangChain AI项目中的LangGraph的Java版本移植,旨在为Java开发者提供一种更加直观和易于使用的方式来构建复杂的智能体交互图。

weixin_44455388的博客 2428

多Agent开发

请求入口: 核心代码: 其中rag_agent_service.query是Rag Agent中的异步方法,使用await等待其运行结果保存在answer。 在return中会将answer封装在data中作为HTTP 响应进行返回。,会通过 FastAPI 框架自动发送回 发起 /chat 请求的客户端 AgentState 是一个 类型提示类(TypedDict),用来告诉 LangGraph: “这个 Agent 在运行过程中,它的内部状态(state)长什么样?”其中Annotated 是 Pyth

weixin_54018914的博客 448

win11重装系统简易教程-小白也可以上手!

本文介绍一下win11系统重装的各个步骤,也作为记录供自己后面查看。附上我之前参考的一位知乎大神写的重装win10系统文章的地址本文用到的工具全部是,不需要下载第三方镜像文件(不是说这个不好,只是第三方的软件或镜像文件网上非常多,琳琅满目,小白需要筛选甄别,直接用官方的就比较省心,大神请自便~)

Sddqa的博客 1万+

Win10安装Nek5000

1 安装wsl 2 2 安装Nek5000 3 安装依赖项 4 安装openmpi 5 配置Nek5000 6 编译Nek5000 7 运行Nek5000算例 8 安装paraview并查看结果

weixin_43176703的博客 3449

从0到1学LangGraph之持久化管理

摘要: LangGraph持久化管理是LangChain生态中用于构建循环状态多行为体代理系统的关键功能,主要负责保存任务执行中的中间结果和状态信息,确保系统在意外中断后能恢复运行。其核心组件包括MemorySaver(内存存储)和检查点机制,支持将状态保存在内存或数据库中,适用于智能客服、投资顾问等需要长期记忆的场景。学习该技术能提升AI应用的稳定性和用户体验,避免数据丢失导致的服务中断。实现步骤包括安装LangGraph、导入必要模块(如Graph、MemorySaver)以及配置数据库连接。该技术为人

2401_85592132的博客 1006

东北大学计算机预推免(双非友好)

东北大学,个人觉得在985里面对双非比较友好,而且学校的计算机专业实力也比较强,上岸难度不算很大,可以重点关注一下。学校复试审核的时间比较早,拿到复试资格之后,一定要留意报名系统首页中计算机学院的信息,学校也会在全国各地不同时间安排面试,可以根据自己的情况选择一个合适的时间前去面试,并且有对应面试场次的QQ群,信息会在群里面发布。面试成绩会在预推免系统中直接公布,但是是否拟录取不会公布,需要考生自行判断,今年计算机学院录取线定在了86分左右,最终递补下来,好像录取到了84分左右。

D1379951481的博客 3120

LangGraph进阶-利用MemorySaver实现Agent的上下文感知对话

本文深入探讨了如何利用LangGraph的MemorySaver机制解决AI Agent在多轮对话中的“健忘”问题。通过结合Checkpointer与Thread_ID,MemorySaver实现了对话状态的自动保存与恢复,为Agent赋予了关键的短期记忆能力,从而构建出真正具备上下文感知能力的智能体。

sam99的博客 562

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 900

【langgraph 从入门到精通graphApi 篇】Checkpoint 持久化与状态管理

开发用 MemorySaver,生产用 PostgresSaver:根据环境选择合适的持久化方案每个用户/会话使用唯一thread_id:如或定期清理旧 checkpoint:避免存储无限膨胀(生产环境可设置 TTL)使用实现"撤销"功能:用户可以回到之前的对话状态用于人工修正:当 AI 输出有误时,可以手动插入修正消息。

lw的博客 529

【Claude Code】Extra inputs are not permitted 报错:代理网关剥离 Beta 标头的修复

通过代理或 LLM 网关连接 Anthropic API 时,Claude Code 报 "Extra inputs are not permitted"?根因是中间件删除了 anthropic-beta 请求标头,导致 Beta 字段被 API 拒绝。本文详解标头转发配置和 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 回退方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 125
上一篇: LangGraph核心组件详解--图、节点、边
下一篇: LangGraph实现人机交互:基于中断机制的智能流程控制
AI航海家(Ethan)
博客等级 码龄7年 477粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值