高级功能

时间旅行

使用 Time Travel 进行调试、测试假设和分支探索

📚 学习目标

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

  • 查看 Graph 的执行历史(History)
  • "穿越"回到过去某个状态并分叉(Fork)执行新路径
  • 使用时间旅行调试复杂的 Agent 行为

前置知识

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


1️⃣ 查看历史

时间旅行建立在 Checkpointer 的“快照历史”上:图每走一步,就会把当前状态保存成一个 checkpoint。

要做到这件事,你必须满足两个前提:

  1. 编译图时传入 checkpointer
  2. 调用图时提供 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”有两种意思:

  1. 读取过去:查看那个 checkpoint 的 state(用于调试)
  2. 从过去继续跑:把运行指针放回过去,再执行后续节点

最常见的用法是先拿到最新的 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️⃣ 应用场景

  1. 调试 (Debugging):Agent 在第 5 步出错。你可以回到第 4 步,修改 Prompt 或输入,重试第 5 步,直到修好。
  2. 人机交互 (Edit):用户不满意 AI 的回答,退回上一步,修改 Prompt 重生成。
  3. 评估 (Evaluation):在同一个起点,测试 10 种不同的 Model 或 Prompt 策略,比较结果。

📚 参考资源

官方文档

本项目相关内容


💡 练习题

  1. 操作题
    • 运行一个 3 步的 Graph (A -> B -> C)。
    • 运行完后,列出 History,找到 B 执行完后的 Checkpoint ID。
    • 使用 updateState 修改 State 中某个变量。
    • 从 B 点重新 invoke,观察是否生成了新的 C' 结果。

✅ 总结

本章要点

  • Checkpoint ID 是时间机器的坐标。
  • Forking 允许你探索平行宇宙。
  • 这是一个仅仅因为有了 Checkpointer 就能 "免费" 获得的强大 DevTool。

恭喜! 你已经掌握了 LangGraphJS 的所有核心与高级功能。 下一步:我们将学习如何将 LangGraph 应用部署到生产环境。

登录以继续阅读

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

立即登录

On this page