高级功能

持久化

利用 Checkpointer 实现状态保存、断点续传和历史回溯

📚 学习目标

学完这篇文章后,你将能够:

  • 理解 Checkpoint 机制如何工作
  • 使用 MemorySaver 和数据库 Saver 保存应用状态
  • 通过 thread_id 管理多用户会话

前置知识

在开始学习之前,建议先阅读:


1️⃣ 为什么需要持久化?

默认情况下,Graph 运行在内存中。一旦程序结束或服务器重启,状态就丢失了。 持久化允许我们:

  1. 长对话:用户隔天回来,还能接着昨天的聊。
  2. 人机交互:Graph 暂停等待用户批准,几天后用户批准了,Graph 能从暂停点继续运行。
  3. 调试/时间旅行:查看过去的每一步发生了什么,甚至修改过去的状态并重新运行。

2️⃣ Checkpoint 机制

LangGraph 使用 Checkpointer 在每个 Super-step(节点执行完)后保存状态快照。

快照包含:

  • config: 配置信息(如 thread_id)
  • metadata: 元数据(如 run_id)
  • values: 当前 State 的值
  • next: 下一步要执行的节点

3️⃣ 使用 Saver

最简单的是 MemorySaver(仅内存,重启丢失,适合测试)。生产环境通常使用 PostgresSaverSqliteSaver

内存持久化示例

import { MemorySaver } from "@langchain/langgraph";

// 1. 初始化 Checkpointer
const checkpointer = new MemorySaver();

// 2. 编译时传入
const app = graph.compile({ checkpointer });

// 3. 调用时传入 thread_id
const config = { configurable: { thread_id: "conversation-1" } };

// 第一轮
await app.invoke({ messages: [new HumanMessage("Hi")] }, config);

// 第二轮 (状态会自动加载)
await app.invoke({ messages: [new HumanMessage("My name is Bob")] }, config);

数据库持久化 (Postgres)

需安装 @langchain/langgraph-checkpoint-postgres

import { PostgresSaver } from "@langchain/langgraph-checkpoint-postgres";
import { Pool } from "pg";

const pool = new Pool({ connectionString: "..." });
const checkpointer = new PostgresSaver(pool);

// 首次使用需初始化表
await checkpointer.setup();

const app = graph.compile({ checkpointer });

4️⃣ 线程管理 (Threads)

thread_id 是持久化的 Key。

  • 同一个 thread_id = 同一个对话历史。
  • 不同的 thread_id = 隔离的对话。

你可以通过 app.getState(config) 查看当前线程的状态。

const state = await app.getState(config);
console.log(state.values); // 查看当前 State
console.log(state.next);   // 查看下一步要执行的节点

💡 练习题

  1. 实战题:使用 MemorySaver 创建一个简单的累加器 Graph。
    • 第一步:输入数字 5。
    • 第二步:即使不传入任何输入,再次 invoke,Graph 应该能确保持续累加(如果逻辑是读取旧值+1)。
    • 验证:尝试换一个 thread_id,确认状态是隔离的。

📚 参考资源

官方文档


✅ 总结

本章要点

  • Checkpointer 是实现持久化的核心组件。
  • Thread ID 用于区分不同的会话上下文。
  • Production:上线务必使用持久化的数据库 Saver。

下一步:有了持久化,我们就能实现能在中间暂停的系统。学习人机交互

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page