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

05——多 Agent 架构

多 Agent 架构:什么时候需要,以及如何避免过度设计


开篇:多 Agent 看起来很先进,为什么项目反而更难交付

很多团队在做 Agent 应用时,都会很快走到这个节点:

  • 单 Agent 版本已经能跑
  • 但复杂任务完成率不稳定
  • 于是想通过“多 Agent 分工”提升质量

结果往往是:

  • 架构图变漂亮了,问题没变少
  • Debug 难度暴涨
  • Token 成本与时延双双上涨
  • 出错后很难定位到底谁错了

这说明一个现实:

多 Agent 不是能力加法,首先是复杂度乘法。

所以正确姿势不是“能拆就拆”,而是先回答:

  1. 业务问题是否真的需要多角色协作
  2. 复杂度上升是否有明确收益
  3. 你是否具备治理这套系统的能力

一、先做决策:什么时候用单 Agent,什么时候上多 Agent

1.1 优先单 Agent 的场景

满足以下条件时,建议坚持单 Agent:

  • 任务链条短(2~4 步)
  • 主要依赖固定工具集
  • 路由逻辑可规则化
  • 失败可通过简单重试与兜底处理

一句话:
如果流程能写成稳定 Workflow,就别急着引入多 Agent。

1.2 适合多 Agent 的场景

当你出现这些特征,才值得考虑多 Agent:

  • 任务天然多角色(如分析、执行、审校)
  • 子任务知识域差异明显(法务、财务、技术)
  • 单 Agent 提示过长导致性能和稳定性下降
  • 需要并行处理多个独立子问题

二、三种主流多 Agent 模式(从易到难)

2.1 模式 A:单 Agent + 工具集(最推荐起点)

本质:还是单 Agent,只是通过工具扩展能力边界。
优点:简单、稳定、可控。
缺点:当任务复杂到需要多角色审校时会吃力。

2.2 模式 B:Supervisor + Specialists(实战主流)

一个总控 Agent 负责拆解任务,多个专家 Agent 负责子任务。

用户请求

Supervisor Agent

Research Agent

Execution Agent

Review Agent

最终输出

优点:

  • 分工明确,提示词长度可控
  • 便于替换某个子 Agent 能力

缺点:

  • 协调成本高
  • 状态一致性要求更高

2.3 模式 C:去中心化协作(谨慎使用)

多个 Agent 彼此调用、协商、迭代。
理论上更灵活,实际上极难控制。

不建议初期采用,常见后果是:

  • 执行路径不可预测
  • 无限循环风险
  • 成本失控

三、多 Agent 的核心不是“数量”,而是“协作协议”

你可以把多 Agent 看成“多服务协同系统”。
没有协议,协作必乱。

3.1 必须定义的协作契约

每个 Agent 至少要有:

  • 输入契约(需要哪些上下文字段)
  • 输出契约(结构化 JSON)
  • 责任边界(做什么,不做什么)
  • 失败契约(错误码、是否可重试)

示例(简化):

{"agent":"review_agent","input_schema":{"draft_answer":"string","citations":"array"},"output_schema":{"pass":"boolean","risk_level":"low|medium|high","feedback":"string"}}

3.2 不要让 Agent 之间传“自然语言段子”

如果 A Agent 给 B Agent 的输入是大段自由文本,
你很难做自动校验与错误定位。

建议传“结构化工单”:

  • 任务 ID
  • 子任务类型
  • 必填字段
  • 上游证据引用

四、状态管理:多 Agent 失败最多的地方

多 Agent 一旦涉及共享状态,就会面临一致性问题。

4.1 三类状态要区分

  1. 会话状态:当前用户会话上下文(短期)
  2. 任务状态:工作流执行进度(中期)
  3. 业务状态:订单、审批、工单等真实业务数据(长期)

原则:

  • 会话状态可缓存,必须有 TTL
  • 任务状态要可恢复(checkpoint)
  • 业务状态必须以源系统为准,不能依赖模型“记忆”

4.2 推荐状态机设计

CREATED

DISPATCHED

RUNNING

NEED_RETRY

FAILED

SUCCEEDED

这套状态机会让你在故障场景下仍可追踪与恢复。


五、上下文共享策略:共享太少不协同,共享太多会污染

多 Agent 不是每个都拿全量上下文。
应按职责最小化共享。

5.1 推荐“分层上下文”

  • 全局层:用户身份、权限、目标任务
  • 任务层:当前子任务必要资料
  • 私有层:Agent 自身推理中间态(默认不外泄)

5.2 避免“上下文污染”

常见问题:

  • 一个 Agent 的错误中间结论被全链路复用
  • 过期信息覆盖最新业务状态

治理策略:

  • 中间结果必须带时间戳和来源
  • 高风险结论必须二次校验
  • 过期上下文自动失效

六、并行与串行:不是越并行越快

并行能降时延,但会提高协调成本与冲突概率。

6.1 适合并行的任务

  • 子任务独立,互不依赖
  • 最终只需聚合结果

6.2 必须串行的任务

  • 下游依赖上游输出
  • 涉及写操作或状态变更

工程建议:

对可变更状态的任务默认串行,
对纯分析任务优先并行。


七、代码示例:Supervisor 模式最小可用实现(Python)

fromtypingimportDict,Any,ListclassSupervisor:def__init__(self,agents):self.agents=agentsdefrun(self,task:Dict[str,Any])->Dict[str,Any]:# 1) 拆解任务plan=self._plan(task)results:List[Dict[str,Any]]=[]# 2) 调度执行(示例为串行,可扩展并行)forstepinplan["steps"]:agent_name=step["agent"]payload=step["payload"]res=self.agents[agent_name].execute(payload)ifnotres.get("ok"):# 失败策略:重试/降级/中止fallback=self._handle_failure(step,res)ifnotfallback.get("ok"):return{"ok":False,"error":fallback}res=fallback results.append({"step":step["id"],"result":res})# 3) 聚合与审校final=self._merge_and_review(results)return{"ok":True,"data":final}def_plan(self,task):return{"steps":[{"id":"s1","agent":"research_agent","payload":task},{"id":"s2","agent":"execution_agent","payload":task},{"id":"s3","agent":"review_agent","payload":task},]}def_handle_failure(self,step,res):return{"ok":False,"code":"STEP_FAILED","step":step["id"],"detail":res}def_merge_and_review(self,results):return{"summary":"done","details":results}

这段代码重点不是功能多,而是体现了 4 个多 Agent 基础能力:

  • 可计划(plan)
  • 可调度(dispatch)
  • 可恢复(failure handling)
  • 可审校(merge/review)

八、可靠性设计:多 Agent 必须有“刹车系统”

8.1 防无限循环

  • 设置最大迭代步数
  • 设置全局 Token/时长预算
  • 同一错误重复出现时强制中止

8.2 防雪崩

  • 子 Agent 限流
  • 下游工具熔断
  • 全链路超时上限

8.3 防静默失败

  • 每步都有成功/失败事件日志
  • 未上报结果视为失败而非等待
  • 超时自动触发补偿或回滚

九、成本治理:多 Agent 的隐藏账本

多 Agent 常见成本陷阱:

  • 重复读同一上下文
  • 重复检索同一问题
  • Review Agent 过度调用大模型

优化建议:

  1. 共享检索结果缓存(按任务 ID)
  2. 低风险步骤使用小模型
  3. Review 只审关键字段,不重做整段推理
  4. 设定任务级 Token 预算和硬阈值

十、评估方法:不要只看最终答案

多 Agent 需要过程级评估,而不只是结果评分。

推荐指标:

  • 任务完成率
  • 步骤失败率(按 Agent 维度)
  • 平均步骤数(是否冗长)
  • 人工接管率
  • 单任务成本(token/API 调用)
  • 端到端时延(P50/P95)

任务日志

步骤级标注

Agent维度评估

流程维度评估

替换或优化子Agent

优化编排策略

灰度发布


