高级功能
时间旅行
使用 Time Travel 进行调试、测试假设和分支探索
📚 学习目标
学完这篇文章后,你将能够:
- 查看 Graph 的执行历史(History)
- "穿越"回到过去某个状态并分叉(Fork)执行新路径
- 使用时间旅行调试复杂的 Agent 行为
前置知识
在开始学习之前,建议先阅读:
1️⃣ 查看历史
时间旅行建立在 Checkpointer 的“快照历史”上:图每走一步,就会把当前状态保存成一个 checkpoint。
要做到这件事,你必须满足两个前提:
- 编译图时传入
checkpointer - 调用图时提供
thread_id(用于索引这条时间线)
下面展示如何遍历某个 thread 的历史快照:
const history = await app.getStateHistory({
configurable: {
thread_id: 'thread-1',
},
});
for await (const snapshot of history) {
// snapshot.values: 当时的完整 state
// snapshot.config: 通常包含 checkpoint_id
console.log('checkpoint:', snapshot.config?.configurable?.checkpoint_id);
console.log('state:', snapshot.values);
}2️⃣ 回复 (Replay)
严格来说,“Replay”有两种意思:
- 读取过去:查看那个 checkpoint 的 state(用于调试)
- 从过去继续跑:把运行指针放回过去,再执行后续节点
最常见的用法是先拿到最新的 checkpoint:
const config = {
configurable: {
thread_id: 'thread-1',
},
};
// 获取当前(最新)状态快照
const snapshot = await app.getState(config);
console.log(snapshot.values);
console.log(snapshot.config?.configurable?.checkpoint_id);3️⃣ 分叉 (Forking)
最强大的功能是:回到过去,修改一点东西,然后走一条新的路。
import { Command } from '@langchain/langgraph';
// 1. 找到过去某个 checkpoint 的配置
const pastConfig = {
configurable: {
thread_id: 'thread-1',
checkpoint_id: 'kp_1234567890',
},
};
// 2. 以“从该点恢复”的方式继续执行
await app.invoke(new Command({ resume: "let's try a different approach" }), pastConfig);还可以直接 updateState 修改过去:
import { HumanMessage } from '@langchain/core/messages';
// 修改过去的状态(常用于调试/纠错/人机协作编辑)
await app.updateState(pastConfig, {
messages: [new HumanMessage('其实我想问的是 Weather,不是 Stock')],
});
// 从修改后的 checkpoint 继续跑
await app.invoke(null, pastConfig);4️⃣ 应用场景
- 调试 (Debugging):Agent 在第 5 步出错。你可以回到第 4 步,修改 Prompt 或输入,重试第 5 步,直到修好。
- 人机交互 (Edit):用户不满意 AI 的回答,退回上一步,修改 Prompt 重生成。
- 评估 (Evaluation):在同一个起点,测试 10 种不同的 Model 或 Prompt 策略,比较结果。
📚 参考资源
官方文档
本项目相关内容
💡 练习题
- 操作题:
- 运行一个 3 步的 Graph (A -> B -> C)。
- 运行完后,列出 History,找到 B 执行完后的 Checkpoint ID。
- 使用
updateState修改 State 中某个变量。 - 从 B 点重新
invoke,观察是否生成了新的 C' 结果。
✅ 总结
本章要点:
- Checkpoint ID 是时间机器的坐标。
- Forking 允许你探索平行宇宙。
- 这是一个仅仅因为有了 Checkpointer 就能 "免费" 获得的强大 DevTool。
恭喜! 你已经掌握了 LangGraphJS 的所有核心与高级功能。 下一步:我们将学习如何将 LangGraph 应用部署到生产环境。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。