【langgraph 从入门到精通graphApi 篇】Subgraph 与多 Agent 系统
第 9 章Subgraph 与多 Agent 系统文章目录第 9 章Subgraph 与多 Agent 系统9.1 本章目标9.2 核心概念子图是什么两种集成方式Supervisor 多 Agent 架构子图持久化模式9.3 实战实战 1子图作为节点共享 State实战 2Supervisor 多 Agent 系统9.4 API 速查9.5 错误与避坑指南坑 1子图 State 和父图 State 不匹配坑 2Supervisor 无限循环坑 3多 Agent 共享 State 时 key 冲突9.6 最佳实践总结9.1 本章目标学完本章你将能够理解子图的两种集成方式节点内调用 vs 作为节点掌握 Supervisor 多 Agent 模式学会 Agent 间 State 共享和隔离能够设计多 Agent 协作系统9.2 核心概念子图是什么子图Subgraph是一个编译好的图可以嵌入到另一个图中。它让复杂的 Agent 系统可以拆分为多个独立的、可复用的子模块。两种集成方式方式适用场景State 要求方法节点内调用子图父图和子图 State Schema 不同需要手动转换在节点函数中subgraph.invoke(...)子图作为节点父图和子图共享 State keys直接兼容builder.add_node(name, compiled_subgraph)Supervisor 多 Agent 架构需要搜索需要计算需要编程完成STARTSupervisor任务分派搜索 Agent搜索知识库计算 Agent数学计算编程 Agent代码生成END子图持久化模式模式行为使用场景Per-invocation默认每次调用重新开始继承父 checkpointer无状态子任务Per-thread状态跨调用累积子图有自己的 thread有状态的子 AgentStateless无 checkpoint纯函数调用纯计算任务9.3 实战实战 1子图作为节点共享 StatefromtypingimportTypedDict,Annotatedimportoperatorfromlanggraph.graphimportStateGraph,START,END# # 定义共享 State父图和子图使用相同的 key# classSharedState(TypedDict):data:Annotated[list[str],operator.add]# # 子图 A数据清洗# defclean_data(state:SharedState)-dict:return{data:[[子图A] 数据已清洗]}sub_a_builderStateGraph(SharedState)sub_a_builder.add_node(clean,clean_data)sub_a_builder.add_edge(START,clean)sub_a_builder.add_edge(clean,END)sub_graph_asub_a_builder.compile()# # 子图 B数据分析# defanalyze_data(state:SharedState)-dict:return{data:[[子图B] 数据已分析]}sub_b_builderStateGraph(SharedState)sub_b_builder.add_node(analyze,analyze_data)sub_b_builder.add_edge(START,analyze)sub_b_builder.add_edge(analyze,END)sub_graph_bsub_b_builder.compile()# # 父图编排子图# deffinal_summary(state:SharedState)-dict:all_data, .join(state.get(data,[]))return{data:[f[父图] 汇总:{all_data}]}parent_builderStateGraph(SharedState)parent_builder.add_node(step_clean,sub_graph_a)parent_builder.add_node(step_analyze,sub_graph_b)parent_builder.add_node(summary,final_summary)parent_builder.add_edge(START,step_clean)parent_builder.add_edge(step_clean,step_analyze)parent_builder.add_edge(step_analyze,summary)parent_builder.add_edge(summary,END)parent_graphparent_builder.compile()resultparent_graph.invoke({data:[]})print(处理结果:)fordinresult[data]:print(f{d})实战 2Supervisor 多 Agent 系统fromtypingimportTypedDict,Annotated,Literalfromlanggraph.graphimportStateGraph,START,END,add_messagesfromlangchain_core.messagesimportBaseMessage,HumanMessage,AIMessageclassSupervisorState(TypedDict):messages:Annotated[list[BaseMessage],add_messages]next_agent:strdefsearch_expert(state:SupervisorState)-dict:last_msgstate[messages][-1]return{messages:[AIMessage(contentf[搜索专家] 关于「{last_msg.content}」找到以下信息...,namesearch_expert)],}defmath_expert(state:SupervisorState)-dict:return{messages:[AIMessage(content[数学专家] 计算结果42,namemath_expert)],}defgeneral_expert(state:SupervisorState)-dict:return{messages:[AIMessage(content[通用专家] 这是对您问题的回答...,namegeneral_expert)],}defsupervisor(state:SupervisorState)-dict:last_msgstate[messages][-1].contentif搜索inlast_msgor查找inlast_msg:return{next_agent:search}elif计算inlast_msgorinlast_msg:return{next_agent:math}elif再见inlast_msgor结束inlast_msg:return{next_agent:END}else:return{next_agent:general}defsupervisor_route(state:SupervisorState)-Literal[search,math,general,END]:agentstate[next_agent]ifagentEND:returnENDreturnagent builderStateGraph(SupervisorState)builder.add_node(supervisor,supervisor)builder.add_node(search,search_expert)builder.add_node(math,math_expert)builder.add_node(general,general_expert)builder.add_edge(START,supervisor)builder.add_conditional_edges(supervisor,supervisor_route,{search:search,math:math,general:general,END:END,})builder.add_edge(search,supervisor)builder.add_edge(math,supervisor)builder.add_edge(general,supervisor)graphbuilder.compile()# 测试resultgraph.invoke({messages:[HumanMessage(content搜索 LangGraph 教程)],next_agent:,})formsginresult[messages]:ifhasattr(msg,name)andmsg.name:print(f [{msg.name}]{msg.content})9.4 API 速查API完整签名入参说明返回值说明add_node(name, subgraph)add_node(name: str, subgraph: CompiledGraph)name: 节点名;subgraph: 编译后的子图Self子图作为节点subgraph.invoke(input, config)invoke(input, config)input: 子图输入;config: 配置子图输出节点内调用子图Command(graphCommand.PARENT)Command(graph: str)graph: 目标图Command子图控制父图流程compile(checkpointer模式)compile(checkpointer)None(默认)/True(Per-thread)/False(Stateless)CompiledGraph控制子图持久化9.5 错误与避坑指南坑 1子图 State 和父图 State 不匹配# ❌ 错误父图 State 有 query子图 State 有 search_queryclassParentState(TypedDict):query:strclassSubState(TypedDict):search_query:str# 字段名不同# ✅ 正确节点内调用时做转换defcall_subgraph(state:ParentState)-dict:resultsubgraph.invoke({search_query:state[query]})return{query:result[search_query]}坑 2Supervisor 无限循环# ❌ 错误没有退出条件defsupervisor(state:State)-dict:return{next_agent:search}# 始终返回 search → 无限循环# ✅ 正确设置退出条件defsupervisor(state:State)-dict:ifstate.get(iteration,0)5:return{next_agent:END}if搜索instate[messages][-1].content:return{next_agent:search,iteration:state.get(iteration,0)1}return{next_agent:END}坑 3多 Agent 共享 State 时 key 冲突# ❌ 错误多个 Agent 共用 result 字段classState(TypedDict):result:str# Agent A 和 Agent B 都写这个字段互相覆盖# ✅ 正确使用不同前缀或 ReducerclassState(TypedDict):search_result:strmath_result:strresults:Annotated[list[str],operator.add]# 累加9.6 最佳实践总结简单分层用子图作为节点复杂转换用节点内调用按 State 兼容性选择Supervisor 模式适合任务明确、分工清晰的场景一个主管 多个专家子图应独立可测试不依赖父图的具体实现可以单独 invoke多 Agent 系统先设计通信协议再实现定义好 State 结构和消息格式设置最大调度次数防止无限循环Supervisor 路由中必须包含退出条件

