时间旅行¶
LangGraph 提供了 时间旅行 功能,用于 从之前的检查点恢复执行 —— 无论是重播相同的状态还是修改它以探索替代方案。在所有情况下,从过去恢复执行都会在历史中产生一个 新的分支。
使用时间旅行功能¶
要在 LangGraph 中使用时间旅行功能:
- 使用初始输入运行图:使用 LangGraph SDK 的
client.runs.wait
或client.runs.stream
API。 - 识别现有线程中的检查点:使用
client.threads.get_history
方法,获取特定thread_id
的执行历史并定位所需的checkpoint_id
。
或者,在你希望执行暂停的节点之前设置一个断点。然后你可以找到该断点前记录的最新检查点。 - (可选)修改图状态:使用
client.threads.update_state
方法,在检查点处修改图的状态,并从替代状态继续执行。 - 从检查点恢复执行:使用
client.runs.wait
或client.runs.stream
API,传入None
作为输入以及适当的thread_id
和checkpoint_id
来恢复执行。
示例¶
示例图
from typing_extensions import TypedDict, NotRequired
from langgraph.graph import StateGraph, START, END
from langchain.chat_models import init_chat_model
from langgraph.checkpoint.memory import InMemorySaver
class State(TypedDict):
topic: NotRequired[str]
joke: NotRequired[str]
llm = init_chat_model(
"anthropic:claude-3-7-sonnet-latest",
temperature=0,
)
def generate_topic(state: State):
"""LLM调用以生成笑话的主题"""
msg = llm.invoke("Give me a funny topic for a joke")
return {"topic": msg.content}
def write_joke(state: State):
"""LLM调用以根据主题编写笑话"""
msg = llm.invoke(f"Write a short joke about {state['topic']}")
return {"joke": msg.content}
# 构建工作流
builder = StateGraph(State)
# 添加节点
builder.add_node("generate_topic", generate_topic)
builder.add_node("write_joke", write_joke)
# 添加边以连接节点
builder.add_edge(START, "generate_topic")
builder.add_edge("generate_topic", "write_joke")
# 编译
graph = builder.compile()
1. 运行图¶
import { Client } from "@langchain/langgraph-sdk";
const client = new Client({ apiUrl: <DEPLOYMENT_URL> });
// 使用名为 "agent" 部署的图
const assistantID = "agent";
// 创建线程
const thread = await client.threads.create();
const threadID = thread["thread_id"];
// 运行图
const result = await client.runs.wait(
threadID,
assistantID,
{ input: {}}
);
2. 识别检查点¶
3. 更新状态(可选)¶
update_state
将创建一个新的检查点。新的检查点将与同一个线程相关联,但具有新的检查点 ID。
4. 从检查点恢复执行¶
学习更多¶
- LangGraph 时间旅行指南: 了解更多关于在 LangGraph 中使用时间旅行的内容。