十一、常见反模式(看到就要警惕)

  1. 为了“高级感”硬拆多 Agent
  2. 每个 Agent 都读全量上下文
  3. 没有统一协议,只靠自然语言协作
  4. 失败处理靠“再问一遍模型”
  5. 没有步骤级观测,只看最终结果
  6. 把多 Agent 当作性能优化手段(多数情况下会更慢)

十二、上线 Checklist(多 Agent 专项)

架构与协议

  • 每个 Agent 输入/输出 schema 已定义
  • 角色职责边界清晰,无重复职责
  • Supervisor 调度策略可配置

状态与可靠性

  • 任务状态机可追踪、可恢复
  • 迭代步数与预算上限已配置
  • 失败重试与降级策略已验证

成本与评估

  • 步骤级成本可统计
  • 子 Agent 质量指标可观测
  • 灰度策略与回滚策略可执行

结语

多 Agent 不是目标,只是一种手段。
当它能明确提高任务完成率、可维护性、可扩展性时才值得引入。

先把单 Agent 做稳,再把多 Agent 做精。
复杂度必须有收益对价,否则就是技术自嗨。


下一篇预告

下一篇进入很多团队最容易忽略但影响长期效果的模块:

《Agent 的记忆系统设计:短期记忆、长期记忆与记忆污染治理》

重点会讲:

  • 记忆写入与召回策略
  • 用户画像和任务记忆如何分层
  • 如何防止“记错、记脏、记过期”
http://www.jsqmd.com/news/799707/

相关文章:

  • 为AI编码助手集成aislop-skill:实时代码质量检测与修复
  • 第六篇:《JMeter逻辑控制器:循环、条件和交替执行》
  • 告别龟速下载!手把手教你配置PyTorch本地CIFAR10数据集(附避坑指南)
  • 为什么92%的研究者用错Gemini Deep Research?揭秘Google内部未公开的3层推理协议
  • 【大白话说Java面试题 第44题】【JVM篇】第4题:什么时候会触发 Young GC?什么时候会触发 Full GC?
  • Vue3 + Vite项目集成vue-particles避坑指南:从安装到性能优化全流程
  • 扫雷外挂逆向笔记:我是如何找到那个0x8F代表地雷的(含OD动态调试技巧)
  • NVMe 固态硬盘在 Linux 下开启 NCQ 队列深度对性能有何影响?
  • 别再为数据发愁了!用Python实战Domain Adaptation,让模型学会‘举一反三’
  • 非科班小白1年逆袭电网网安项目经理?我的真实转行路
  • PCI-X 2.0核心技术解析与应用实践
  • SINAMICS V90伺服驱动器故障代码大全
  • Kali Linux装好VMware Tools还是卡?可能是你漏了这步——深入排查与性能优化指南
  • Windows 10下用VS2017+Qt5.14.2编译3D Slicer 4.11的完整避坑指南(含Git加速)
  • 开源机械爪技术全解析:从结构设计到ROS集成开发指南
  • 问答系统:从检索到生成式模型
  • 3PEAK思瑞浦 TPA2772-SO1R SOP8 运算放大器
  • 蒙特卡洛估计与控制变量技术在量子误差消除中的应用
  • 免费试用 | 从宁德时代到宝利根,这款HMI组态软件为什么让工程师越用越顺手?
  • iOS激活锁终极绕过:Applera1n完整使用指南与安全解锁方案
  • 终极指南:3步掌握B站字幕提取与转换的核心技巧
  • VS Code图表神器:零配置用代码画UML、流程图与架构图
  • 全球200mm晶圆产能扩张21%:成熟制程的供应链博弈与未来趋势
  • BearBlog CLI:用Python命令行工具高效管理你的极简博客
  • 工业物联网无线传感器网络技术解析与应用
  • ARM A64指令集:条件分支与位操作深度解析
  • Eclipse的Post-build魔法:除了生成HEX,你的编译后步骤还能这样玩
  • 3PEAK思瑞浦 TPA2774-SO2R SOP14 运算放大器
  • Tiny AI Client:零依赖、轻量化的AI API调用库设计与实战
  • FreeRTOS中断里用xEventGroupSetBitsFromISR,这5个细节没处理好容易跑飞