持久化(Persistence)
LangGraph 的持久化层通过检查点为智能体提供短期记忆,并通过存储提供长期记忆。
持久化使 LangGraph 应用程序能够在单次图运行之外保留有用信息。当智能体需要继续对话、在中断后恢复、从故障中恢复或跨交互记住信息时,这至关重要。
LangGraph 提供了两个互补的持久化系统:
- 检查点(Checkpointers):将线程的图状态作为检查点进行持久化。用于短期、线程范围的记忆,包括对话连续性、人机协同工作流、时间旅行和容错。
- 存储(Stores):在图状态之外持久化应用程序定义的数据。用于长期的跨线程记忆,包括用户偏好、事实和共享知识。
大多数应用程序可以同时使用两者:检查点跟踪当前线程,而存储跟踪跨线程的持久信息。
快速入门
使用检查点、存储或两者同时编译你的图:
typescript
import { MemorySaver, InMemoryStore } from "@langchain/langgraph";
const checkpointer = new MemorySaver();
const store = new InMemoryStore();
const graph = builder.compile({ checkpointer, store });
const result = await graph.invoke(
{ messages: [{ role: "user", content: "Hi, my name is Bob." }] },
{ configurable: { thread_id: "thread-1" } }
);INFO
Agent Server 会自动处理持久化 使用 Agent Server 时,你无需手动实现或配置检查点或存储。服务器在后台处理持久化基础设施。
检查点 vs. 存储
| 检查点(Checkpointer) | 存储(Store) | |
|---|---|---|
| 持久化内容 | 图状态快照 | 应用程序定义的键值数据 |
| 范围 | 单个线程 | 跨线程 |
| 记忆类型 | 短期、线程范围记忆 | 长期、跨线程记忆 |
| 用途 | 对话连续性、人机协同、时间旅行和容错 | 用户偏好、事实和共享知识 |
| 访问模式 | 在图配置中传递 thread_id | 从节点或应用程序代码中读取和写入项 |
| 完整指南 | 检查点指南 | 存储指南 |
常见问题排查
PostgresSaver: thread_id 太长
使用 PostgresSaver(或 AsyncPostgresSaver)时,thread_id 存储在具有有限长度的列中。如果你的 thread_id 超出列大小限制,你将看到数据库错误。
修复方法: 将 thread_id 值控制在 255 个字符以内。如果需要确定性 ID,请使用 UUID 或哈希。
MemorySaver 在重启后不持久化
MemorySaver 和 InMemorySaver 将检查点存储在 RAM 中。当进程重启时,所有检查点都将丢失。
修复方法: 在生产中使用持久化检查点:
PostgresSaver:支持异步的 PostgreSQLSqliteSaver:用于开发的本地基于文件的存储
检查点无限制增长
在长时间对话中,检查点会不断累积。这可能会增加延迟和存储成本。
修复方法: 定期修剪旧检查点或设置保留策略。
从父图到子图的状态访问
当子图更新状态时,父图可能无法立即看到更改。这是因为每个子图管理自己的检查点命名空间。
修复方法: 对于需要跨越图边界的数据,使用通过 Store 共享状态,或者将子图配置为写入父检查点。
