langgraph.checkpoint.base
模块是 LangGraph 库中检查点系统的核心模块,提供了检查点机制的基础数据结构和接口。LangGraph 是 LangChain 生态的扩展框架,专注于构建复杂、有状态的 AI 系统,通过状态图(StateGraph)管理节点和边,支持动态路由、循环和状态管理。检查点(Checkpoint)是 LangGraph 的关键功能,用于在图执行的每一步保存状态,启用状态持久化、恢复和多轮交互。langgraph.checkpoint.base
模块定义了检查点数据结构(如 Checkpoint
)和抽象基类(如 BaseCheckpointSaver
),为子模块(如 InMemorySaver
、PostgresSaver
)提供统一接口。
1. 模块背景与作用
1.1 LangGraph 概述
- 定义:LangGraph 是一个用于构建有状态、多步骤 AI 应用的库,特别适用于语言模型(LLM)驱动的场景。
- 功能:通过状态图组织节点(操作)和边(流程),支持动态路由、循环和状态管理。
- 应用场景:对话式 AI 代理(如聊天机器人)、自动化工作流、复杂任务分解等。
- 检查点机制:检查点用于保存状态图的执行状态,支持:
- 多轮对话:保持上下文连续性。
- 状态恢复:从中断点继续执行。
- 调试:分析图执行历史。
1.2 模块作用
- 核心功能:提供检查点数据结构和保存器接口,支持状态的保存和检索。
- 设计目标:
- 统一接口:通过抽象基类
BaseCheckpointSaver
定义标准接口,子类实现具体存储逻辑(如内存、数据库)。 - 灵活性:支持同步和异步操作,适应不同场景。
- 可扩展性:通过序列化器支持复杂数据类型,兼容多种存储后端。
- 统一接口:通过抽象基类
- 地位:作为检查点系统的核心模块,为其他检查点保存器(如
InMemorySaver
)提供基础。
2. 模块主要组件
langgraph.checkpoint.base
模块包含以下核心类、数据结构和函数,基于源代码和文档分析:
2.1 数据结构
2.1.1 Checkpoint
- 类型:
TypedDict
- 描述:表示状态图在特定时间点的状态快照,包含以下字段:
v: int
:版本号,用于处理格式变化。ts: str
:时间戳(ISO 格式,例:"2025-05-17T21:16:00"
),记录创建时间。channel_values: dict[str, Any]
:通道值,存储节点间传递的数据(如节点输出)。channel_versions: defaultdict[str, int]
:通道版本,管理数据更新一致性。versions_seen: defaultdict[str, defaultdict[str, int]]
:已见版本,记录处理过的状态。
- 作用:存储状态图的完整状态,支持恢复、调试和版本控制。
- 示例:
checkpoint = { "v": 1, "ts": "2025-05-17T21:16:00", "channel_values": {"node1": "output"}, "channel_versions": defaultdict(int, {"node1": 1}), "versions_seen": defaultdict(lambda: defaultdict(int)) }
2.1.2 CheckpointAt
- 类型:
StrEnum
- 描述:枚举类型,指定保存检查点的时机:
END_OF_STEP
:每一步结束时保存。END_OF_RUN
:整个运行结束时保存(默认)。
- 作用:控制检查点保存的频率,适应不同应用需求。
- 示例:子类可设置
at=CheckpointAt.END_OF_STEP
以更频繁地保存状态。
2.1.3 CheckpointTuple
- 类型:
NamedTuple
- 描述:包含检查点及其相关配置的元组,字段包括:
config: RunnableConfig
:执行配置,包含thread_id
、thread_ts
等。checkpoint: Checkpoint
:检查点对象。parent_config: Optional[RunnableConfig]
:父配置(可选,用于追溯)。
- 作用:提供检查点的完整上下文,支持会话管理和历史追踪。
- 示例:
checkpoint_tuple = CheckpointTuple( config={"configurable": {"thread_id": "thread-1"}}, checkpoint=checkpoint, parent_config=None )
2.1.4 ConfigurableFieldSpec
- 类型:数据结构
- 描述:定义可配置字段的规格,用于
config_specs
属性:CheckpointThreadId
:id="thread_id"
,类型str
,默认""
,标识会话。CheckpointThreadTs
:id="thread_ts"
,类型Optional[str]
,默认None
,记录时间戳。
- 作用:支持线程隔离和会话管理。
2.2 核心类
2.2.1 BaseCheckpointSaver
- 类型:抽象基类(继承
Serializable
和ABC
) - 描述:检查点保存器的基类,定义保存和检索检查点的标准接口。
- 属性:
at: CheckpointAt = CheckpointAt.END_OF_RUN
:保存检查点的时机。serde: Optional[SerializerProtocol]
:序列化器,处理数据序列化和反序列化,默认使用JsonPlusSerializer
。config_specs: list[ConfigurableFieldSpec]
:可配置字段列表,包含thread_id
和thread_ts
。
- 方法:
- 同步方法:
get(config: RunnableConfig) -> Optional[Checkpoint]
:根据配置获取检查点。get_tuple(config: RunnableConfig) -> Optional[CheckpointTuple]
:获取检查点元组。list(config: RunnableConfig) -> Iterator[CheckpointTuple]
:列出匹配的检查点。put(config: RunnableConfig, checkpoint: Checkpoint) -> RunnableConfig
:保存检查点。
- 异步方法:
aget(config: RunnableConfig) -> Optional[Checkpoint]
:异步获取检查点。aget_tuple(config: RunnableConfig) -> Optional[CheckpointTuple]
:异步获取检查点元组。alist(config: RunnableConfig) -> AsyncIterator[CheckpointTuple]
:异步列出检查点。aput(config: RunnableConfig, checkpoint: Checkpoint) -> RunnableConfig
:异步保存检查点。
- 同步方法:
- 实现:
- 同步方法(如
get
)调用对应的get_tuple
,异步方法(如aget
)使用asyncio
运行同步方法。 - 核心方法(如
get_tuple
、put
)为抽象方法,子类必须实现,抛出NotImplementedError
。
- 同步方法(如
- 作用:提供统一接口,子类实现具体存储逻辑(如内存、数据库)。
2.3 辅助函数
_seen_dict
:- 描述:返回
defaultdict(int)
,用于初始化versions_seen
。 - 作用:辅助创建嵌套字典结构,管理版本信息。
- 描述:返回
empty_checkpoint
:- 描述:创建空
Checkpoint
对象,包含:v=1
:版本号。ts
:当前时间戳。- 空的
channel_values
、channel_versions
和versions_seen
。
- 作用:初始化新会话或状态图。
- 描述:创建空
copy_checkpoint
:- 描述:深拷贝
Checkpoint
对象,复制所有字段。 - 作用:安全复制检查点,避免修改原始数据。
- 描述:深拷贝
3. 使用方法
3.1 基本步骤
-
选择子类:
选择具体的检查点保存器(如InMemorySaver
、PostgresSaver
)。from langgraph.checkpoint.memory import InMemorySaver memory = InMemorySaver()
-
编译状态图:
在状态图编译时指定检查点保存器。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)
-
操作检查点:
- 获取:
memory.get_tuple(config)
- 列出:
list(memory.list(config))
- 保存:
memory.put(config, checkpoint)
- 获取:
3.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
# 定义状态
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
确保连续性。 - 结果:多轮对话保持上下文,检查点记录历史。
4. 适用场景与限制
4.1 适用场景
- 开发调试:通过子类(如
InMemorySaver
)快速测试状态图逻辑。 - 单元测试:模拟检查点功能,验证图的行为。
- 生产环境:通过数据库支持的子类(如
PostgresSaver
)实现持久化存储。 - 多轮对话:在聊天机器人中保存对话历史,支持上下文连续性。
- 复杂工作流:在多步骤任务中保存中间状态,确保任务可恢复。
4.2 限制
- 抽象模块:
BaseCheckpointSaver
无法直接实例化,需通过子类使用。 - 异步实现:子类需实现异步方法以避免阻塞,适合高并发场景。
- 存储后端:性能和持久化依赖子类实现,
InMemorySaver
不适合生产环境。 - 版本兼容性:部分功能可能随版本变化,需参考最新文档。
5. 子模块与实现
langgraph.checkpoint.base
是检查点系统的核心模块,其他模块(如 memory
、sqlite
、postgres
)基于其接口实现具体功能:
langgraph.checkpoint.memory
:- 包含
InMemorySaver
和PersistentDict
。 - 适合调试和测试,内存存储,数据不持久化。
- 包含
langgraph.checkpoint.sqlite
:- 包含
SqliteSaver
,使用 SQLite 数据库。 - 适合本地工作流,支持持久化。
- 包含
langgraph.checkpoint.postgres
:- 包含
PostgresSaver
和AsyncPostgresSaver
。 - 适合生产环境,支持高并发和持久化。
- 包含
对比:
保存器 | 存储位置 | 适用场景 | 持久化 | 安装要求 |
---|---|---|---|---|
InMemorySaver | 内存 | 调试、测试、短期实验 | 否 | 无需额外安装 |
SqliteSaver | SQLite 数据库 | 本地工作流、实验 | 是 | 需 langgraph-checkpoint-sqlite |
PostgresSaver | PostgreSQL | 生产环境、长期运行 | 是 | 需 langgraph-checkpoint-postgres |
选择建议:
- 开发阶段:使用
InMemorySaver
,快速迭代。 - 生产环境:选择
PostgresSaver
或SqliteSaver
,确保持久化和高并发支持。
6. 注意事项
- 异步优先:子类应实现异步方法(如
aget_tuple
),避免阻塞主线程。 - 序列化配置:确保
serde
支持检查点数据类型,必要时自定义序列化器。 - 线程管理:正确使用
thread_id
,避免状态冲突。 - 调试技巧:
- 启用
debug=True
查看检查点日志。 - 使用
get_tuple
检查具体状态。
- 启用
- 版本兼容性:确保 LangGraph 版本支持(0.2+),参考 LangGraph 文档。
- 生产环境:避免使用非持久化子类(如
InMemorySaver
),选择数据库支持的保存器。
7. 学习建议
- 基础知识:掌握 LangGraph 的状态图、检查点和存储概念。
- 文档:阅读 LangGraph 检查点文档 和 持久化指南。
- 实践:从简单状态图开始,逐步添加检查点和多轮对话。
- 社区:加入 LangChain Discord,查看 GitHub 示例(如 LangGraph GitHub)。
- 调试:使用日志和可视化工具(如
graph.get_graph().to_dot()
)分析检查点。
8. 总结
langgraph.checkpoint.base
模块是 LangGraph 检查点系统的核心,提供了检查点数据结构(Checkpoint
、CheckpointTuple
)和抽象基类(BaseCheckpointSaver
),定义了保存和检索检查点的标准接口。它支持同步和异步操作,通过子类(如 InMemorySaver
、PostgresSaver
)实现具体存储逻辑,适用于开发调试和生产环境。模块设计注重统一接口、灵活性和可扩展性,为构建可持久化、有状态的 AI 应用提供了坚实基础。