高级功能
持久化
利用 Checkpointer 实现状态保存、断点续传和历史回溯
📚 学习目标
学完这篇文章后,你将能够:
- 理解 Checkpoint 机制如何工作
- 使用
MemorySaver和数据库 Saver 保存应用状态 - 通过
thread_id管理多用户会话
前置知识
在开始学习之前,建议先阅读:
1️⃣ 为什么需要持久化?
默认情况下,Graph 运行在内存中。一旦程序结束或服务器重启,状态就丢失了。 持久化允许我们:
- 长对话:用户隔天回来,还能接着昨天的聊。
- 人机交互:Graph 暂停等待用户批准,几天后用户批准了,Graph 能从暂停点继续运行。
- 调试/时间旅行:查看过去的每一步发生了什么,甚至修改过去的状态并重新运行。
2️⃣ Checkpoint 机制
LangGraph 使用 Checkpointer 在每个 Super-step(节点执行完)后保存状态快照。
快照包含:
config: 配置信息(如 thread_id)metadata: 元数据(如 run_id)values: 当前 State 的值next: 下一步要执行的节点
3️⃣ 使用 Saver
最简单的是 MemorySaver(仅内存,重启丢失,适合测试)。生产环境通常使用 PostgresSaver 或 SqliteSaver。
内存持久化示例
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); // 查看下一步要执行的节点💡 练习题
- 实战题:使用
MemorySaver创建一个简单的累加器 Graph。- 第一步:输入数字 5。
- 第二步:即使不传入任何输入,再次 invoke,Graph 应该能确保持续累加(如果逻辑是读取旧值+1)。
- 验证:尝试换一个
thread_id,确认状态是隔离的。
📚 参考资源
官方文档
✅ 总结
本章要点:
- Checkpointer 是实现持久化的核心组件。
- Thread ID 用于区分不同的会话上下文。
- Production:上线务必使用持久化的数据库 Saver。
下一步:有了持久化,我们就能实现能在中间暂停的系统。学习人机交互。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。