【LangGraph】langgraph.checkpoint.memory.InMemorySaver 类:在内存中存储状态图的检查点(checkpoints)
InMemorySaver 是 langgraph.checkpoint.memory 模块中的类,基于 Python 的 collections.defaultdict 实现了一个内存中的检查点保存器。检查点是 LangGraph 中用于保存图状态的机制,确保代理在多轮对话或多步任务中保持上下文连续性。InMemorySaver 通过 thread_id 跟踪会话,支持快速读写,但数据在程序重启
详细介绍 langgraph.checkpoint.memory.InMemorySaver 类
langgraph.checkpoint.memory.InMemorySaver 是 LangGraph 库中 langgraph.checkpoint.memory 模块的一个检查点保存器类,设计用于在内存中存储状态图的检查点。它主要服务于开发和测试阶段,帮助开发者调试和验证状态图逻辑。LangGraph 是 LangChain 生态的扩展,专注于构建复杂、有状态的 AI 系统,通过状态图(StateGraph)管理节点和边,支持动态路由、循环和状态管理。检查点机制是 LangGraph 的核心功能,用于保存图执行的每一步状态,支持状态恢复和多轮交互。
1. 定义与功能
1.1 类定义
InMemorySaver 是一个检查点保存器类,继承自 BaseCheckpointSaver、AbstractContextManager 和 AbstractAsyncContextManager。其定义如下:
from langgraph.checkpoint.memory import InMemorySaver
class InMemorySaver(BaseCheckpointSaver, AbstractContextManager, AbstractAsyncContextManager):
"""
内存中的检查点保存器,使用 defaultdict 存储检查点。
参数:
serde: 可选的序列化器,用于序列化和反序列化检查点数据。
示例:
memory = InMemorySaver()
graph = builder.compile(checkpointer=memory)
"""
def __init__(self, serde: Optional[SerializerProtocol] = None) -> None:
super().__init__(serde=serde)
self.checkpoints = defaultdict(dict)
- 继承:
BaseCheckpointSaver:提供检查点保存和恢复的核心接口。AbstractContextManager:支持同步上下文管理(如with语句)。AbstractAsyncContextManager:支持异步上下文管理(如async with)。
- 存储机制:使用 Python 的
defaultdict在内存中存储检查点,数据在应用重启后丢失。 - 用途:主要用于调试、测试和短期实验,不推荐用于生产环境。
1.2 核心功能
- 内存存储:将检查点保存在内存中,使用
defaultdict实现,快速读写。 - 状态保存:在状态图的每一步保存检查点,记录状态(如节点输出、配置)。
- 状态恢复:支持从检查点恢复状态,启用多轮对话或中断后继续。
- 异步支持:提供异步方法(如
aget_tuple、alist),适合高并发场景。 - 线程隔离:通过
thread_id支持多线程管理,确保不同会话的状态独立。 - 序列化支持:通过
serde参数支持自定义序列化,兼容多种数据类型。
1.3 使用场景
- 开发调试:快速测试状态图逻辑,查看检查点内容。
- 单元测试:模拟检查点功能,验证图的行为。
- 短期实验:原型设计或临时应用,不需要持久化数据。
- 多轮对话:支持线程级(thread-level)记忆,跟踪对话历史。
- 长时记忆:结合
InMemoryStore支持语义搜索,存储用户或应用数据。
2. 参数与初始化
2.1 参数
serde:- 类型:
Optional[SerializerProtocol] - 默认值:
None - 描述:序列化器,用于处理检查点数据的序列化和反序列化。如果未指定,使用默认的
JsonPlusSerializer,支持 LangChain 和 LangGraph 原生类型、日期时间、枚举等。
- 类型:
2.2 初始化
初始化 InMemorySaver 非常简单,直接创建实例即可:
from langgraph.checkpoint.memory import InMemorySaver
memory = InMemorySaver()
- 默认行为:创建后,
checkpoints属性初始化为defaultdict(dict),用于存储检查点。 - 自定义序列化:可传入自定义序列化器(如
pickle或其他协议),以支持特殊数据类型。
3. 使用方法
3.1 基本步骤
-
导入与实例化:
from langgraph.checkpoint.memory import InMemorySaver memory = InMemorySaver() -
编译状态图:
将InMemorySaver作为checkpointer参数传递给状态图。from langgraph.graph import StateGraph builder = StateGraph(int) builder.add_node("add_one", lambda x: x + 1) builder.set_entry_point("add_one") builder.set_finish_point("add_one") graph = builder.compile(checkpointer=memory) -
运行图:
使用invoke(同步)或ainvoke(异步)运行图,指定thread_id。config = {"configurable": {"thread_id": "thread-1"}} result = graph.invoke(1, config=config) print(result) # 输出: 2 -
操作检查点:
- 获取检查点:使用
get_tuple或aget_tuple。 - 列出检查点:使用
list或alist。 - 删除检查点:使用
delete_thread或adelete_thread。
- 获取检查点:使用
3.2 检查点操作方法
InMemorySaver 提供以下方法,遵循 BaseCheckpointSaver 的接口:
| 方法名 | 类型 | 描述 |
|---|---|---|
get_tuple |
同步 | 获取指定配置的检查点元组(CheckpointTuple)。 |
aget_tuple |
异步 | 异步获取检查点元组。 |
list |
同步 | 列出所有线程的检查点,返回迭代器。 |
alist |
异步 | 异步列出检查点。 |
put |
同步 | 保存检查点及其元数据,返回 CheckpointMetadata。 |
aput |
异步 | 异步保存检查点。 |
delete_thread |
同步 | 删除指定线程的检查点。 |
adelete_thread |
异步 | 异步删除检查点。 |
示例:获取检查点
checkpoint = memory.get_tuple({"configurable": {"thread_id": "thread-1"}})
print(checkpoint) # 输出: CheckpointTuple(...)
4. 使用示例
4.1 基本示例:简单状态图
from langgraph.graph import StateGraph
from langgraph.checkpoint.memory import InMemorySaver
# 定义状态图
builder = StateGraph(int)
builder.add_node("add_one", lambda x: x + 1)
builder.set_entry_point("add_one")
builder.set_finish_point("add_one")
# 编译图,使用 InMemorySaver
memory = InMemorySaver()
graph = builder.compile(checkpointer=memory)
# 运行
config = {"configurable": {"thread_id": "thread-1"}}
result = graph.invoke(1, config=config)
print(result) # 输出: 2
# 检查检查点
checkpoint = memory.get_tuple(config)
print(checkpoint) # 输出: CheckpointTuple(...)
解析
- 状态图:简单图,输入整数加 1。
- 检查点:
InMemorySaver保存每次执行的状态,thread_id标识会话。 - 恢复:后续调用可恢复上次状态。
4.2 复杂示例:多轮对话
from typing import List
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START
from langgraph.checkpoint.memory import InMemorySaver
from langchain_core.messages import HumanMessage, AIMessage
# 定义状态
class State(TypedDict):
messages: List[dict]
# 定义节点
def agent_node(state: State) -> State:
last_message = state["messages"][-1]["content"]
return {"messages": state["messages"] + [{"role": "assistant", "content": "Echo: " + last_message}]}
# 构建状态图
builder = StateGraph(State)
builder.add_node("agent", agent_node)
builder.add_edge(START, "agent")
builder.set_finish_point("agent")
# 编译图
memory = InMemorySaver()
graph = builder.compile(checkpointer=memory)
# 运行多轮对话
config = {"configurable": {"thread_id": "thread-1"}}
result1 = graph.invoke({"messages": [{"role": "user", "content": "Hello"}]}, config=config)
print(result1["messages"][-1]["content"]) # 输出: Echo: Hello
result2 = graph.invoke({"messages": [{"role": "user", "content": "How are you?"}]}, config=config)
print(result2["messages"][-1]["content"]) # 输出: Echo: How are you?
解析
- 状态:
State包含消息列表,模拟对话历史。 - 检查点:
InMemorySaver保存每次对话的状态,thread_id确保连续性。 - 结果:多轮对话保持上下文,检查点记录历史。
5. 适用场景与限制
5.1 适用场景
- 开发调试:快速验证状态图逻辑,查看检查点内容。
- 单元测试:模拟检查点功能,测试图的行为。
- 短期实验:原型设计或临时应用,无需持久化。
- 多轮对话:支持线程级记忆,跟踪对话历史。
- 长时记忆:结合
InMemoryStore支持语义搜索,存储用户数据。
5.2 限制
- 非持久化:数据存储在内存中,重启后丢失,不适合生产环境。
- 内存限制:大规模数据可能导致内存溢出。
- 生产替代:生产环境推荐使用
PostgresSaver或SqliteSaver。 - 版本要求:需要 LangGraph 0.2+ 和
langgraph-checkpoint。
6. 对比其他检查点保存器
| 特性 | InMemorySaver | PostgresSaver | SqliteSaver |
|---|---|---|---|
| 存储位置 | 内存 | PostgreSQL 数据库 | SQLite 数据库 |
| 适用场景 | 调试、测试、短期实验 | 生产环境、长期运行 | 本地工作流、实验 |
| 持久化 | 否(重启后丢失) | 是 | 是 |
| 安装要求 | 无需额外安装 | 需安装 langgraph-checkpoint-postgres |
需安装 langgraph-checkpoint-sqlite |
| 异步支持 | 是 | 是 | 是 |
选择建议:
- 开发阶段:使用
InMemorySaver,快速迭代。 - 生产环境:选择
PostgresSaver或SqliteSaver,确保持久化。
7. 注意事项
- 数据安全性:内存存储不适合敏感数据,生产环境使用加密数据库。
- 性能优化:避免存储大规模数据,考虑数据库替代。
- 调试技巧:
- 启用
debug=True查看检查点日志。 - 使用
get_tuple检查具体状态。
- 启用
- 版本兼容性:确保 LangGraph 版本支持(0.2+),参考 LangGraph 文档。
- 线程隔离:正确使用
thread_id,避免状态冲突。
8. 学习建议
- 基础知识:了解 LangGraph 的状态图、检查点和存储机制。
- 文档:阅读 LangGraph 检查点文档 和 持久化指南。
- 实践:从简单状态图开始,添加检查点和多轮对话。
- 社区:加入 LangChain Discord,查看 GitHub 示例。
- 调试:使用日志和可视化工具(如
graph.get_graph().to_dot())分析检查点。
9. 总结
langgraph.checkpoint.memory.InMemorySaver 是一个内存中的检查点保存器,适合 LangGraph 的开发和测试阶段。它通过 defaultdict 存储检查点,支持异步操作和线程隔离,简化调试和验证。核心功能包括状态保存、恢复和检查点操作,适用于短期实验和多轮对话。然而,由于数据不持久化,不适合生产环境,推荐使用 PostgresSaver 或 SqliteSaver。通过示例和实践,开发者可以快速掌握其使用方法,提升开发效率。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)