Skip to main content

概览

LangGraph 通过检查点支持时间旅行:
  • 重放:从先前的检查点重试。
  • 分叉:从先前的检查点分支,使用修改后的状态来探索替代路径。
两者都通过从先前的检查点恢复来工作。检查点之前的节点不会重新执行(结果已经保存)。检查点之后的节点会重新执行,包括任何大语言模型(LLM)调用、API 请求和中断(可能产生不同的结果)。

重放

使用先前检查点的配置调用图,从该点进行重放。
重放会重新执行节点——它不仅仅是从缓存中读取。大语言模型(LLM)调用、API 请求和中断会再次触发,可能返回不同的结果。从最终检查点(没有 next 节点)重放是无操作的。
重放 使用 get_state_history 找到你想要重放的检查点,然后使用该检查点的配置调用 invoke

分叉

分叉从过去的检查点创建一个具有修改状态的新分支。在先前的检查点上调用 update_state 来创建分叉,然后使用 None 调用 invoke 来继续执行。 分叉
update_state 不会回滚线程。它创建一个从指定点分支的新检查点。原始执行历史保持不变。

从特定节点

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

中断

如果你的图使用 interrupt 进行人机协作工作流,中断在时间旅行期间总是会被重新触发。包含中断的节点会重新执行,interrupt() 会暂停等待新的 Command(resume=...)

多个中断

如果你的图在多个点收集输入(例如多步表单),你可以从中断之间分叉,在不重新询问早期问题的情况下更改后面的回答。

子图

使用子图进行时间旅行取决于子图是否有自己的检查点器。这决定了你可以从中进行时间旅行的检查点的粒度。
默认情况下,子图继承父图的检查点器。父图将整个子图视为单个超步——整个子图执行只有一个父级检查点。从子图之前进行时间旅行会从头重新执行它。你不能在默认子图中时间旅行到节点之间的某个点——你只能从父级进行时间旅行。
有关配置子图检查点器的更多信息,请参阅子图持久化