Skip to content

持久化(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:支持异步的 PostgreSQL
  • SqliteSaver:用于开发的本地基于文件的存储

检查点无限制增长 ​

在长时间对话中,检查点会不断累积。这可能会增加延迟和存储成本。

修复方法: 定期修剪旧检查点或设置保留策略。

从父图到子图的状态访问 ​

当子图更新状态时,父图可能无法立即看到更改。这是因为每个子图管理自己的检查点命名空间。

修复方法: 对于需要跨越图边界的数据,使用通过 Store 共享状态,或者将子图配置为写入父检查点。

后续步骤 ​