流程控制与路由
掌握 LangGraph 的核心路由能力:条件分支、循环与并行执行
📚 学习目标
学完这篇文章后,你将能够:
- 使用 Conditional Edges 实现条件分支
- 构建 Loop(循环)工作流
- 实现 Parallel(并行)执行模式
- 理解 LangGraph 的四种核心流程模式
前置知识
在开始学习之前,建议先阅读:
1️⃣ 超越线性流程
目前为止,我们的图都是一条直线。但现实世界的业务逻辑往往更复杂:
- "如果是 VIP 用户,走高级通道;否则走普通通道。"(分支)
- "如果生成的代码有 Bug,重写一遍。"(循环)
- "同时搜索 Google 和 Bing,然后合并结果。"(并行)
LangGraph 提供了强大的工具来支持这些模式。
2️⃣ 分支流程 (Branching)
我们使用 addConditionalEdges 来实现根据条件选择路径。
语法结构
graph.addConditionalEdges(
'sourceNode', // 1. 从哪个节点出发
shouldContinue, // 2. 路由函数:决定去哪里
{ // 3. 映射表(可选,TypeScript下推荐提供以获得类型提示)
'routeA': 'nodeA',
'routeB': 'nodeB',
'end': END
}
)路由函数示例
const shouldContinue = (state: typeof StateAnnotation.State) => {
// 根据状态中的 input 判断
if (state.input.includes("B")) {
return 'nodeB'; // 返回目标节点的名称
} else if (state.input.includes("C")) {
return 'nodeC';
}
return END; // 或者直接结束
}3️⃣ 循环流程 (Loops)
循环本质上就是一种特殊的条件分支:一条指向上游节点或自身的边。
为了防止无限循环,我们通常需要在状态中维护一个计数器。
// 1. 状态中增加计数器
const StateAnnotation = Annotation.Root({
loopCount: Annotation<number>({
reducer: (a, b) => a + b,
default: () => 0
}),
// ...
})
// 2. 节点逻辑:每次执行增加计数
const processingNode = (state) => {
return { loopCount: 1, ... };
}
// 3. 路由逻辑
const checkLoop = (state) => {
if (state.loopCount < 3) {
return 'processingNode'; // 继续循环
}
return END; // 退出循环
}
// 4. 构建循环
graph.addConditionalEdges('processingNode', checkLoop);4️⃣ 并行流程 (Parallel Execution)
并行执行是通过让多条边从同一个节点出发来实现的。LangGraph 会自动等待所有并行分支完成后,再进入汇聚节点。
const graph = new StateGraph(StateAnnotation)
.addNode('nodeE', nodeE)
.addNode('nodeF', nodeF)
.addNode('nodeH', nodeH) // 汇聚节点
// 并行分支:START 同时指向 E 和 F
.addEdge(START, 'nodeE')
.addEdge(START, 'nodeF')
// 汇聚:E 和 F 都指向 H
.addEdge('nodeE', 'nodeH')
.addEdge('nodeF', 'nodeH')
.addEdge('nodeH', END)注意:对于并行节点产生的状态更新,通常需要使用追加模式(如数组 Reducer)的字段,以避免并发写冲突(Race Conditions)。
💡 练习题
- 场景题:设计一个“文章润色”工作流。如果文章超过 1000 字,将其切分为两部分并行处理,然后再合并;如果少于 1000 字,直接处理。你会用到哪些流程模式?
- 参考答案:分支(判断字数) + 并行(处理长文) + 线性(处理短文)。
📚 参考资源
项目代码
- 查看本节完整代码:quick-start/4.edges.ts
✅ 总结
核心要点:
- addConditionalEdges 是实现动态流的关键。
- 循环是构建自我修正(Self-Correction)Agent 的基础。
- 并行执行可以显著提高复杂任务的效率。
- 所有的复杂图都是由这些基本模式(线性、分支、循环、并行)组合而成的。
下一步:在下一篇文章《流式输出》中,我们将学习如何实时获取图的执行状态,这对于提升用户体验至关重要。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。