在 LangGraph 中,workflow.compile() 是一个至关重要的步骤。它的作用是将你构建的图结构(StateGraph)转换成一个可执行的应用程序(CompiledGraph)。
简单来说,在调用 .compile() 之前,你只是在定义流程图;调用之后,你就拥有了一个可以运行、可以流式输出、甚至可以拥有记忆的“机器”。
以下是关于 compile() 的详细用法和参数说明。
-
核心作用
- 验证图结构: 检查是否有孤立节点,是否定义了入口点(START)等。
- 生成 Runnable: 返回的对象是一个标准的 LangChain Runnable,支持 .invoke(), .stream(), .batch() 等方法。
- 注入功能: 在这一步,你可以注入记忆(Persistence)和断点(Interrupts)。
-
常用参数 (Parameters)
-
workflow.compile() 主要接收以下几个关键参数,用于增强 Agent 的能力:
A. checkpointer (持久化/记忆)这是最常用的参数。它允许图保存每一步的状态(State)。
作用: 实现“记忆”功能,支持长时间运行的任务,允许从特定的状态恢复(Time Travel)。
类型: BaseCheckpointSaver (例如 MemorySaver, AsyncSqliteSaver, PostgresSaver 等)。B. interrupt_before (执行前中断)作用:
在执行特定节点之前暂停。常用于“人机回圈”(Human-in-the-Loop),例如在执行敏感操作(如写入数据库、发送邮件)前等待用户批准。
类型: list[str] (节点名称的列表)。C. interrupt_after (执行后中断)
作用: 在执行特定节点之后暂停。常用于让用户检查某个步骤的输出结果,然后再决定是否继续。
类型: list[str] (节点名称的列表)。D. store (存储)作用: (较新版本) 用于跨不同 thread (对话) 共享数据,而不仅仅是当前对话的上下文。
类型: BaseStore。
-
workflow.compile() 生成的 CompiledGraph 对象(即你的 rag_agent)是 LangGraph 的核心执行单元。它不仅是一个简单的函数,更是一个能够管理状态、支持流式输出和能够“时间旅行”的复杂对象。以下是它的主要方法、具体区别和使用场景的详细对比:1. 核心执行方法对比这三个方法用于“运行”你的图,但交互方式不同。方法核心特点适用场景返回值.invoke()同步/阻塞后台任务、自动化脚本、不需要即时反馈的 API最终状态 (Final State).stream()流式/实时聊天机器人 UI、通过 SSE 推送消息、长任务进度展示生成器 (yields updates).batch()并发/批量批量处理文档、评测 (Evaluation)、数据清洗状态列表 (List of States)2. 具体代码示例假设我们有一个简单的图,状态包含 messages 列表。A. invoke (一次性拿结果)程序会“卡住”,直到图执行完所有步骤(或者遇到断点),然后一次性返回最终结果。Pythoninputs = {"messages": [("user", "你好,请介绍一下 LangGraph")]}
执行并等待
final_state = rag_agent.invoke(inputs)
直接获取最终回复
inputs = {"messages": [("user", "你好,请介绍一下 LangGraph")]}
# 执行并等待
final_state = rag_agent.invoke(inputs)
# 直接获取最终回复
print(final_state["messages"][-1].content)
循环获取每一个节点的输出
for event in rag_agent.stream(inputs):
# event 的格式通常是: {'节点名称': {'key': 'value'}}
for node_name, state_update in event.items():
print(f"--- 正在执行: {node_name} ---")
print(state_update)
C. batch (并行处理)LangGraph 会利用线程池并行处理多个输入,比写 for 循环调用 invoke 快得多。
Pythoninputs_list = [
{"messages": [("user", "1+1等于几?")]},
{"messages": [("user", "今天天气如何?")]},
{"messages": [("user", "讲个笑话")]}
]
并行运行
results = rag_agent.batch(inputs_list)
# results 是一个列表,包含3个最终状态
for res in results:
print(res["messages"][-1].content)