当前位置: 首页 > article >正文

【LangGraph】六.多 Agent 协作:Subgraph 机制

写在前面前面的文章里我们学过流程控制顺序、并行、路由、循环。那都是单个图内的节点编排。但实际应用中我们经常需要多个独立的 Agent协作每个 Agent 有自己的职责分析、决策、执行每个 Agent 有自己的 State独立的数据结构多个 Agent 需要共享信息、协同工作这就是多 Agent 协作要解决的问题。多 Agent vs 多节点特性多节点多 Agent独立性节点共享 State每个 Agent 有独立的 State复用性节点难以复用Agent 可以独立复用复杂度适合简单流程适合复杂系统Subgraph 是实现多 Agent 协作的核心机制。这篇文章深入讲解 Subgraph 的工作原理和使用方法。一、为什么需要 Subgraph1.1 问题复杂系统的状态爆炸假设我们要构建一个代码审查系统质量分析 Agent安全分析 Agent性能分析 Agent报告生成 Agent如果所有 Agent 都在一个图里State 会是什么样# ❌ 问题State 字段爆炸 class State(TypedDict): code: str quality_analysis: str security_analysis: str performance_analysis: str quality_score: int security_score: int performance_score: int suggestions: list report: str # ... 还有更多中间字段问题State 字段越来越多难以维护不同 Agent 的字段混在一起职责不清想复用一个 Agent但 State 耦合太紧1.2 解决用 Subgraph 隔离上下文Subgraph 的核心价值每个子图有独立的 State父图和子图通过明确的接口通信。# 子图 1质量分析 class QualityState(TypedDict): code: str analysis: str score: int # 子图 2安全分析 class SecurityState(TypedDict): code: str analysis: str issues: list # 父图协调多个子图 class ParentState(TypedDict): code: str quality_result: dict # 子图的结果 security_result: dict final_report: str好处每个子图的 State 职责单一子图可以独立开发、测试、复用父图只关心结果不关心中间过程二、Subgraph 核心语法2.1 创建子图子图就是一个普通的 StateGraph可以独立编译和运行。from typing import TypedDict from langgraph.graph import StateGraph, START, END # 1. 定义子图的 State class SubState(TypedDict): input: str output: str # 2. 定义子图的节点 def process_node(state: SubState) - dict: result f处理{state[input]} return {output: result} # 3. 创建并编译子图 sub_graph StateGraph(SubState) sub_graph.add_node(process, process_node) sub_graph.set_entry_point(process) sub_graph.add_edge(process, END) sub_app sub_graph.compile()2.2 在父图中使用子图子图编译后可以作为节点添加到父图中。# 1. 定义父图的 State class ParentState(TypedDict): data: str result: str # 2. 定义父图的节点准备数据 def prepare_node(state: ParentState) - dict: # 将父图的数据转换为子图的输入 return {input: state[data]} # 3. 定义父图的节点处理结果 def finalize_node(state: ParentState) - dict: # 从子图的结果中提取需要的数据 return {result: state[output]} # 4. 创建父图 parent_graph StateGraph(ParentState) parent_graph.add_node(prepare, prepare_node) parent_graph.add_node(subgraph, sub_app) # 子图作为节点 parent_graph.add_node(finalize, finalize_node) # 5. 连接边 parent_graph.set_entry_point(prepare) parent_graph.add_edge(prepare, subgraph) parent_graph.add_edge(subgraph, finalize) parent_graph.add_edge(finalize, END) parent_app parent_graph.compile()2.3 关键问题状态如何传递子图的输入子图从父图的 State 中读取输入。具体来说子图执行时会读取父图 State 中与子图 State 字段匹配的部分这些字段会被传递给子图作为输入子图的输出子图执行完后输出会合并到父图的 State中子图返回的字段会添加到父图 State如果父图已有相同字段会被覆盖除非使用追加更新例子# 父图 State class ParentState(TypedDict): data: str output: str # 注意这个字段名与子图的输出字段相同 # 子图 State class SubState(TypedDict): input: str output: str # 子图节点 def process_node(state: SubState) - dict: return {output: f处理{state[input]}} # 执行流程 # 1. 父图执行 prepare_node设置 input 字段 # 2. 子图执行读取 input返回 output # 3. 子图的 output 合并到父图 State # 4. 父图执行 finalize_node读取 output四、高级用法4.1 子图嵌套子图可以嵌套父图包含子图子图包含孙图。# 孙图错误处理 error_app create_error_handler() # 子图质量分析包含错误处理 quality_graph StateGraph(QualityState) quality_graph.add_node(error_handler, error_app) quality_graph.add_node(analyze, analyze_quality) # ... # 父图审查系统包含质量分析子图 review_graph StateGraph(ReviewState) review_graph.add_node(quality, quality_app) # ...适用场景复杂系统分层设计。4.2 条件调用子图根据条件决定是否执行子图。def should_run_security(state: ReviewState) - str: # 如果代码包含敏感操作需要安全分析 if eval in state[code] or exec in state[code]: return security else: return skip_security review_graph.add_conditional_edges( quality, should_run_security, { security: security, skip_security: report, } )适用场景根据情况选择分析维度。4.3 循环调用子图迭代改进结果。def should_improve(state: ReviewState) - str: if state[quality_result][score] 80: return improve else: return done review_graph.add_conditional_edges( quality, should_improve, { improve: refactor, # 重构子图 done: security, } )适用场景多轮迭代改进。五、常见错误错误 1子图 State 设计不合理# ❌ 错误子图 State 包含父图专有字段 class SubState(TypedDict): code: str user_id: str # 这是父图的字段 session_token: str # 这也是父图的字段 # ✅ 正确子图 State 只包含需要的字段 class SubState(TypedDict): code: str analysis: str score: int错误 2忘记子图需要独立编译# ❌ 错误 parent_graph.add_node(subgraph, sub_graph) # 直接添加未编译的图 # ✅ 正确 sub_app sub_graph.compile() # 先编译 parent_graph.add_node(subgraph, sub_app) # 再添加错误 3状态字段名不匹配# 父图 State class ParentState(TypedDict): code: str result: dict # 子图 State class SubState(TypedDict): input: str # ❌ 父图没有 input 字段 output: str # ✅ 正确字段名匹配 class ParentState(TypedDict): input: str # 父图有这个字段 output: dict class SubState(TypedDict): input: str output: str小结为什么需要 Subgraph隔离不同 Agent 的 State提高代码复用性简化复杂系统设计核心语法创建子图定义 State、节点、编译添加到父图parent_graph.add_node(name, sub_app)状态传递字段名匹配自动传递设计原则每个子图职责单一子图 State 只包含必要字段父图协调流程不关心具体逻辑高级用法子图嵌套分层设计条件调用根据情况选择循环调用迭代改进

