
多智能体系统这两年从论文里的概念一路卷到了生产环境我身边不少做大模型应用的朋友从去年开始陆续把单 Agent 的 Demo 往多 Agent 架构上迁。但真到了落地这一步问题就来了Demo 里三个 Agent 互相聊天看着挺热闹一上生产就发现延迟爆炸、状态丢失、循环调用停不下来、成本失控。我自己带团队做过几套多智能体系统从客服工单分流到自动化测试编排都趟过一遍踩的坑比写过的代码还多。这篇就把多智能体系统落地架构这件事拆开讲透从编排模式选型、通信机制、状态管理、并发扛压到可观测性把每个环节为什么这么设计、实际怎么落地讲清楚。不管你是刚接触 Agent 开发的新手还是正在把单 Agent 往多 Agent 迁移的工程师都能从里面找到能直接抄作业的东西。1. 多智能体系统到底解决的是单 Agent 搞不定的什么问题很多人一上来就问多智能体框架选哪个这其实是个伪命题。选型之前得先想明白你为什么需要多个 Agent如果单 Agent 加几个工具就能搞定硬拆成多 Agent 只会徒增复杂度和成本。我见过太多项目本来一个带 Function Calling 的 Agent 就能处理非要拆成规划 Agent、执行 Agent、审核 Agent 三个结果延迟翻了三倍调试难度指数级上升。1.1 单 Agent 的能力天花板在哪里单 Agent 的核心瓶颈有三个。第一是上下文窗口的物理限制。当一个任务需要处理的信息量超过模型上下文比如要分析一份几百页的合同再生成摘要单 Agent 要么截断信息要么分块处理但分块之后块与块之间的关联就丢了。第二是工具数量的膨胀。当你的 Agent 挂了三十个工具模型选择工具的准确率会明显下降因为工具描述本身就占用了大量上下文而且相似工具之间容易混淆。第三是职责耦合导致的提示词冲突。一个 Agent 既要严谨地做数据校验又要发散地做创意生成这两种人格写在同一个 System Prompt 里会互相打架输出质量反而不如拆开。我实测过一个场景让单 Agent 同时负责从用户自然语言里抽取订单信息和根据订单信息生成回复话术。抽取要求精确、格式固定生成要求灵活、有温度。放在一个 Agent 里抽取准确率只有 82% 左右拆成抽取 Agent 和回复 Agent 两个抽取准确率提到 94%回复质量也更稳定。这就是职责分离带来的收益。1.2 多智能体真正带来价值的三类场景不是所有任务都值得上多智能体。根据我的经验真正能吃到多智能体红利的场景有三类。第一类是任务可以天然分解为串行阶段且每个阶段需要不同的能力配置。比如自动化测试编排需求解析 Agent 负责把自然语言需求转成测试点用例生成 Agent 负责写测试代码执行 Agent 负责跑用例并收集结果分析 Agent 负责判断失败原因。每个阶段用的模型、温度参数、工具集都不一样拆开之后每个 Agent 都能调到最优配置。第二类是需要多视角交叉验证。比如内容审核一个 Agent 从合规角度审一个从事实准确性角度审一个从语气风格角度审三个结果汇总后再决策。单 Agent 很难同时保持三个视角的独立性容易顾此失彼。第三类是任务规模超出单 Agent 处理能力需要并行拆分。比如要分析一万条用户反馈单 Agent 串行处理要几个小时拆成十个 Agent 并行处理每个处理一千条时间直接降到几十分钟。这里的关键是拆分逻辑要清晰且子任务之间无依赖。1.3 拆分的代价你必须提前算清楚的账多智能体不是免费的午餐。每多一个 Agent就多一次模型调用成本和延迟都会上升。我一般会算一笔账假设单 Agent 处理一个任务平均消耗 3000 token、耗时 8 秒拆成三个 Agent 串行token 消耗可能涨到 8000 到 12000耗时涨到 20 到 30 秒。如果这个任务对延迟敏感比如实时客服那多智能体就不合适如果是对延迟不敏感的批处理任务比如夜间跑的数据分析那多智能体完全可行。还有一个隐性成本是调试复杂度。单 Agent 出问题你看一遍完整对话就能定位多 Agent 出问题你得在多个 Agent 的对话记录之间来回跳还得理解它们之间的消息传递。所以我在项目初期一定会把可观测性做扎实后面会专门讲。2. 编排模式选型顺序、并行、层级还是群聊编排模式决定了 Agent 之间怎么协作这是多智能体架构的骨架。选错了模式后面怎么优化都别扭。我见过有人用群聊模式做本该串行的任务结果 Agent 之间互相打断输出一团乱麻。下面把四种主流模式讲清楚以及各自适合什么场景。2.1 顺序编排最稳但最容易踩的坑顺序编排就是 Agent A 输出给 Agent BB 输出给 C像流水线一样。这是最容易理解和实现的模式也是我推荐新手第一个上手的模式。它的优点是链路清晰、每步可验证、出错容易定位。但顺序编排有个大坑错误会沿着链路放大。如果第一个 Agent 抽取信息时错了一个字段后面所有 Agent 都基于错误信息工作最后输出全错。我的应对办法是在关键节点加校验 Agent或者用结构化输出加 schema 校验。比如抽取 Agent 必须输出符合 JSON Schema 的结果不符合就重试重试两次还不行就转人工。另一个坑是延迟累加。三个 Agent 串行每个 8 秒用户就要等 24 秒。如果业务能接受那没问题如果不能接受就得考虑把部分步骤并行化或者用流式输出让用户先看到部分结果。2.2 并行编排拆分逻辑比并行本身更重要并行编排是把一个大任务拆成多个子任务同时交给多个 Agent 处理最后汇总。它的收益来自时间压缩但前提是子任务之间真的没有依赖。我做过一个用户反馈分析的并行编排把一万条反馈按批次分给十个 Agent每个 Agent 独立分析自己那批最后汇总 Agent 把十份结果合并。这里的关键是拆分维度要均匀。如果按时间拆分可能某段时间反馈特别多导致某个 Agent 负载过高。我一般会先统计总量再均分或者用动态任务队列谁空闲谁领任务。并行编排的另一个问题是结果汇总。十个 Agent 的输出格式可能不一致汇总 Agent 得能处理这种不一致。我的做法是给每个 Agent 定死输出 schema汇总 Agent 只做合并和去重不做格式转换这样最稳。2.3 层级编排主管 Agent 加执行 Agent 的经典结构层级编排是有一个主管 Agent 负责规划和分派下面多个执行 Agent 负责具体干活。这个模式适合任务复杂、需要动态决策的场景。主管 Agent 根据任务情况决定调用哪个执行 Agent、调用几次、按什么顺序。这个模式最大的挑战是主管 Agent 的规划能力。如果主管规划得不好比如该调 A 却调了 B或者该调三次只调了一次整个任务就废了。我的经验是给主管 Agent 提供清晰的执行 Agent 能力描述并且限制它的决策空间。比如不要让它自由生成调用计划而是让它从预定义的几个工作流里选一个这样可控性高很多。还有一个坑是主管 Agent 的上下文膨胀。所有执行 Agent 的结果都要回传给主管如果执行 Agent 输出很长主管的上下文很快就被撑爆。解决办法是让执行 Agent 输出精简摘要详细结果存到外部存储主管只拿摘要做决策。2.4 群聊编排最灵活也最难控的模式群聊编排是多个 Agent 在一个共享对话里自由发言通过某种规则决定谁发言。这个模式适合头脑风暴、多视角讨论这类场景。它的优点是灵活Agent 之间可以互相启发缺点是极难控制容易出现无限循环、话题跑偏、成本失控。我用群聊模式做过一个创意生成场景三个 Agent 分别扮演不同风格在一个对话里轮流提创意互相点评。效果确实不错但必须加两个约束一是最大轮次限制比如最多讨论十轮就强制结束二是发言者选择规则不能让 Agent 自己决定谁发言而是用轮询或者基于内容相关度选择。没有这两个约束群聊模式基本没法上生产。编排模式适合场景主要风险控制手段顺序编排串行阶段任务、流程固定错误放大、延迟累加节点校验、结构化输出并行编排可拆分的大批量任务拆分不均、汇总困难动态队列、统一 schema层级编排复杂动态决策任务规划失误、上下文膨胀限制决策空间、摘要回传群聊编排头脑风暴、多视角讨论无限循环、成本失控轮次限制、发言者规则3. 通信机制Agent 之间到底怎么传消息编排模式定了之后下一个问题是 Agent 之间怎么通信。这看起来是个实现细节但实际上直接影响系统的稳定性和可维护性。我见过用共享内存传消息的也见过用消息队列的各有各的适用场景。3.1 共享状态 vs 消息传递两种哲学共享状态是指所有 Agent 读写同一个状态对象比如一个全局的 context 字典。Agent A 往里面写结果Agent B 从里面读。这种方式实现简单适合 Agent 数量少、协作紧密的场景。但它有个致命问题并发读写冲突。如果两个 Agent 同时写同一个字段后写的会覆盖先写的。而且状态对象会越来越大最后变成一个谁都不敢动的巨型字典。消息传递是指 Agent 之间通过显式的消息来通信每个 Agent 有自己的输入输出不共享状态。这种方式更符合分布式系统的设计原则Agent 之间解耦容易测试和替换。缺点是消息的序列化和传递有开销而且需要设计好消息格式。我现在做项目基本都用消息传递只有在 Agent 数量少于三个、且协作非常紧密时才考虑共享状态。消息传递虽然麻烦一点但后期维护成本低太多。3.2 消息格式设计结构化是底线消息格式我强烈建议用结构化数据不要用自然语言。自然语言消息看起来灵活但解析起来极其脆弱模型稍微换个说法你的解析逻辑就崩了。结构化消息用 JSON 或者类似格式字段固定解析稳定。一个典型的消息格式长这样{ message_id: msg_001, sender: extract_agent, receiver: validate_agent, task_id: task_123, content: { order_id: ORD-2024-001, amount: 299.00, items: [item_a, item_b] }, status: success, timestamp: 2024-01-15T10:30:00Z }这里的关键字段是task_id它让整条链路可以追踪。status字段让下游 Agent 知道上游是成功还是失败失败时可以做相应处理。content是实际数据用结构化格式。提示消息里一定要带task_id和trace_id否则多 Agent 链路出问题时你根本没法把散落在各处的日志串起来。这个字段在调试阶段能救命。3.3 同步调用 vs 异步消息延迟和吞吐的权衡同步调用是 Agent A 调用 Agent B 后阻塞等待结果拿到结果再继续。这种方式逻辑简单适合串行链路。但它的问题是阻塞导致资源浪费A 在等 B 的时候什么都干不了。异步消息是 A 把消息发到队列就返回B 处理完再把结果发到另一个队列A 从队列里取结果。这种方式吞吐高适合并行和长链路场景。但它的复杂度高需要处理消息顺序、重复消费、失败重试等问题。我的选择标准是如果链路短三步以内且延迟敏感用同步如果链路长或者需要并行用异步。实际项目里经常是混合的关键路径同步非关键路径异步。3.4 消息队列选型别为了用而用说到异步就绕不开消息队列。我见过不少项目上来就上 Kafka结果运维成本高得吓人实际消息量一天才几千条。消息队列选型要看实际需求。如果消息量不大每天百万级以下用 Redis 的 List 或者 Stream 就够了部署简单团队都熟。如果消息量大且需要持久化和多消费者再考虑 Kafka 或者 RabbitMQ。如果是在云上直接用云厂商的托管队列服务最省心。我个人的经验是多智能体系统的瓶颈通常不在消息队列而在模型调用。所以消息队列选个够用的就行别在这上面过度设计。4. 状态管理与记忆多轮任务怎么不丢上下文多智能体系统处理的任务往往不是一次性的而是多轮的。比如一个客服工单用户可能来回问好几轮每轮都可能触发不同的 Agent。这时候状态管理就成了核心问题怎么让每个 Agent 都知道之前发生了什么。4.1 短期状态单次任务内的上下文传递短期状态是指一次任务执行过程中的上下文。比如顺序编排里Agent A 的输出要传给 Agent BB 的输出要传给 C。这个传递如果靠消息携带那消息会越来越大因为每一步都要把之前所有步骤的结果带上。我的做法是状态外置。所有中间结果存到一个外部存储Redis 或者数据库消息里只带一个state_idAgent 需要什么自己去取。这样消息保持精简状态可以按需读取。缺点是 Agent 需要多一次读取操作但这点开销相比模型调用可以忽略。4.2 长期记忆跨任务的知识沉淀长期记忆是指跨任务的知识比如用户的历史偏好、常见问题的解决方案。这部分通常用向量数据库存储Agent 需要时做相似度检索。这里有个坑记忆检索的时机和数量。如果每个 Agent 都去检索记忆会重复检索且可能检索到不相关的内容。我的做法是设一个专门的记忆管理 Agent统一负责记忆的写入和检索其他 Agent 通过它来访问记忆。这样记忆的读写有统一入口质量可控。4.3 状态一致性并发场景下的坑当多个 Agent 并行处理同一个任务的不同部分时状态一致性就成了问题。比如两个 Agent 同时更新同一个订单的状态一个改成已支付一个改成已发货最后状态就乱了。解决办法有两个。一是状态更新串行化所有状态更新走一个队列按顺序处理。二是乐观锁每次更新带版本号版本不匹配就重试。我一般用第一种简单可靠。第二种适合更新冲突少的场景。4.4 状态清理别让垃圾数据拖垮系统状态数据如果不清理会越积越多最后拖垮存储和查询性能。我一般会设一个 TTL任务完成后状态保留一段时间比如七天就自动删除。对于需要长期保留的状态归档到冷存储。这里有个细节清理时机要和业务对齐。比如客服工单的状态用户可能一周后还会来追问那 TTL 就不能设太短。我一般会跟业务方确认一个合理的保留期而不是拍脑袋定。5. 并发扛压多智能体系统怎么撑住高并发多智能体系统的并发压力主要来自两个地方一是外部请求的并发二是内部 Agent 调用的并发。这两者的处理策略不一样。5.1 外部请求并发限流和排队是必须的外部请求进来如果直接透传给 Agent模型调用会瞬间打满然后所有请求都超时。所以限流是必须的。我一般用令牌桶算法做限流根据模型的实际吞吐能力设置速率。限流之后超出的请求怎么办两个选择拒绝或者排队。拒绝就是直接返回系统繁忙简单但用户体验差。排队是把请求放进队列等有容量了再处理用户体验好但需要控制队列长度否则队列无限增长也会拖垮系统。我的做法是分级处理核心业务请求排队非核心请求直接拒绝。队列长度设一个上限超过上限的请求也拒绝。这样既保证了核心业务的可用性又防止了系统被压垮。5.2 内部 Agent 调用并发连接池和超时控制内部 Agent 调用模型 API 时如果每个调用都新建连接连接数会爆炸。所以要用连接池复用连接。连接池大小根据模型 API 的并发限制来设一般设成 API 限制的 80% 左右留点余量。超时控制也很关键。模型调用可能因为各种原因变慢如果不设超时一个慢调用会占着连接不放最后连接池耗尽。我一般设两级超时单次调用超时比如 30 秒和整个任务超时比如 2 分钟。单次超时触发重试任务超时直接失败。5.3 背压机制让系统自己调节节奏背压是指当系统处理不过来时向上游反馈让它慢下来。在多智能体系统里背压可以体现在多个层面。比如当 Agent 调用队列积压超过阈值时限流器自动降低放行速率当模型 API 返回 429限流时调用方指数退避重试。背压机制的核心是反馈回路。系统要能感知自己的负载并根据负载调整行为。没有背压的系统在压力下会直接崩溃有背压的系统会在压力下变慢但保持可用。5.4 实测数据一个客服场景的并发调优过程我做过一个客服工单分流的系统三个 Agent 串行意图识别、工单分类、回复生成。上线初期并发 50 的时候就开始大量超时。排查发现瓶颈在意图识别 Agent它用的模型响应慢平均 3 秒而且没有连接池每次新建连接。优化措施一是给意图识别 Agent 加了连接池复用连接二是把意图识别模型换成更快的轻量模型准确率只降了 2% 但速度快了一倍三是加了限流把并发控制在 30。优化后并发 100 的情况下 P99 延迟从超时降到 8 秒系统稳定运行。优化项优化前优化后连接方式每次新建连接池复用意图识别模型大模型3秒轻量模型1.5秒限流无并发30P99延迟并发100超时8秒6. 可观测性多 Agent 链路出问题怎么快速定位多智能体系统最让人头疼的就是出问题时不知道哪个环节错了。单 Agent 你看一遍对话就知道多 Agent 你得在多个 Agent 的日志之间跳。所以可观测性不是可选项是必选项。6.1 全链路追踪trace_id 贯穿始终全链路追踪的核心是给每个任务分配一个trace_id这个 ID 在整条链路的所有 Agent 调用、模型调用、工具调用中传递。这样你就能通过一个trace_id把所有相关日志串起来。实现上我一般用 OpenTelemetry 这类标准框架它支持自动埋点和手动埋点。自动埋点覆盖 HTTP 调用、数据库调用这些通用操作手动埋点覆盖 Agent 内部的逻辑。两者结合基本能做到全链路覆盖。6.2 关键指标监控延迟、成功率、成本除了追踪还要监控关键指标。我一般监控这几类延迟每个 Agent 的 P50、P95、P99 延迟以及整条链路的端到端延迟。成功率每个 Agent 的调用成功率失败原因分类。成本每个 Agent 的 token 消耗按任务类型和用户维度统计。队列深度各消息队列的积压情况。这些指标要能实时看也要能按时间维度看趋势。我一般用 Prometheus 收集指标Grafana 做展示。6.3 日志规范结构化日志是基础日志一定要结构化用 JSON 格式字段固定。关键字段包括trace_id、agent_name、step、status、duration、error。这样日志可以方便地被检索和分析。我见过用纯文本日志的出问题时只能 grep效率极低。结构化日志配合日志分析工具比如 ELK可以快速筛选出某个trace_id的所有日志或者某个 Agent 的所有错误日志。6.4 告警策略别让告警淹没你告警要精准不能什么都告。我一般设这几类告警错误率告警某个 Agent 的错误率超过阈值比如 5%持续 5 分钟。延迟告警端到端 P99 延迟超过阈值持续 5 分钟。成本告警单日 token 消耗超过预算的 80%。队列积压告警队列深度超过阈值持续 10 分钟。告警要分级P0 告警打电话P1 告警发消息P2 告警只记录。这样避免告警疲劳。7. 框架选型LangGraph、AutoGen 还是自己撸框架选型是很多人纠结的问题。我的观点是框架是加速器不是必需品。如果你的需求简单自己撸一个轻量编排层可能比用框架更可控。如果需求复杂框架能帮你省很多事。7.1 主流框架的能力边界LangGraph 适合有状态的多 Agent 工作流它的图结构很直观状态管理做得好。缺点是学习曲线陡而且和 LangChain 生态绑定较深。AutoGen 适合对话式的多 Agent 协作它的群聊模式开箱即用。缺点是控制粒度粗复杂逻辑不好实现。CrewAI 适合角色扮演式的多 Agent 协作定义角色和任务很简洁。缺点是灵活性一般复杂编排支持有限。如果这些框架都不满足那就自己撸。自己撸的好处是完全可控坏处是什么都要自己写。我一般建议先用框架快速验证验证通过后再评估要不要替换成自研。7.2 自研编排层的核心模块如果决定自研核心模块包括Agent 注册与发现、消息路由、状态管理、执行引擎、可观测性。这些模块不用一次做全按需迭代。我的经验是先做最小可用版本一个简单的顺序执行引擎加上基本的日志。跑通之后再逐步加并行、加状态管理、加监控。不要一上来就设计一个大而全的架构那样大概率会过度设计。7.3 选型的决策清单选框架前问自己几个问题任务复杂度如何团队技术栈是什么是否需要深度定制运维能力如何根据答案来选。如果任务简单、团队熟悉 Python、不需要深度定制用 LangGraph 或 CrewAI 快速上手。如果任务复杂、需要深度定制、团队有分布式系统经验自研更合适。如果团队运维能力弱选托管服务或者轻量框架。8. 落地踩坑实录那些文档不会告诉你的问题最后这部分是我踩过的坑都是文档里不会写的但实际项目中一定会遇到。8.1 Agent 无限循环最常见也最致命多 Agent 系统最容易出的问题就是无限循环。Agent A 调用 BB 觉得信息不够又调用 AA 又调用 B如此往复。我遇到过一次两个 Agent 互相调用了几十次token 消耗直接爆表。解决办法是设置最大调用深度。每个任务有一个调用计数器超过阈值就强制终止。阈值设多少我一般设 10 到 15根据任务复杂度调整。另外Agent 之间的调用关系要避免环形依赖如果必须有环一定要有退出条件。8.2 提示词冲突Agent 之间互相打架多个 Agent 的提示词如果不协调会出现互相打架的情况。比如 Agent A 被要求输出简洁Agent B 被要求输出详细A 的输出给 B 之后B 觉得信息不够又去问 AA 又输出简洁的死循环。解决办法是统一输出规范。所有 Agent 的输出格式和详细程度要有统一标准或者至少相邻 Agent 之间要协调。我在项目初期会画一张 Agent 交互图标注每个 Agent 的输入输出要求确保上下游匹配。8.3 成本失控token 消耗的隐形黑洞多 Agent 系统的 token 消耗比单 Agent 高得多而且很容易失控。我遇到过一次一个任务本来预算 5000 token实际消耗了 50000原因是某个 Agent 把整个对话历史都塞进了上下文。控制成本的办法一是精简上下文只传必要信息不要传整个历史二是设置 token 预算每个任务有预算上限超了就终止三是监控成本按任务类型和用户维度统计发现异常及时处理。8.4 模型不一致不同 Agent 用不同模型的坑不同 Agent 用不同模型时输出风格和格式可能不一致。比如 Agent A 用 GPT-4 输出 JSONAgent B 用另一个模型输出 Markdown汇总时就乱了。解决办法是统一输出格式不管用什么模型输出都要符合统一的 schema。可以在每个 Agent 后面加一个格式化层把输出转成标准格式。这样下游 Agent 不用关心上游用的什么模型。8.5 测试困难多 Agent 系统怎么测多 Agent 系统的测试比单 Agent 难得多因为涉及多个组件的交互。我的做法是分层测试单元测试测单个 Agent 的逻辑集成测试测 Agent 之间的交互端到端测试测整条链路。单元测试用 mock 把上下游隔离只测当前 Agent。集成测试用真实的上下游但用固定的输入输出。端到端测试用真实的全链路但用录制的数据回放避免依赖外部服务。注意多 Agent 系统的测试一定要覆盖异常路径比如某个 Agent 超时、返回错误、返回格式不对。这些异常路径在实际运行中一定会出现提前测到能省很多事。9. 从单 Agent 迁移到多 Agent 的渐进式路径如果你现在有一个跑得还不错的单 Agent 系统想迁移到多 Agent我建议渐进式迁移不要推倒重来。9.1 第一步识别可拆分的边界先分析现有单 Agent 的职责找出可以拆分的边界。判断标准是这部分职责是否有独立的输入输出是否用了不同的工具集是否有不同的性能要求如果满足就可以考虑拆出来。我一般会先拆出最独立的那部分比如一个专门做数据校验的模块。拆出来之后单独部署单 Agent 通过接口调用它。这样风险最小收益也能看到。9.2 第二步建立通信层拆出第一个 Agent 后就要建立通信层。我建议用 HTTP 或者消息队列不要用进程内调用这样后续扩展方便。通信层要做好版本管理接口变更要兼容旧版本。9.3 第三步逐步替换和验证每拆一个 Agent都要做对比验证新架构的输出和旧架构的输出是否一致延迟和成本变化如何如果变差了要分析原因是拆分不合理还是实现有问题。我一般会保留旧架构一段时间用影子流量做对比。新架构跑一段时间没问题后再切正式流量。9.4 第四步优化和固化全部拆完之后做整体优化调整 Agent 之间的调用关系、优化提示词、调优并发参数。优化到稳定后把架构和配置固化下来形成文档和模板方便后续复用。这套渐进式路径我走过两次每次都是三到六个月完成迁移过程中系统一直可用没有出现大的故障。相比推倒重来这种方式风险可控得多。多智能体系统落地这件事说到底是在能力、成本、复杂度三者之间找平衡。没有银弹只有适合当前场景的取舍。我自己的体会是先把单 Agent 用到极致确实遇到瓶颈了再上多 Agent而且一定要从最简单的顺序编排开始把可观测性和状态管理做扎实再逐步加复杂度。那些一上来就设计复杂架构的项目十个有九个会烂尾。