相关新闻

厄瓜多尔外贸骗局套路汇总,出口商必看

厄瓜多尔外贸骗局套路汇总,出口商必看

厄瓜多尔外贸场景复杂,各类贸易骗局频发,多集中在货款支付、货物样品、结算及合同身份等领域。本文梳理常见骗局套路,结合实操经验给出落地防范建议,助力外贸企业规避风险。一、货款与支付诈骗这是厄瓜多尔外贸中最常见、翻车率最…

2026/7/21 22:01:40阅读更多 →
买奢石生产厂家

买奢石生产厂家

在高端装修项目中,奢石因其独特的纹理和稀缺性备受青睐。然而,采购奢石时,客户常面临“色差大、加工精度低、售后无保障”等风险——这些问题的根源往往在于厂家的人才水平参差不齐。如何从源头避开这些坑?本文通过对比行业主流奢…

2026/7/20 15:25:28阅读更多 →
KoboldCpp终极指南:一键部署本地AI模型的完整解决方案

KoboldCpp终极指南:一键部署本地AI模型的完整解决方案

KoboldCpp终极指南:一键部署本地AI模型的完整解决方案 【免费下载链接】koboldcpp Run GGUF models easily with a KoboldAI UI. One File. Zero Install. 项目地址: https://gitcode.com/gh_mirrors/ko/koboldcpp 想要在本地轻松运行各种AI模型却苦于复杂的…