相关文章:

【LangGraph】六.多 Agent 协作:Subgraph 机制

写在前面前面的文章里,我们学过流程控制:顺序、并行、路由、循环。那都是单个图内的节点编排。但实际应用中,我们经常需要多个独立的 Agent协作:每个 Agent 有自己的职责(分析、决策、执行)每个 Agent 有自…...

告别书荒!手把手教你用Gitee/GitHub为香色闺阁、阅读App打造私人书源库

从零构建私人书源库:Gitee/GitHub高阶玩法全解析 每次打开阅读软件却发现书架空空如也?市面上的公共书源不是失效就是内容单一。其实,GitHub和Gitee上藏着数以千计的优质书源项目,只是大多数人不知道如何有效利用。本文将带你深入…...

3步掌握跨平台模组下载的完整方案

3步掌握跨平台模组下载的完整方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台的游戏无法使用Steam创意工坊模组而烦恼吗?WorkshopDL正…...

Qt开发避坑指南:QTabWidget样式设置那些“坑”与高效解决方案(附完整QSS代码)

Qt样式表实战:QTabWidget高级定制与避坑手册 第一次用QSS给QTabWidget做样式定制时,我对着那个歪歪扭扭的标签栏发呆了半小时——明明照着官方文档写的样式表,为什么文字方向不对?为什么边框去不掉?为什么选中状态时灵…...

视觉推理链合成技术:从认知图谱到多模态问题生成

