START 和 END 这两个内置的虚拟节点的作用分别是什么?
在 LangGraph 中,START 和 END 是两个非常核心的内置虚拟节点(Constants)。它们的主要作用是定义图(Graph)执行的边界,即告诉程序工作流从哪里开始,到哪里结束。
以下是它们各自的具体作用和使用方式:
1. START 节点(起点)
START 节点代表了整个图执行的入口。
- 作用:当你调用
graph.invoke(input)或graph.stream(input)传入初始数据时,这些数据(即初始的 State)会首先到达START节点。START负责将这些初始状态传递给图中的第一个实际工作节点。 - 用法:你通常需要添加一条从
START指向某个具体节点的边(Edge),以此来指定图的起始动作。 - 注意:一个图必须要有且仅有一条明确的起始路径(可以是从
START到单个节点,也可以是通过条件路由到不同节点),否则图不知道该从哪个节点开始运行。
代码示例:
python
from langgraph.graph import START
# 告诉图:一开始就执行 "agent_node" 这个节点
workflow.add_edge(START, "agent_node")
2. END 节点(终点)
END 节点代表了整个图执行的出口。
- 作用:当图的执行流到达
END节点时,表示当前的工作流已经完成。程序会停止在图中的循环或流转,并将当前最终的 State(状态)作为结果返回给用户。 - 用法:你可以通过普通的边(Normal Edge)或条件边(Conditional Edge)将某个工作节点指向
END。 - 为什么重要:LangGraph 主要用于构建具有循环(Cycles)能力的 Agent(比如思考->行动->观察->再思考)。如果没有
END节点,Agent 可能会陷入无限循环。将路径指向END是打破循环、结束任务的关键。
代码示例:
python
from langgraph.graph import END
# 1. 直接结束:执行完 "final_node" 后,整个图结束
workflow.add_edge("final_node", END)
# 2. 条件结束:根据条件决定是继续循环还是结束
def should_continue(state):
if state["status"] == "finished":
return END # 任务完成,走向终点
else:
return "tool_node" # 继续执行工具节点
workflow.add_conditional_edges("agent_node", should_continue)
总结对比
| 特性 | START 节点 |
END 节点 |
|---|---|---|
| 角色 | 图的入口 / 数据初始化位置 | 图的出口 / 返回最终结果的位置 |
| 边的方向 | 只能出,不能进(作为起始点) | 只能进,不能出(作为终止点) |
| 状态传递 | 接收用户输入的初始 State | 输出计算完成的最终 State |
| 主要意义 | 告诉引擎“从哪里开始运行” | 告诉引擎“何时停止循环并退出” |
补充说明:
在早期版本的 LangGraph 中,开发者通常使用 workflow.set_entry_point("node_name") 和 workflow.set_finish_point("node_name")。但在后来的版本中,官方引入了 START 和 END 常量配合 add_edge 使用,这种方式使得图的逻辑表达(尤其是在可视化和复杂路由时)更加直观和一致。