新闻详情

新闻详情

首页 / 资讯中心 / 详情

LangGraph控制流:条件边、循环与并行(二)

发布时间:2026/10/1 7:10:54来源:尧图网络
LangGraph控制流:条件边、循环与并行(二)
上篇文章中介绍的图是“一条直线走到底”但真实业务往往需要分支、循环和并行。这一篇涵盖了 LangGraph 怎么实现这三种控制流。一、条件边让图学会“分岔”固定边只能走一条路但很多场景需要根据数据决定下一步用户意图是“退款”还是“咨询”走不同分支工具调用成功还是失败走不同处理内容审核通过还是拒绝走不同出口2. 基本用法条件边由三部分组成源节点 路由函数 映射表。from langgraph.graph import StateGraph, START, END def router(state) - str: 路由函数读取 state返回一个字符串 if state[score] 60: return pass else: return fail builder.add_conditional_edges( check_node, # 从哪个节点出发 router, # 用哪个函数决定去向 { pass: pass_node, # 返回值 → 真实节点 fail: fail_node } )3. 执行流程4. 简化写法如果路由函数直接返回真实节点名映射表可以省略def router(state): return pass_node if state[score] 60 else fail_node builder.add_conditional_edges(check_node, router)5. 路由函数可以返回列表并行分发如果返回的是节点名列表LangGraph 会并行执行这些节点def router(state): return [branch_a, branch_b] # 两个分支并行执行6. 路由函数可以返回 ENDdef router(state): if state[done]: return END # 直接结束 return continue_node二、循环让图“转起来”LangGraph 的图是允许循环的这是它比普通工作流引擎强大的地方。1. 最简单的循环节点连回自己builder.add_node(agent, agent_node) builder.add_edge(agent, agent) # 自己连自己但这样会无限循环必须配合条件边来终止。2. 用条件边实现循环最经典的 Agent 循环模式def should_continue(state) - str: 判断是否继续循环 messages state[messages] last_message messages[-1] # 如果还有工具调用继续 if last_message.tool_calls: return continue # 否则结束 return end builder.add_node(agent, agent_node) builder.add_node(tools, tool_node) builder.add_edge(START, agent) builder.add_conditional_edges( agent, should_continue, { continue: tools, # 有工具调用 → 去执行工具 end: END # 没有 → 结束 } ) builder.add_edge(tools, agent) # 工具执行完 → 回到 agent3. 循环流程图这个循环就是 ReAct 模式的核心Agent 思考 → 调用工具 → 观察结果 → 继续思考直到不再需要工具。4. 防止死循环LangGraph 提供了recursion_limit参数来限制最大迭代次数graph.invoke( {messages: []}, config{recursion_limit: 25} # 最多执行 25 步 )超过限制会抛出GraphRecursionError。三、并行让图“分头行动”1. 静态并行多个边指向多个节点最直接的方式从一个节点出发连多条边到不同节点。builder.add_edge(start_node, branch_a) builder.add_edge(start_node, branch_b) builder.add_edge(start_node, branch_c)三个分支会并行执行都完成后才进入merge_node。2. 用 Send 实现动态并行Map-Reduce静态并行需要提前知道有几个分支。如果分支数量是动态的就要用Send。from langgraph.types import Send def dispatch(state): 根据状态动态生成子任务 return [ Send(process_item, {item: item}) for item in state[items] ] builder.add_conditional_edges(split_node, dispatch, [process_item])执行流程3. Send 与普通边的区别特性普通边Send分支数量固定动态子任务状态共享全局 State每个子任务独立 State典型场景固定多分支Map-Reduce4. 并行分支的结果合并多个分支同时更新 State 时必须用 reducer 避免冲突class MyState(TypedDict): results: Annotated[list, add] # 多个分支的返回会追加到同一个列表如果不用add后执行的分支会覆盖先执行的结果。四、三种控制流的组合真实业务往往是三者组合使用条件边意图识别分流并行多个子任务同时处理循环结果不满意时回到起点重试注意坑点说明解决死循环循环没有终止条件设置recursion_limit并行覆盖多个分支同时写同一个字段用Annotated reducer条件边不生效路由函数返回值与映射表不匹配检查返回值是否在映射表中Send 子任务丢失上下文Send 只传 state不继承 runtime在 state 中显式复制所需字段
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

滴滴大模型二面:位置编码 sin/cos、RoPE、ALiBi 到底差在哪?TaoToken 配置实战拆解 2026/10/1 14:50:02

滴滴大模型二面:位置编码 sin/cos、RoPE、ALiBi 到底差在哪?TaoToken 配置实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI改写开题报告实操指南:9大智能工具实测与提示词技巧 2026/10/1 14:50:02

AI改写开题报告实操指南:9大智能工具实测与提示词技巧

做毕业论文那阵子,我最大的感受就是:开题报告是个“看起来容易、写起来要命”的东西。模板就在那儿摆着,研究方向也定得七七八八,可真要动笔写“选题背景”“国内外研究现状”“研究内容与方法”这些部分时,脑子里还是…

阅读更多 →
深度学习增强的数据级多源融合定位:应对RTK信号退化 2026/10/1 14:50:02

深度学习增强的数据级多源融合定位:应对RTK信号退化

简介:一份面向定位算法、信号处理与深度学习交叉领域研究者的学术文献,聚焦解决不同定位体制下多系统协同定位能力不足的问题。其中提出基于深度学习的数据级多源融合定位增强方法,以空间关联行为更丰富的二阶特征矩阵作为网络输入&#xff0…

阅读更多 →
LeetCode 206反转链表:迭代与递归的面试实战解析 2026/10/1 14:50:02

LeetCode 206反转链表:迭代与递归的面试实战解析

“这道题我昨晚刚背完,今天一紧张还是写错了”——这是我在几次模拟面试里真实见过的反转链表翻车现场。 你搜“算法面试必刷”时,206. 反转链表绝对是被列在榜首的那一档。它是LeetCode上入门级的链表题,却成了无数人挂在面试第一轮的高频题…

阅读更多 →
epoll高并发网络编程详解:从原理到实战 2026/10/1 14:49:55

epoll高并发网络编程详解:从原理到实战

1. 为什么是 epoll 1.1 从一次“十万连接”说起 先讲个我早期的经历。刚接触 Linux 网络编程那会儿,我以为高并发就是把线程开得足够多,一台机器开上几千个线程,总该能扛住压力了吧?结果一压测,机器直接卡死&#xff…

阅读更多 →
Python蘑菇识别系统源码实战:CNN图像分类从环境搭建到模型部署 2026/10/1 14:49:55

Python蘑菇识别系统源码实战:CNN图像分类从环境搭建到模型部署

简介:这份Python蘑菇识别系统源码面向图像识别入门者、机器学习学习者及食品安全相关开发者,提供一套可运行的蘑菇种类自动识别项目,帮助理解从图像预处理到模型部署的完整流程。压缩包共54个文件,以23个png图片、20个pyc缓存、9个…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