1. 项目背景与核心价值视觉问题与推理链的合成技术正在成为计算机视觉与人工智能交叉领域的研究热点。这个方向主要解决传统视觉问答系统缺乏复杂推理能力的问题——现有的视觉问答数据集大多停留在简单的事实性问答层面,而人类在实际场景中往往需要进行多步逻辑推理…...

基于Cloudflare Workers与OpenAI API构建智能Telegram机器人

1. 项目概述:一个部署在Cloudflare Workers上的智能Telegram机器人 如果你和我一样,既想体验ChatGPT的便利,又希望有一个私密、可控且成本极低的对话入口,那么 tbxark/ChatGPT-Telegram-Workers 这个项目绝对值得你花时间研究。…...

Java调试自动重连:解决热重启中断调试会话的VS Code扩展

1. 项目概述与核心痛点如果你是一名Java开发者,并且习惯在VS Code里用Spring Boot DevTools或者Micronaut的mn:run这类热重启模式进行开发,那你一定对下面这个场景深恶痛绝:你正全神贯注地调试一个复杂的业务逻辑,在某个关键方法上…...

XHS-Downloader:小红书无水印作品下载与内容管理解决方案

XHS-Downloader:小红书无水印作品下载与内容管理解决方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&…...

保姆级教程:用Rufus制作Win10安装U盘,从下载镜像到BIOS设置一步不落

零基础实战:用Rufus打造Win10安装U盘的终极指南 当电脑运行缓慢或系统崩溃时,重装Windows 10往往是最高效的解决方案。但对于大多数非技术用户来说,从下载系统镜像到正确配置BIOS的整个过程充满了技术术语和潜在陷阱。本文将彻底拆解这个流程…...

Llama3.1的工具调用和Llama4的MoE架构实战:新特性如何改变你的开发流程?

Llama3.1工具调用与Llama4 MoE架构实战:解锁下一代AI开发范式 当Meta在2024年春季推出Llama3系列时,开发者社区已经为这个开源模型的进化速度感到震惊。但真正的变革才刚刚开始——随着Llama3.1的工具调用能力和Llama4的MoE架构相继亮相,我们…...

九联UNT400G1盒子免拆机刷机保姆级教程:用ADB和U盘救活你的老电视盒子

九联UNT400G1盒子免拆机刷机全攻略:从卡顿到流畅的终极解决方案 你是否还在为家中那台九联UNT400G1电视盒子卡顿、无法安装应用而烦恼?每次打开应用都要等待漫长的加载时间,想安装新的视频平台却总是提示"禁止安装未知来源应用"&a…...

23_《智能体微服务架构企业级实战教程》高德地图FastMCP服务之工具注册与执行

前言 配套视频教程: 👉《智能体微服务架构企业级实战教程》共72节 更多文章专栏内容: 👉《智能体微服务架构企业级实战教程》专栏 本文介绍了高德地图FastMCP服务的工具注册、客户端调用与集成测试。在server.py中,通过@mcp.tool()装饰器将route_plan和search_nearby…...

如何高效清理Windows驱动存储:DriverStore Explorer终极指南

如何高效清理Windows驱动存储:DriverStore Explorer终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间越来越小?是否经历过设…...

C/C++新手必看:解决‘uint32_t’未定义错误的三种方法(含stdint.h详解)

C/C开发中的类型安全基石:深入解析uint32_t与标准整数类型体系 刚接触C/C的开发者经常会遇到一个看似简单却令人困惑的编译错误——"unknown type name uint32_t"。这不仅仅是一个头文件缺失的问题,背后反映的是C/C类型系统设计哲学和跨平台开…...

从Tomcat 10启动报错看Servlet演进:注解配置 vs web.xml,你该如何选择与避坑?

从Tomcat 10启动报错看Servlet演进:注解配置 vs web.xml,你该如何选择与避坑? 在Java Web开发领域,Servlet作为最基础的组件技术,其配置方式经历了从传统的web.xml到现代注解驱动的演进。这种转变看似简化了开发流程&a…...

星穹铁道自动化终极指南:三月七小助手如何5分钟解放你的游戏时间

