LangGraph 代理中的每次状态变化都会创建一个 checkpoint,即该时刻代理状态的完整快照。时间旅行让你可以检查任意 checkpoint,查看代理当时持有的确切状态,并从该点恢复执行以探索替代路径。它同时是调试器、撤销按钮和审计日志。
此功能需要 LangGraph Agent Server。使用 langgraph dev 本地运行您的智能体,或将其部署到 LangSmith,以使用此模式。

Checkpoints 的工作原理

LangGraph 会在每个节点执行后持久化代理状态。每个持久化状态都是一个 ThreadState 对象,捕获以下内容:
  • checkpoint:标识该特定快照的元数据(ID、时间戳)
  • values:该点的完整代理状态(messages、自定义键)
  • tasks:计划接下来运行的图节点
  • next:执行计划中即将运行的节点名称
这会创建一条线性时间线,记录代理做出的每个决策、调用的每个工具和生成的每个响应。你的 UI 可以渲染这条时间线,并允许用户跳转到任意点。

设置 useStream

为你的代理创建流,然后从 LangGraph client 显式获取活动线程的 checkpoint 历史。从 checkpoint 恢复时使用 forkFrom: { checkpointId }。
The code examples use useStream<typeof myAgent> for type-safe stream state. See Type inference for Python or JavaScript backends.

构建 checkpoint 时间线

时间线侧边栏会将每个 checkpoint 显示为可点击条目。每个条目显示运行过的节点,以及该点存在的消息数量:

检查 checkpoint 状态

点击 checkpoint 应显示该点的完整状态。JSON 查看器让开发者完整了解代理知道什么以及做出了什么决策:
对于生产 UI,可以考虑使用带可折叠节点的合适 JSON 查看器组件,而不是原始 JSON.stringify。react-json-view 或 react-json-tree 等库可以为用户提供更好的探索体验。

从 checkpoint 恢复

时间旅行的核心能力是从任意先前 checkpoint 恢复执行。用户选择 checkpoint 时,使用 null input 调用 submit 并传入 checkpoint ID:
这会告诉 LangGraph:
  1. 回滚到所选 checkpoint 的状态
  2. 从该点开始重新执行图
  3. 将新结果流式传输到客户端
所选 checkpoint 之后的现有消息会被新的执行路径替换。这实际上会在对话时间线中创建一个分支。
从 checkpoint 恢复不会删除原始时间线。先前 checkpoints 仍会保留在历史中。这意味着用户始终可以回去尝试不同路径,而不会丢失任何先前工作。

SplitView 布局

时间旅行最适合使用分栏布局,主聊天位于左侧,时间线位于右侧:

提取 checkpoint 元数据

将原始 checkpoint 数据转换为适合在时间线中显示的条目:
这样就可以用有意义的标签渲染时间线条目,而不是显示原始 ID。

用例

时间旅行在许多场景中都很有价值:
  • 调试代理行为:逐步查看代理决策,理解它为什么选择特定路径
  • 撤销动作:如果代理走错方向,从较早的 checkpoint 恢复并重试
  • 探索替代路径:从对话中途的 checkpoint fork,查看不同输入如何改变结果
  • 审计:查看代理动作的完整历史,用于合规、质量保证或事故后分析
  • 教学:逐步走查代理执行过程,解释多步推理如何工作
时间旅行与 human-in-the-loop 模式结合时尤其强大。如果人工审核者在 interrupt 处拒绝了代理动作,可以从该动作执行前的 checkpoint 恢复,并提供纠正输入。

在时间线中处理 interrupts

包含 interrupts(human-in-the-loop 暂停)的 checkpoints 应该有特殊视觉处理。它们代表代理停止并等待人工输入的时刻:

最佳实践

  • 惰性加载历史:对于包含数百个 checkpoints 的线程,使用分页或只加载最近 N 个条目,以保持 UI 响应。
  • 显示有意义的标签:显示节点名称和消息数,而不是原始 checkpoint ID。用户需要上下文,而不是 UUID。
  • 恢复前确认:从旧 checkpoint 恢复会替换当前执行路径。显示确认对话框,避免用户意外丢失当前对话状态。
  • 高亮当前 checkpoint:让用户清楚看到哪个 checkpoint 对应当前对话状态。
  • 支持键盘导航:高级用户会想用方向键逐步浏览 checkpoints。为时间线添加键盘处理器,提供流畅的调试体验。
  • 对比 checkpoints 之间的状态差异:对于高级用户,展示两个连续 checkpoints 之间发生了什么变化,可以揭示代理状态在每一步的具体演化。