十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

企业级 MultiAgent 落地实战:Plan 模式与主子 Agent 协作架构全解析

企业级 MultiAgent 落地实战:Plan 模式与主子 Agent 协作架构全解析 做企业级 MultiAgent 落地这事我最开始是拒绝的。不是因为技术难而是当时团队连单 Agent 都没完全调明白Token 成本压不下去输出还不稳定动不动就在长链路任务里“迷路”。后来被逼着上了一套包含 Plan 模式和主子 Agent 协作的架构才慢慢把这事从 demo 阶段拖进了生产环境。这篇文章就把我们方案选型、任务拆解、Agent 协作机制、稳定性治理这些核心环节全部摊开讲包括当时踩过的坑和现在还在用的排查手段。如果你是做 Agent 应用落地的工程师或者正准备把 MultiAgent 从玩具变成生产力工具这篇文章能把一些关键思路直接给你抄。1. 为什么企业级场景必须上 MultiAgent而不是一个 Agent 硬撑先交代一下背景。我们面对的并不是“让 AI 写一段文案”这种单点任务而是一套需要跨系统操作、多次决策、前后有依赖关系的长链路业务比如自动化巡检、内容生产审批流、供应链异常处理等等。早期用单 Agent 硬写 ReAct 模式效果很不稳定。1.1 单 Agent 在长链路任务里的三个致命伤第一个是上下文污染。Agent 每执行一个步骤都要把这些步骤的历史记录、中间结果、工具返回都塞进上下文里重新推理链路一长前面的无用信息就会把真正关键的指令淹没模型开始“忘记”最初的目标输出质量断崖式下跌。第二个是 Token 成本失控。长链路任务的每一步都要携带全量历史调用次数越多每次的输入 Token 就越大成本随链路长度指数膨胀。我们当时有个巡检任务跑到第 6 步时单次调用的 Token 量已经是第一步的 8 倍左右老板看到账单脸色都变了。第三个是错误不可恢复。单 Agent 一旦在某一步产生幻觉、返回错误结果整个链路就全部白费没有中间检查点没有局部重试机制只能从头再来这在企业级场景里是不可接受的。1.2 MultiAgent 的核心思想分工、隔离、可恢复把一个大任务拆成多个小任务让不同的 Agent 各自负责一段这就是 MultiAgent 的基本盘。本质上就是把“一个人全干”变成“团队协作”有人负责拆解需求、制定步骤有人负责执行具体动作有人负责检查结果各司其职。这样做的好处很直接。首先是上下文隔离每个子 Agent 只需要关心自己这一小段任务的上下文不会被全局历史淹没模型输出的稳定性和准确率会有明显提升。其次是成本可控每个子任务单独计费不会因为链路增长导致 Token 膨胀预算可以精细化管控。第三是可恢复性某个子任务失败了只需要重跑那一个子任务不需要整个链路重来。我用一个生活化的类比来说明单 Agent 长链路执行就像一个人既当项目经理又当程序员又当测试一口气写完整个项目后再交给客户中间任何一步写错了都要推倒重来。MultiAgent 则是标准的项目组运作项目经理拆需求、程序员写代码、测试提 bug每层的职责边界清晰哪块出错就修哪块。1.3 什么时候才需要上 MultiAgent不是所有场景都适合 MultiAgent。这里有一个简单的判断标准如果任务链路很短比如 2 到 3 步无复杂依赖一个 Agent 加几个工具就能搞定就别上 MultiAgent徒增系统复杂度还要多付几倍的 Token 费用。适合上 MultiAgent 的场景通常有这么几个特征任务涉及多个独立领域比如既要查库存又要写文案又要审核合规链路长且有明确的前后依赖需要对每个阶段的结果做质量检查或者对失败恢复有强要求。我们在决定哪些场景上 MultiAgent 之前会先跑一段单 Agent 的日志统计一下任务失败率、平均 Token 消耗和失败原因分布拿数据说话。2. 企业级 MultiAgent 的架构核心Plan 模式怎么落地MultiAgent 架构里最高决策者是一个“主 Agent”它不直接执行具体操作而是负责理解用户意图、制定执行计划、调度子 Agent。这个模式在企业级场景里基本都会选择 Plan 模式而非 ReAct 模式原因下面细说。2.1 为什么是 Plan 模式而不是 ReAct 模式ReAct 模式是“边想边做”Agent 每走一步就观察一次结果再决定下一步怎么走。这种模式在开放域、探索性的任务里很灵活但在企业级场景里问题很大过程不可控、中间步骤不可审计、消耗不可预算而且很容易在某个分支上绕圈出不来。Plan 模式则是“先想后做”主 Agent 在正式执行之前先把整个任务的执行计划完整生成出来拆成若干个带依赖关系的子任务然后再逐个调度执行。这样做最大的价值是把“思考”和“执行”两个阶段彻底解耦。我举个例子说明这两种模式的实际差别。比如任务是“生成一份 618 大促的商品盘点报告”ReAct 模式下的运行路径是Agent 看到任务先决定第一步去查哪个库查到结果后根据结果再决定下一步完全走一步看一步。Plan 模式则会先列出一个明确的执行计划第一步获取销售数据第二步获取库存数据第三步分析缺货风险第四步生成报告——这个计划在执行前就已经确定每一步的目标、输入、输出都写清楚了。两种模式对比下来Plan 模式的优势非常明显每个步骤在执行前就定义了清晰的边界审计容易、预算可控、支持分步重试。企业级场景里尤其是面对 C 端业务时“可控”比“灵活”重要得多。灵活意味着不可预测不可预测意味着事故。2.2 一份合格的 Plan 应该包含哪些字段在实际落地过程中我们会在系统里把 Plan 定义成一个结构化的对象而不是一段纯文本。纯文本计划的最大问题是机器没法解析、没法做依赖管理、没法做进度跟踪。我们最终定义的 Plan 核心字段如下{ plan_id: plan_20250114_001, goal: 生成每周商品缺货风险报告, task_list: [ { task_id: task_001, name: 拉取库存数据, description: 从库存系统获取最近7天的库存快照, dependencies: [], agent_type: data_agent, input_schema: {date_range: 2025-01-07~2025-01-14}, output_schema: {sku_count: integer, items: array}, timeout_seconds: 60, retry_count: 3 }, { task_id: task_002, name: 计算缺货风险, description: 基于库存快照计算缺货风险评分, dependencies: [task_001], agent_type: analysis_agent, input_schema: {inventory_items: task_001.output.items}, output_schema: {risk_items: array}, timeout_seconds: 90, retry_count: 2 } ] }这个结构里有几个关键设计。task_id 全链路唯一方便日志追踪和结果对账。dependencies 字段声明了任务依赖关系执行引擎靠它构建执行顺序没有依赖的任务可以并行执行有依赖的必须等前置任务完成。input_schema 和 output_schema 严格约束了任务间的数据传递格式从机制上杜绝了子 Agent 返回“乱七八糟”格式的可能性。还有一个容易忽略的点是 timeout_seconds 和 retry_count这两个字段必须在 Plan 定义时就明确而不是执行时随机应变。企业级系统必须对最坏情况有预期不能让一个子任务无限执行下去。2.3 Plan 模式的执行引擎设计Plan 生成之后需要一个执行引擎来调度任务。我们用状态机来管理整个计划的生命周期核心状态包括 PENDING待执行、READY依赖已满足可执行、RUNNING执行中、SUCCEEDED成功、FAILED失败、TIMEOUT超时、CANCELLED取消。执行引擎维护一个任务队列每一轮循环做这几件事扫描所有状态为 READY 的任务按照配置的并发度派发给对应的子 Agent监听子 Agent 的执行结果收到成功的回执后更新状态并检查后续任务的依赖是否全部满足收到失败的回执后按照 retry_count 配置决定是重试还是标记 FAILED。这里要特别注意并发控制。我们早期直接在引擎里写死最大并发数是 10结果某次大促巡检任务一下子把库存系统打得超时从那以后就把并发度做成了可配置项并且加了一个令牌桶限流器所有子任务的请求统一走限流保护下游系统。另外执行引擎必须把整个 Plan 的进度持久化到数据库里而不是放在内存里。内存态最怕进程重启一旦重启全链路状态全部丢失用户还得重新发起一次任务体验极差。我们后来把进度表做成了一张 plan_instance每完成一个子任务就更新一次这样就算执行引擎挂了重启后也能从数据库恢复状态继续跑剩余任务。3. 主子 Agent 协作机制主 Agent 怎么管好一群子 AgentPlan 模式解决的是“先想后做”的问题而主子 Agent 协作解决的是“想法怎么落地”的问题。主 Agent 负责决策子 Agent 负责执行中间要有一套清晰的协作协议不然整个系统就是一群 Agent 在乱打架。3.1 主 Agent 和子 Agent 职责怎么划分先给主 Agent 和子 Agent 划一条清晰的职责边界。主 Agent 的职责范围包括理解用户原始请求、生成/调整 Plan、拆分任务、分配任务、校验子 Agent 返回的结果、汇总最终答案。子 Agent 的职责范围则非常聚焦执行主 Agent 派发的单个子任务、调用必要的工具、返回结构化的执行结果。用公司团队来类比主 Agent 是项目经理子 Agent 是工程师。项目经理不做具体编码但要对整个项目交付负责工程师不关心其他人在做什么只专注于自己那一块任务。这里有一个很多团队会踩的坑容易把主 Agent 做成“传话筒”说大白话就是把主 Agent 变成子 Agent 结果的拼装器子 Agent 返回什么就原样拼什么。这会导致主 Agent 失去决策能力最终结果是所有子 Agent 的信息一股脑堆给用户非常难用。正确做法是主 Agent 必须具备“结果消费”能力。子 Agent 返回的是原始执行结果主 Agent 要做二次加工比如多个子任务结果交叉验证、对比分析、提炼结论或者发现结果之间的冲突并决定是否让某个子 Agent 补充执行一次。3.2 子 Agent 的结果返回协议子 Agent 向主 Agent 返回结果的方式直接决定了整个系统的稳定程度。我们早期没有统一协议各个子 Agent 想返回什么返回什么结果主 Agent 推理时经常被各种“自由格式”搞晕。后来我们统一了 Rollback 协议所有子 Agent 的返回结果必须包含以下三个核心部分{ task_id: task_001, status: success, data: { result_summary: 这是本次任务的结论摘要, raw_data: { ...: 原始数据 }, confidence: 0.95, warnings: [] } }status 字段只有两个合法值success 或 failed不允许有模糊地带。result_summary 是给主 Agent 消费的结论摘要必须用自然语言简要描述执行结果。raw_data 是原始数据按需携带。confidence 是子 Agent 对自己结果的置信度主 Agent 可以据此决定是否要二次核验。warnings 是非致命问题的列表比如“数据只覆盖了 90% 的 SKU其余 10% 因接口超时未能拉取”。最关键的设计是 result_summary 和 raw_data 的分离。主 Agent 日常推理时只需要读取 result_summary避免被大量原始数据淹没上下文当它需要核对细节时再去翻 raw_data。这个设计把 Token 消耗控制在了低水平又保留了信息的完整性。3.3 主子 Agent 的通信机制请求-响应还是消息队列早期我们用的是同步 HTTP 请求主 Agent 调用子 Agent 的接口等子 Agent 返回结果后再继续下一步。这种方式实现简单但有一个致命问题子 Agent 执行一个任务往往需要几十秒甚至几分钟同步等待时主 Agent 线程被阻塞整个调度效率极低而且网络抖动一次链路就断。后来我们改成了基于任务队列的异步通信模式。主 Agent 把任务放进队列后立刻返回子 Agent 消费任务并执行执行完成后把结果写入结果存储同时触发一个回调通知主 Agent 来取。整个过程主 Agent 完全不阻塞同一时刻可以并行调度多个子任务。具体实现上我们用 Redis Stream 作为任务队列执行结果也先写入 Redis随后异步落库。主 Agent 侧通过事件监听机制感知任务完成。这套机制改造完成之后同样一批任务的整体执行耗时下降了大约 60%。4. 稳定性与成本治理企业级 MultiAgent 的生死线如果说 Plan 模式解决的是怎么把事干成那这一章解决的是怎么不出事、怎么压成本。企业级系统稳定性永远排第一Agent 也一样。4.1 任务状态机与死循环防护Agent 系统最常见的事故就是死循环任务反复执行、无限重试、某一步逻辑走岔了绕圈绕不出来。我们的做法是在 Plan 级别做两层防护。第一层是任务最大执行次数限制。每个 Plan 在创建时绑定一个 max_execution_count所有子任务的执行次数总和超过这个值整个 Plan 直接进入 CANCELLED 状态不再派发任何新任务。这个限制是最兜底的防线。第二层是单个任务的失败重试策略。并不是所有失败都值得重试我们只对某些错误类型做重试比如下游接口返回 5xx、超时这类暂时性错误参数错误、数据格式错误这类确定性错误直接返回 failed不浪费 Token 去重试。重试策略遵循指数退避原则第一次重试等 1 秒第二次等 2 秒第三次等 4 秒防止重试风暴打垮下游接口。4.2 Token 预算控制把成本变成可度量指标Token 预算是多 Agent 系统里一个必须要做的设计没有预算控制的 Agent 系统就是一台“零元计费”的烧钱机器。我们给每个 Plan 绑定一个 token_budget预算的可配置粒度可以精细到任务级。分配方式是总预算先用一个比例分配给 Plan 规划阶段比如 10%剩余 90% 留给子任务执行链路。子任务执行链路内部再按任务重要性动态分配核心任务拿大头边缘任务拿小头。每完成一个子任务引擎就把实际消耗从预算里扣除当预算低于某个阈值时不再派发高消耗任务优先保证核心任务完成。我们在实践过程中发现一个很重要的事Token 预算控制不能光靠“扣数字”还得有预警机制。我们设置了两个预警线预算消耗达到 60% 时发送 warning 日志达到 85% 时通知到值班群这样团队能在事故恶化之前介入调整。4.3 可观测性建设把 Agent 当分布式系统管MultiAgent 系统本质上是个分布式系统多个 Agent 并行执行、异步通信、状态流转如果没有一套完整可观测性方案出问题的时候根本不知道是哪个环节出的问题。我们采用了 trace metric log 三件套。Trace 层面我们把一次完整的用户请求作为一条 trace里面的每个子任务都是一个 span记录了子任务耗时、调用的 Agent 类型、返回结果状态、Token 消耗量。定位问题时只需要拉起 trace 就能看到整条链路的瓶颈在哪。Metric 层面我们重点监控任务成功率、平均执行时长、Token 消耗速率、队列积压量四个核心指标全部接入可视化监控大盘。Log 层面每个 Agent 的执行日志全部结构化输出包含 task_id、plan_id、agent_type、status 等关键字段支持按任务维度检索日志。我这里想强调的是Agent 系统的可观测性建设必须在系统设计初期就搭好架子而不是上线以后补。上线前我们花了一周时间搭观测体系上线后的排查效率提升了不止一个量级这笔投入回报率很高。4.4 灰度发布与配置开关设计Agent 系统的模型输出具有不确定性即使同一个任务今天跑和昨天跑的结果也可能有差异。这种不确定性意味着我们不能像发布普通服务一样“全量上线”。我们做了一系列配置开关来控制发布风险。最核心的开关是 Plan 模式开关用于区分新旧执行链路。上线初期我们只把开关打开给内部测试账号观察几天确认稳定后再按流量比例灰度5% 到 20% 再到 100%。第二个是子 Agent 资源开关每个子 Agent 都可以独立启停如果发现某个子 Agent 服务异常可以单独把它下线其他任务不受影响。第三个是模型参数开关不同子任务使用不同 temperature、max_tokens 配置全部做成动态可调。这套开关体系帮我们躲过好几次事故。印象最深的一次是某个子 Agent 在深夜出现输出质量退化值班同事直接在配置中心把该子 Agent 的调用流量降为零其他任务链路完全无感整个过程不到三分钟。5. 实操中遇到的典型问题与排查实录写到这里我想把我们在实际落地过程中遇到的几个比较有代表性的问题做一个梳理。这些问题不是从文档里抄来的是真实线上环境踩过的坑。5.1 子 Agent 连接失败connection failed 排查思路我们用的子 Agent 服务部署在独立容器中通过内部网关通信曾经出现过间歇性的 connection failed 报错错误信息是 connection failed: error sending request for url。第一次遇到时第一反应是网络不通但实际排查后发现根本不是基础网络问题。我们的排查顺序是这样的第一步检查网络连通性确认服务间网络白名单是否正确配置DNS 解析是否正常第二步检查超时配置发现子 Agent 处理耗时较长而网关默认超时时间只有 10 秒导致请求被网关主动断开子 Agent 还在继续执行但主 Agent 已经收到超时报错第三步调整超时配置和 TCP 连接心跳保活参数。这个问题的根源其实是参数配置不合理不是真正的网络故障。我的建议是遇到这类连接报错先把链路梳理一遍确认是哪个环节断的再针对性地调整配置。5.2 子 Agent 返回结果被截断主 Agent 推理出错这是上线初期非常头疼的问题。某个分析类子 Agent 输出的 result_summary 特别长直接超过了主 Agent 模型的输出长度限制结果被截断导致主 Agent 拿到的是一段不完整的结论推理结果自然出错。解决方案在协议侧做了两条约束一是限制 result_summary 必须控制在 200 字以内让子 Agent 自己提炼摘要二是主 Agent 侧加了截断检测逻辑当检测到返回内容疑似被截断时立即标记该任务为 failed要求子 Agent 重新执行而不是硬着头皮往下推理。这个教训让我理解了一件事多 Agent 系统的信息流设计一定要做长度预算不能指望模型自己“合理控制输出长度”必须从协议层面把长度约束写死。5.3 任务风暴一个异常触发了 32 个子任务我们遇到过一次比较惊险的事故某个看板任务因为上游数据异常子 Agent 返回了一条 warning主 Agent 没有正确识别 warning 的含义把它当成“数据不足”再次派发了一个补偿任务补偿任务结果同样异常又触发了下一个补偿任务……最终一个请求衍生出 32 个子任务差点把下游系统拖垮。事后复盘根因是主 Agent 对子 Agent 返回的 warning 字段理解不到位。补偿机制改成了由执行引擎统一管理而不是由主 Agent 自主触发因为 Agent 的自由度越高越容易出现类似的连锁反应。5.4 状态不一致任务完成了但系统状态还是执行中子 Agent 执行结果通过回调异步上报某次回调服务重启上报消息丢失导致任务实际已经完成但数据库里一直是 RUNNING 状态。后来加了兜底任务扫描每 5 分钟扫描一次所有执行中但超过预期时限的任务主动向子 Agent 查询真实状态把状态纠正回来。这个案例说明分布式系统里不能依赖单次通知机制一定要有对账逻辑兜底。Agent 系统本质上也是分布式系统所有分布式系统的经典问题它都存在。6. 这套架构的门槛团队需要具备什么能力才能玩转MultiAgent 不是买了模型 API 就能立刻跑通的对团队的工程能力和算法理解都有一定门槛。这里聊聊我们的实际情况给想入场的团队一个参考。团队必须有一个能写生产级代码的后端工程师因为 MultiAgent 系统不是写几个 Prompt 就行而是需要设计状态机、任务队列、配置中心、可观测性体系这些全是标准的后端工程问题。还得有一个对模型能力边界非常熟悉的人需要清楚什么任务适合交给什么模型什么样的 Prompt 设计更稳定什么样的任务链路容易触发幻觉。如果这两个角色是同一个人那这个团队的配置就相当豪华了。另外还要有足够的耐心和预算意识。MultiAgent 系统的调试周期比单 Agent 长很多因为问题可能出在任意一个子 Agent、任意一条链路上定位问题需要抽丝剥茧。我们连续调了一周多才把第一个复杂链路调到可接受的状态如果组织没有这个耐心很容易半途而废。我个人觉得如果团队现在连单 Agent 的基础能力都还没建起来不要急着上 MultiAgent先把单 Agent 的稳定性、可观测性、成本控制这些基本功打好再谈“多”的事。地基不稳再多 Agent 也只是把错误放大几倍。7. 对这套架构的一点复盘和心得最后分享一些个人体会。我们做这套企业级 MultiAgent 架构最大的感悟是工程的复杂度并没有被 MultiAgent 消灭而是被转移和重新分配了。单 Agent 时代要跟上下文打架多 Agent 时代要跟协作协议打架你要在系统里引入更高的自由度就必须用更强的工程约束去对冲。做个简单总结。Plan 模式解决的是“先把事情想清楚再动手”的问题主子 Agent 协作解决的是“多个角色如何分工配合”的问题状态机、幂等、限流、重试解决的是“系统如何保证稳”的问题Token 预算、上下文字数约束解决的是“成本如何控制住”的问题。这四层缺一不可单靠任何一个环节的优化都没办法让整个系统稳定地跑起来。如果让我给一个最直接的建议那就是在设计阶段就把子任务的输入输出协议定死把状态流转图画清楚把每个 Agent 的职责边界写明白。这些脏活累活看着不起眼却是整个系统能不能稳定运行的最大变量。Agent 的模型能力现在是够用的真正的差距往往出现在工程治理上。
返回列表