星穹铁道自动化终极指南:三月七小助手如何5分钟解放你的游戏时间 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《崩坏&#x…...

具身智能论文问答(三):Open VLA

第一层:核心直觉 (TL;DR - 宏观视角)核心痛点: 尽管像 RT-2 这样的视觉-语言-动作模型(VLA)展现出了惊人的泛化能力,但它们大多是闭源的,普通研究者难以访问 。同时,以前的开源通才策略&#xf…...

终极罗技鼠标宏配置指南:3步实现绝地求生零后坐力压枪

终极罗技鼠标宏配置指南:3步实现绝地求生零后坐力压枪 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中的武器后坐力…...

毕业季不焦虑:用百考通AI搞定论文查重与AIGC检测,高效通关秘籍

又到一年毕业季,论文写作进入最后冲刺阶段,不少同学在熬夜码字之后,又迎来了两座“大山”——论文查重和AIGC(AI生成内容)检测。辛辛苦苦写出来的论文,很可能因为重复率过高或AI使用痕迹过重而被卡住&#…...

你的网盘下载还在龟速吗?这个开源工具帮你三分钟搞定全速下载

你的网盘下载还在龟速吗?这个开源工具帮你三分钟搞定全速下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...

如何3步搞定华硕笔记本性能优化:G-Helper完整调优指南

如何3步搞定华硕笔记本性能优化:G-Helper完整调优指南 【免费下载链接】g-helper G-Helper is a fast, native tool for tuning performance, fans, GPU, battery, and RGB on any Asus laptop or handheld - ROG Zephyrus, Flow, Strix, TUF, Vivobook, Zenbook, P…...

MAA明日方舟助手:终极自动化解放你的游戏时间

MAA明日方舟助手:终极自动化解放你的游戏时间 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.com…...

5步精通REFramework:打造你的RE引擎游戏Mod开发利器

5步精通REFramework:打造你的RE引擎游戏Mod开发利器 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 在当今游戏Mod开发领域&#xf…...

CF1458C 题解

以后可能随机发一点小题解,不再执着于完美整理一整份大题解了。 1. 状态表示 先把所有量转成 0∼n−10 \sim n-10∼n−1(行、列、值都减一),并在模 nnn 意义下计算。 对一个元素,用四维向量表示: X(i, j, t…...

3步掌握:Nucleus Co-Op本地分屏游戏终极方案

3步掌握:Nucleus Co-Op本地分屏游戏终极方案 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为喜欢的游戏不支持本地多人联机而烦恼…...

保姆级教程:用Vector CANoe的LIN Slave Conformance Tester搞定一致性测试

从零到精通的LIN节点一致性测试实战指南 当你第一次接手LIN节点测试任务时,面对Vector CANoe那复杂的界面和专业术语,是不是感觉无从下手?别担心,这份指南将带你一步步掌握LIN Slave Conformance Tester模块的使用技巧。不同于市…...

MTKClient终极指南:解锁联发科设备的底层控制权

MTKClient终极指南:解锁联发科设备的底层控制权 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient是一款革命性的开源工具,专为联发科芯片设备提供深度底层操…...

绝区零一条龙:智能自动化助手让你的游戏时间效率提升300%

绝区零一条龙:智能自动化助手让你的游戏时间效率提升300% 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 你是否…...

避坑指南:YOLOv5换MobileNetV3主干时,concat层和特征图对齐的那些坑我都帮你踩过了

YOLOv5主干网络替换实战:MobileNetV3特征图对齐与concat层避坑指南 当你决定用MobileNetV3替换YOLOv5的主干网络时,本以为能轻松获得轻量化的优势,却在特征图拼接环节遭遇各种维度错误。这不是简单的模块替换问题,而是需要深入理解…...

CloddsBot:基于Python的云存储自动化机器人框架设计与实践

1. 项目概述与核心价值最近在折腾一些自动化流程,发现很多重复性的文件上传、下载、同步任务,如果手动操作不仅耗时,还容易出错。尤其是在处理一些跨平台、跨存储服务的文件时,比如从本地传到云端,或者从一个网盘搬到另…...