Skip to main content

概述

LangGraph 支持通过 检查点 实现时间旅行:
  • 重放:从先前的检查点重新尝试。
  • 分支:从先前的检查点分支,并修改状态以探索替代路径。
这两种方式都通过从先前的检查点恢复执行。检查点之前的节点不会重新执行(结果已经保存)。检查点之后的节点会重新执行,包括任何 LLM 调用、API 请求和 中断(可能产生不同的结果)。

重放

使用先前的检查点配置调用图,从该点重放。
重放会重新执行节点——它不仅仅是从缓存中读取。LLM 调用、API 请求和 中断 会再次触发,并可能返回不同的结果。从最终检查点(没有 next 节点)重放是无操作的。
重放 :::python 使用 @[get_state_history] 找到你想重放的那个检查点,然后使用该检查点的配置调用 @[invoke][CompiledStateGraph.invoke]:
::: :::js 使用 @[getStateHistory] 找到你想重放的那个检查点,然后使用该检查点的配置调用 @[invoke][CompiledStateGraph.invoke]:
:::

分支

分支从过去的检查点创建一个带有修改状态的分支。在先前的检查点上调用 @[update_state] 来创建分支,然后使用 None 调用 @[invoke][CompiledStateGraph.invoke] 来继续执行。 分支
update_state 不会 回滚线程。它会创建一个新的检查点,该检查点从指定的点分支。原始执行历史保持完整。
:::python
::: :::js
:::

从特定节点开始

当你调用 @[update_state] 时,值会使用指定节点的写入器(包括 归约器)应用。检查点记录该节点已生成更新,然后从该节点的后继节点继续执行。 默认情况下,LangGraph 从检查点的版本历史中推断 as_node。从特定检查点分支时,这种推断几乎总是正确的。 在以下情况下显式指定 as_node:
  • 并行分支:多个节点在同一步骤中更新状态,而 LangGraph 无法确定哪个是最后一个(InvalidUpdateError)。
  • 没有执行历史:在新鲜线程上设置状态(在 测试 中很常见)。
  • 跳过节点:将 as_node 设置为较后的节点,使图认为该节点已经运行。
:::python
::: :::js
:::

中断

如果你的图使用 @[interrupt] 用于 人机交互 工作流,在时间旅行期间中断总是会重新触发。包含中断的节点会重新执行,interrupt() 会暂停以等待新的 Command(resume=...)。 :::python
::: :::js
:::

多个中断

如果你的图在多个点收集输入(例如,多步骤表单),你可以从中断之间分支,以更改后续答案而不重新询问早期问题。 :::python
::: :::js
:::

子图

使用 子图 的时间旅行取决于子图是否有自己的检查点器。这决定了你可以从哪个粒度进行时间旅行的检查点。
默认情况下,子图继承父检查点器。父级将整个子图视为一个 单个超级步骤——整个子图执行只有一个父级检查点。从子图之前进行时间旅行会使其从头开始重新执行。你不能时间旅行到默认子图中节点之间的点——你只能从父级进行时间旅行。:::python
::::::js
:::
有关配置子图检查点器的更多信息,请参阅 子图持久化。
官方原文:src/oss/langgraph/use-time-travel.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026