时间旅行 ⏱️¶
先决条件
本指南假设您熟悉 LangGraph 的检查点和状态。如果不是,请先查阅持久化概念。
在使用基于模型做出决策的非确定性系统(例如,由大型语言模型驱动的智能体)时,详细检查其决策过程会很有用。
-
🤔 理解推理过程:分析导致成功结果的步骤。
-
🐞 调试错误:查明错误发生的位置和原因。
-
🔍 探索替代方案:测试不同的路径以发现更好的解决方案。
我们将这些调试技术称为时间旅行,它由两个关键操作组成:回放 🔁 和 分支 🔀。
回放¶
回放使我们能够重温并重现智能体过去的动作。这可以从图的当前状态(或检查点)执行,也可以从特定检查点执行。
要从当前状态进行回放,只需将 null
作为输入,并附带 threadConfig
。
const threadConfig = { configurable: { thread_id: "1" }, streamMode: "values" };
for await (const event of await graph.stream(null, threadConfig)) {
console.log(event);
}
要从特定检查点回放动作,首先检索该线程的所有检查点。
const allCheckpoints = [];
for await (const state of graph.getStateHistory(threadConfig)) {
allCheckpoints.push(state);
}
每个检查点都有一个唯一的 ID。识别出所需的检查点后,例如 xyz
,将其 ID 包含在配置中。
const threadConfig = { configurable: { thread_id: '1', checkpoint_id: 'xyz' }, streamMode: "values" };
for await (const event of await graph.stream(null, threadConfig)) {
console.log(event);
}
图会高效地回放之前执行过的节点,而不是重新执行它们,这得益于其对先前检查点执行情况的感知。
分支¶
分支使您能够重温智能体过去的动作,并在图中探索替代路径。
要编辑特定检查点(例如 xyz
),请在更新图的状态时提供其 checkpoint_id
。
const threadConfig = { configurable: { thread_id: "1", checkpoint_id: "xyz" } };
graph.updateState(threadConfig, { state: "updated state" });
这将创建一个新的分支检查点 xyz-fork,您可以从该检查点继续运行图。
const threadConfig = { configurable: { thread_id: '1', checkpoint_id: 'xyz-fork' }, streamMode: "values" };
for await (const event of await graph.stream(null, threadConfig)) {
console.log(event);
}
附加资源 📚¶
-
概念指南:持久化:阅读持久化指南,以获取有关回放的更多上下文。
-
如何查看和更新过去的图状态:关于如何使用图状态的分步说明,演示了回放和分支操作。