在 LangGraph 中,条件边(conditional edges) 是用于在图(graph)中根据节点的输出动态决定下一步应执行哪个节点的一种机制。它通过 add_conditional_edges() 方法添加到图中。
例如:
python
state_graph.add_conditional_edges(NodeConstant.COORDINATION.value, coor_to_other,
{NodeConstant.PLANNER.value: NodeConstant.PLANNER.value, NodeConstant.END.value: END})
条件函数触发(被调用)场景
前一个节点执行完成并返回结果之后立即被调用。LangGraph 会将该节点的输出作为参数传递给这个条件函数。
例如:
python
def decide_next(state):
if state["score"] > 50:
return "pass"
else:
return "fail"
graph.add_conditional_edge("evaluate", decide_next, {"pass": "accept", "fail": "reject"})
- 当
"evaluate"节点运行结束,返回一个状态字典(如{"score": 70}), - LangGraph 就会调用
decide_next(state), - 根据其返回值(如
"pass")决定下一步跳转到"accept"节点。
中断机制 与 条件边函数 的执行顺序
结论:条件边函数会在中断生效前被调用
详细解释
1. __interrupt__ 的作用时机
在 LangGraph(特别是 v0.2+ 的 StateGraph + Command 模式)中:
- 当你在
update字典中包含"__interrupt__": [...]时,表示:在本次节点执行完成后、进入下一个节点之前,暂停图的执行。 - 但注意:"完成当前节点" ≠ "直接中断"。LangGraph 仍需知道"如果没中断,下一步该去哪",这样才能在恢复时知道从哪里继续。
因此,LangGraph 的执行流程如下:
text
[当前节点执行]
→ 返回 Command(update={..., "__interrupt__": ...})
→ 应用 state 更新
→ **计算下一跳(包括调用条件边函数)**
→ 发现 __interrupt__ 存在
→ **暂停执行,并记录"计划中的下一个节点"**
✅ 所以,条件边函数是在中断检查之前就被调用的,因为它是"确定下一跳"的必要步骤。
2. 为什么需要先算"下一跳"再中断?
LangGraph 的中断机制设计为 "可恢复的工作流" 。当中断发生后,外部系统(如用户)处理完中断事件(例如提供人工输入),会调用 .stream() 或 .invoke() 继续执行。
此时,LangGraph 必须知道:
- 中断前原本打算去哪个节点?
- 这个"原本打算去的节点"正是通过条件边(或普通边)计算出来的。
所以,即使要中断,也必须先走完路由逻辑(包括条件边),把"计划中的下一个节点"保存下来。
自此,本文分享到此结束!!!