控制流与节点执行

静态分支:

并行分支(边):多个节点同时进行

  • 如果两个节点写入同一个状态字段,则该字段通常需要配置合适的 Reducer,否则可能出现状态更新冲突,抛出 InvalidUpdateError 异常

builder.add_edge(START, "node_a")
builder.add_edge(START, "node_b")

条件边:

def add_conditional_edges(
self,
source: str,
path: Callable[..., Hashable | Sequence[Hashable]]
| Callable[..., Awaitable[Hashable | Sequence[Hashable]]]
| Runnable[Any, Hashable | Sequence[Hashable]],
path_map: dict[Hashable, str] | list[str] | None = None,
) -> Self:

不考虑 self,核心参数有三个:

  • source:条件分支的起始节点;
  • path:路由规则,是一个可执行对象,通常是函数
  • path_map:路由规则的返回值到真实节点名之间的映射关系。

其中,path 的返回值表示跳转的目标节点,可以是:

  • 字符串或特殊对象 END 表示的单个目标;
  • 字符串或特殊对象 END 表示的多个目标组成的序列;

不加path_map的话path就直接用图里的节点名称

使用:

builder.add_conditional_edges(

START,

router,

path_map={ "node_a": "node_a", "node_b": "node_b", "node_c": "node_c", }

 

再添加节点时在参数里写上defer=True 适合“最后执行”的收尾节点,用于日志记录这些

 

 

动态分支(运行时决定执行目标):

 

条件分支command:

 

CommandLangGraph 中用于控制图执行的多功能原语,它的构造器可以接受四个参数,并记录在同名类属性中:

 

  • update:更新图状态,效果等同于节点直接返回状态更新字典;
  • goto:指定节点执行完成后的跳转目标,可用于运行时条件分支。当需要同时更新状态并控制跳转时,比单独使用条件边更合适;
  • graph:存在子图时,用于指定跳转发生在哪一层图中,例如从子图跳转到父图;
  • resume:用于恢复被中断的图执行,常见于 human-in-the-loop 场景。

 

 

例如,一个节点既要更新状态,又要根据当前状态决定下一步跳转目标,就可以返回:

 

 

 

 

return Command(
update={"foo": "bar"},
goto="next_node"
)

 

动态分支有两类典型应用场景:

场景典型 API说明
动态扇出 Send + add_conditional_edges() 运行时创建多个任务,常用于 Map-Reduce
动态跳转 Command(goto=...) 节点内部根据状态决定跳转目标

 

 

二者的区别如下:

  • Send 更强调“一个节点动态分发多个任务实例”;
  • Command(goto=...) 更强调“当前节点执行完后动态跳转到哪个节点”。

Send 解决的是:运行时要启动多少个任务实例。Command(goto=...) 解决的是:当前节点执行完后要去哪里。

不过,无论是 Send 还是 Command(goto=...),目标节点通常都需要提前注册到图中。所谓“动态”,主要是运行时动态决定任务数量、任务输入或跳转路径,而不是运行时临时创建新的节点。

多分支汇入:

当多个上游分支同时汇入同一个下游节点时,根据触发条件的不同,可以分成两种情况:

  • “与”触发:上游所有分支全部到达才可触发下游节点
  • “或”触发:任意一个分支到达,都可以触发下游节点

 

 

与(同时触发):

builder.add_edge(["node_c", "node_d"], "node_e")

或(单独触发):

builder.add_edge("node_c", "node_e")
builder.add_edge("node_d", "node_e")

 

 

循环结构:

image

 

节点容错:

LangGraph 提供了三种异常处理机制

  • retries:重试机制。节点执行失败时,根据重试策略自动重新执行。
  • Timeouts:超时控制。限制单次节点执行的最大等待时间。
  • Error Handling:错误处理。重试次数耗尽后,执行特定的异常处理逻辑。

builder.add_node( "node_a", node_a,

retry_policy=RetryPolicy( max_attempts=3, jitter=False ) )

构建节点时添加重试策略

 

超时:

 

 

posted @ 2026-08-19 18:24  jokercheems  阅读(13)  评论(0)    收藏  举报