详细介绍 langgraph.checkpoint.memory.InMemorySaver 类

langgraph.checkpoint.memory.InMemorySaver 是 LangGraph 库中 langgraph.checkpoint.memory 模块的一个检查点保存器类,设计用于在内存中存储状态图的检查点。它主要服务于开发和测试阶段,帮助开发者调试和验证状态图逻辑。LangGraph 是 LangChain 生态的扩展,专注于构建复杂、有状态的 AI 系统,通过状态图(StateGraph)管理节点和边,支持动态路由、循环和状态管理。检查点机制是 LangGraph 的核心功能,用于保存图执行的每一步状态,支持状态恢复和多轮交互。


1. 定义与功能

1.1 类定义

InMemorySaver 是一个检查点保存器类,继承自 BaseCheckpointSaverAbstractContextManagerAbstractAsyncContextManager。其定义如下:

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_tuplealist),适合高并发场景。
  • 线程隔离:通过 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 基本步骤

  1. 导入与实例化

    from langgraph.checkpoint.memory import InMemorySaver
    memory = InMemorySaver()
    
  2. 编译状态图
    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)
    
  3. 运行图
    使用 invoke(同步)或 ainvoke(异步)运行图,指定 thread_id

    config = {"configurable": {"thread_id": "thread-1"}}
    result = graph.invoke(1, config=config)
    print(result)  # 输出: 2
    
  4. 操作检查点

    • 获取检查点:使用 get_tupleaget_tuple
    • 列出检查点:使用 listalist
    • 删除检查点:使用 delete_threadadelete_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 限制

  • 非持久化:数据存储在内存中,重启后丢失,不适合生产环境。
  • 内存限制:大规模数据可能导致内存溢出。
  • 生产替代:生产环境推荐使用 PostgresSaverSqliteSaver
  • 版本要求:需要 LangGraph 0.2+ 和 langgraph-checkpoint

6. 对比其他检查点保存器

特性 InMemorySaver PostgresSaver SqliteSaver
存储位置 内存 PostgreSQL 数据库 SQLite 数据库
适用场景 调试、测试、短期实验 生产环境、长期运行 本地工作流、实验
持久化 否(重启后丢失)
安装要求 无需额外安装 需安装 langgraph-checkpoint-postgres 需安装 langgraph-checkpoint-sqlite
异步支持

选择建议

  • 开发阶段:使用 InMemorySaver,快速迭代。
  • 生产环境:选择 PostgresSaverSqliteSaver,确保持久化。

7. 注意事项

  1. 数据安全性:内存存储不适合敏感数据,生产环境使用加密数据库。
  2. 性能优化:避免存储大规模数据,考虑数据库替代。
  3. 调试技巧
    • 启用 debug=True 查看检查点日志。
    • 使用 get_tuple 检查具体状态。
  4. 版本兼容性:确保 LangGraph 版本支持(0.2+),参考 LangGraph 文档
  5. 线程隔离:正确使用 thread_id,避免状态冲突。

8. 学习建议

  • 基础知识:了解 LangGraph 的状态图、检查点和存储机制。
  • 文档:阅读 LangGraph 检查点文档持久化指南
  • 实践:从简单状态图开始,添加检查点和多轮对话。
  • 社区:加入 LangChain Discord,查看 GitHub 示例。
  • 调试:使用日志和可视化工具(如 graph.get_graph().to_dot())分析检查点。

9. 总结

langgraph.checkpoint.memory.InMemorySaver 是一个内存中的检查点保存器,适合 LangGraph 的开发和测试阶段。它通过 defaultdict 存储检查点,支持异步操作和线程隔离,简化调试和验证。核心功能包括状态保存、恢复和检查点操作,适用于短期实验和多轮对话。然而,由于数据不持久化,不适合生产环境,推荐使用 PostgresSaverSqliteSaver。通过示例和实践,开发者可以快速掌握其使用方法,提升开发效率。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