2026/7/21 17:15:11阅读更多 →
数据科学协作实战指南:从需求对齐到价值闭环

数据科学协作实战指南:从需求对齐到价值闭环

1. 为什么说“协作是数据科学的生命线”——从单打独斗到团队作战的真实转变 “Teamwork is Essential in Data Science”这句话听起来像一句职场口号,但在我带过12个跨职能数据项目、亲手拆解过87份失败模型复盘报告、参与过从电商推荐系统到医疗影像辅助诊断等6类…

2026/7/21 22:00:33阅读更多 →
Playwright自动化测试实战指南:从静态页面到动态应用的完整解决方案

Playwright自动化测试实战指南:从静态页面到动态应用的完整解决方案

Playwright自动化测试实战指南:从静态页面到动态应用的完整解决方案 【免费下载链接】awesome-codex-skills A curated list of practical Codex skills for automating workflows across the Codex CLI and API. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/21 22:00:33阅读更多 →
4个关键步骤彻底解决yuzu模拟器中文乱码问题:完整解决方案指南

4个关键步骤彻底解决yuzu模拟器中文乱码问题:完整解决方案指南

4个关键步骤彻底解决yuzu模拟器中文乱码问题:完整解决方案指南 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 还在为yuzu模拟器中文字体显示为方块或乱码而烦恼吗?作为Nintendo Switch最优…

2026/7/21 22:00:33阅读更多 →
Ksnip:一站式跨平台截图与标注解决方案,提升你的工作效率

Ksnip:一站式跨平台截图与标注解决方案,提升你的工作效率

Ksnip:一站式跨平台截图与标注解决方案,提升你的工作效率 【免费下载链接】ksnip ksnip the cross-platform screenshot and annotation tool 项目地址: https://gitcode.com/gh_mirrors/ks/ksnip 在数字工作时代,截图工具已经成为日常…

2026/7/21 22:00:33阅读更多 →
(二十五)「JVS-Rules规则引擎 V2.5」— 决策流节点

(二十五)「JVS-Rules规则引擎 V2.5」— 决策流节点

核心概念决策流节点是规则引擎中构成决策流程的基本单元。它具备快速引用其他决策流、可视化编排以降低技术门槛、灵活控制结果以适应多变业务场景的核心功能。通过拖入并连接节点、配置引用决策流、按需新增或引入变量并处理入参(支持录入、节点、入参、变量四种传…

2026/7/21 22:00:33阅读更多 →
深入解析TI嵌入式控制模块寄存器:USB、MAC与电源管理实战

深入解析TI嵌入式控制模块寄存器:USB、MAC与电源管理实战

1. 控制模块寄存器:嵌入式开发的“硬件开关”在嵌入式系统开发的世界里,我们写的每一行C代码、每一个驱动函数,最终都要落到实实在在的硬件上才能跑起来。这个“落下去”的过程,很大程度上就是通过读写一系列被称为“控制模块寄存…

2026/7/21 21:58:33阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →