2026/10/26 3:23:33

多智能体协作框架agency-agents拆解:从单Agent到多Agent协作的工程实践

多智能体协作框架agency-agents拆解:从单Agent到多Agent协作的工程实践 1. 从agency-agents这个名字说起一个多智能体协作框架的定位第一次看到agency-agents这个项目名我的直觉是这大概率是一个围绕代理agent概念构建的协作系统而agency这个词在英文里既有代理机构的意思也有能动性、自主行动能力的含义。把这两个词拼在一起指向的应该是一个让多个智能体具备自主行动能力、并且能像一家机构那样协同工作的框架。这个判断在后续的拆解中基本得到了验证。如果你之前接触过单智能体的项目比如让一个大模型去调用工具、完成一个具体任务那你可能会发现一个明显的瓶颈单个智能体再强它的上下文窗口、工具集、专注度都是有限的。当任务复杂到需要调研—分析—执行—复核这样多阶段流转时一个智能体很容易在中途迷失或者把不同阶段的职责混在一起。agency-agents 这类项目要解决的核心问题就是把复杂任务拆解给多个各司其职的智能体让它们通过一套协作机制共同完成目标。这篇文章适合几类人看一是正在做 AI 应用、想从单 agent 调工具升级到多 agent 协作的开发者二是对智能体编排、任务分解感兴趣的技术爱好者三是想理解这类框架内部到底怎么运转、值不值得引入到自己项目里的技术决策者。我会尽量把原理讲透把实操路径讲清楚同时把我在类似项目里踩过的坑一并交代出来。需要先说明一点由于项目正文、关键词和摘要描述都是空的我无法拿到这个项目的官方细节。所以接下来的内容是基于agency-agents这个命名所指向的典型多智能体协作框架的常见设计范式来展开的属于一名从业者面对这类项目时最合理的推断与补全。如果你手上有该项目的具体文档可以对照着看哪些地方和你的实际实现一致哪些地方需要调整。2. 多智能体协作到底难在哪先搞清楚问题再谈方案2.1 单智能体为什么会在复杂任务上翻车很多人做 AI 应用的起点是写一个 system prompt把角色、工具、输出格式全塞进去然后让模型自己决定什么时候调什么工具。任务简单时这套跑得很顺但一旦任务链条变长问题就集中爆发了。最典型的是上下文污染。一个智能体在同一个对话里既要记住用户原始需求又要记住中间调用的工具返回结果还要记住自己已经做了哪些决策。当对话轮次超过十几轮早期的关键约束很容易被淹没模型开始做出和最初目标不一致的行为。我见过一个案例让智能体帮忙整理一份竞品分析前面明确说了只关注国内厂商跑到第八轮它开始把海外厂商也列进来了因为中间某次工具返回里带了海外数据把原始约束冲淡了。第二个问题是职责混淆。一个智能体同时扮演执行者和审核者时它倾向于给自己放水。让它写完一段代码再自己检查它往往觉得写得挺好因为审核和生成用的是同一套上下文、同一个视角。这在需要质量把关的场景里是致命的。第三个问题是工具集膨胀。当你要让一个智能体既能查数据库、又能发邮件、又能调外部 API、又能做数据分析时它的工具列表会变得很长。工具一多模型选错工具的概率就上升而且每个工具的描述都会占用宝贵的上下文空间。2.2 多智能体协作的三种典型分工模式agency-agents 这类框架本质上是在用分工来对抗上面这些问题。常见的分工模式有三种理解它们对用好框架很关键。第一种是流水线式Pipeline。任务被拆成固定顺序的几个阶段每个阶段一个智能体前一个的输出是后一个的输入。比如需求分析 agent → 方案设计 agent → 代码生成 agent → 测试 agent。这种模式最好理解、最好调试缺点是灵活性差遇到需要回退或并行的场景就不好处理。第二种是主管-下属式Supervisor-Worker。有一个主管智能体负责拆解任务、分配任务、汇总结果下面挂若干个专职智能体。主管相当于项目经理下属各干各的。这种模式适合任务边界清晰、可以并行拆分的场景但对主管的调度能力要求很高主管一旦判断失误整个任务就跑偏。第三种是辩论/评审式Debate/Review。多个智能体对同一个问题给出方案然后互相评审、互相挑刺最后收敛出一个更优解。这种模式在需要高质量输出的场景里效果很好代价是 token 消耗成倍增加。agency-agents 从命名看更偏向于提供一个通用的协作底座让你能组合使用这几种模式。实际项目里往往是混合的主管下面挂一条流水线流水线的关键节点再引入评审机制。2.3 协作带来的新问题通信、状态与死循环分工解决了老问题但引入了新问题。最突出的是智能体之间的通信格式。如果 A 智能体输出的是自然语言B 智能体要从中提取结构化信息这个提取过程本身就容易出错。所以成熟的框架都会定义一套消息协议让智能体之间传递结构化数据而不是自由文本。其次是共享状态的管理。多个智能体需要访问同一份任务上下文谁负责写、谁负责读、什么时候更新这些都需要设计。如果每个智能体都维护自己的一份状态副本最后汇总时就会出现不一致。最后是死循环和无限委派。A 把任务委派给 BB 觉得这不是自己的活又委派回 A或者两个智能体互相踢皮球。这在没有设置最大轮次和终止条件的框架里非常常见。我在早期做的一个实验里两个智能体就一个该不该调用外部接口的问题来回讨论了二十多轮最后是我手动加了轮次上限才停下来。3. 拆解 agency-agents 的核心构件一个协作框架该有什么3.1 智能体定义层角色、能力与边界任何多智能体框架的第一层都是怎么定义一个智能体。一个完整的智能体定义通常包含四部分角色描述它是谁、负责什么、可用工具它能调什么、输入输出契约它接收什么格式、产出什么格式、终止条件它什么时候算完成任务。角色描述最忌讳写得又长又空。我见过有人把角色写成五百字的小作文结果模型抓不住重点。好的角色描述应该像岗位说明书一句话说清职责两三句说清边界什么不做再补一句输出要求。比如你负责从原始需求中提取结构化的功能点列表不负责评估可行性输出必须是 JSON 数组每个元素包含功能名和优先级。可用工具这一块我的经验是宁可少而精。给一个智能体配十个工具不如配三个它真正需要的。工具描述也要写得具体说清楚什么场景下用、输入参数什么含义、返回什么。模糊的工具描述是选错工具的头号原因。输入输出契约是保证协作顺畅的关键。如果框架支持尽量用 JSON Schema 之类的结构化格式约束智能体的输出而不是让它自由发挥。结构化输出虽然牺牲了一点灵活性但换来的是下游智能体解析时的稳定性这笔账很划算。3.2 编排层任务怎么流转编排层决定了智能体之间怎么协作。这一层通常包含任务图谁先谁后、谁依赖谁、路由逻辑根据什么条件走哪条分支、并发控制哪些任务可以同时跑、失败重试某个智能体失败了怎么办。任务图的设计有个实用技巧先画流程图再写代码。把每个智能体当成一个节点把数据流当成边画出来之后你会发现很多设计上的漏洞比如某个节点的输入没人提供、某条分支走不通、某个环节缺少错误处理。我在做第一个多智能体项目时跳过这一步直接写代码结果写到一半发现有两个智能体的职责重叠了返工重来。路由逻辑要尽量显式。不要让智能体自己感觉该走哪条路而是用明确的判断条件。比如如果需求里包含数据分析关键词走数据分析分支否则走通用分支。显式路由的好处是可预测、可调试出问题时你能一眼看出是判断条件写错了还是智能体执行错了。并发控制是个容易被忽视的点。有些任务确实可以并行比如同时让三个智能体从不同角度分析同一份数据。但并行也意味着资源竞争和结果合并的复杂度。我的建议是初期全部串行跑通之后再挑真正独立的环节改并行。过早优化并发调试成本会高得让你怀疑人生。3.3 通信与状态层智能体之间怎么对话通信层的核心是消息格式。一个设计良好的消息应该包含发送者、接收者、消息类型请求/响应/通知、载荷结构化数据、时间戳、关联的任务 ID。有了这些字段你才能追踪一条任务在多个智能体之间的完整流转路径。状态管理有两种主流做法。一种是中心化状态所有智能体读写同一份共享状态框架负责加锁和一致性。好处是数据统一坏处是容易成为性能瓶颈而且并发写的时候要小心。另一种是消息传递智能体之间只通过消息通信各自维护自己的状态需要什么数据就问别人要。好处是解耦彻底坏处是通信开销大、调试时数据分散在各处。实际项目里往往是混合的任务级的元数据放中心化状态智能体内部的中间结果各自持有。agency-agents 这类框架通常会提供状态管理的抽象你只需要决定哪些数据放共享区、哪些放本地。这里有个血泪教训共享状态里不要放太大的对象。我曾经把一个几百 KB 的中间结果塞进共享状态结果每次读写都要序列化反序列化整个流程慢得离谱。后来改成只存一个引用 ID实际数据放外部存储性能立刻上来了。3.4 工具与外部能力层智能体的手脚智能体再聪明也得靠工具去和外部世界交互。工具层的设计要点有三个统一接口、错误处理、权限控制。统一接口意味着所有工具都遵循同样的调用约定比如都是输入一个 JSON返回一个 JSON。这样智能体不需要为每个工具学一套调用方式框架也能统一做日志和监控。错误处理是工具层最容易被低估的部分。工具调用失败是常态——网络超时、参数错误、外部服务限流什么都有可能。如果工具失败后直接把异常抛给智能体智能体往往会不知所措甚至开始胡编乱造。好的做法是工具层捕获异常返回一个结构化的错误信息错误类型、原因、建议的重试方式让智能体知道这次失败了但可以这样补救。权限控制在多智能体场景里尤其重要。不是每个智能体都该有发邮件、改数据库的权限。按最小权限原则给每个智能体配工具既安全又能减少误操作。我在一个项目里就吃过亏一个负责整理数据的智能体被误配了写数据库的权限结果它把整理后的中间结果直接写进了生产表清理了好一阵。4. 从零跑通一个 agency-agents 风格的多智能体流程4.1 环境准备与依赖梳理假设你要基于 agency-agents 这类框架搭一个多智能体应用第一步是把环境理清楚。通常需要这几样东西运行时环境Python 或 Node.js看框架支持、模型接入配置API key、模型名、超时设置、框架本体、可选的向量库或外部存储如果涉及知识检索。模型接入这块有个细节值得说不同智能体可以用不同的模型。主管智能体需要强推理能力可以用能力更强的模型执行简单格式化任务的智能体用便宜快速的小模型就够了。这样能在保证效果的前提下把成本压下来。我一般会把模型配置做成可切换的方便在不同任务上做对比实验。依赖版本要锁死。多智能体框架往往依赖一堆周边库版本不锁的话今天跑通的代码明天可能就报错了。用 requirements.txt 或 package-lock.json 把版本固定住是省心的基本功。4.2 定义你的第一个智能体从最小可用开始不要一上来就设计五个智能体。先定义一个让它单独跑通。选一个职责最清晰的比如需求解析智能体输入一段自然语言需求输出结构化的功能点列表。定义的时候把角色描述、工具、输出格式都写清楚。然后单独测试它给它三五条不同的输入看输出是否符合预期。这一步的目的是验证你的 prompt 设计和输出格式约束是否有效。如果单个智能体都跑不稳多个智能体协作只会更乱。我通常会用一个小技巧来测试输出稳定性同样的输入跑十次看输出格式是否每次都一致。如果十次里有两次格式跑偏说明你的约束还不够强需要加 few-shot 示例或者更严格的格式说明。这个测试花不了几分钟但能帮你提前发现大量下游解析问题。4.3 把两个智能体串起来第一次协作单个智能体跑稳之后加第二个让它们串起来。比如加一个方案设计智能体接收需求解析智能体的输出产出技术方案。这一步的关键是验证数据契约。需求解析智能体输出的 JSON方案设计智能体能不能正确解析字段名对不对嵌套结构处理得了吗我建议在这个环节加一层校验数据从 A 传到 B 之前先按 B 的输入 schema 校验一遍不通过就报错而不是让 B 去猜。第一次串起来跑大概率会遇到这些问题A 的输出字段和 B 期望的不一致、B 对某些边界情况处理不了、两个智能体对同一个术语的理解不同。这些都是正常的逐个修就行。修的过程中你会发现大部分协作问题本质上是接口问题把接口定义清楚问题就少了一大半。4.4 引入主管智能体让流程能动态调度两个智能体串行跑通后可以引入主管智能体让它根据任务情况动态决定调用哪些下属、以什么顺序调用。这是从固定流水线升级到动态编排的关键一步。主管智能体的 prompt 要写清楚它有哪些下属、每个下属擅长什么、什么情况下该调用谁、怎么判断任务完成。这里最容易出问题的是主管的决策依据。如果主管只能看到任务的原始描述它很难做出好的调度决策。更好的做法是让主管能看到每个下属的能力描述和当前任务状态基于这些信息来决策。我踩过的一个坑是主管智能体倾向于什么都自己干因为它觉得自己也能处理。解决办法是在 prompt 里明确它的职责是调度而非执行并且限制它不能直接产出最终结果只能通过委派下属来完成。这个约束加上之后主管的行为就正常多了。4.5 加一道评审关卡质量兜底流程能跑通之后加一个评审智能体做质量兜底。它的职责是检查最终产出是否符合要求格式对不对、内容有没有遗漏、逻辑是否自洽。评审智能体的 prompt 要和生成智能体区分开。生成智能体关注怎么产出评审智能体关注产出有没有问题。让评审智能体带着挑刺的心态去工作效果比让它客观评价要好。可以给它一个检查清单让它逐项核对。评审发现问题后是打回重做还是直接修正我的经验是小问题直接修正大问题打回重做。判断标准可以设成如果问题涉及核心逻辑或大段内容就打回如果只是格式或个别措辞就修正。打回重做要设置最大次数避免无限循环。5. 实操中真正会咬人的那些坑5.1 智能体人格漂移跑着跑着就不是它了多智能体流程跑长任务时经常出现某个智能体忘记自己是谁的情况。本来它是负责审核的跑着跑着开始帮生成智能体写内容了。这通常是因为上下文里混入了太多其他角色的信息把它的角色定位冲淡了。解决办法有两个。一是在每个智能体的每次调用里都重新注入角色描述不要指望它记住。二是隔离上下文让每个智能体只看到和自己职责相关的信息而不是整个任务的完整历史。agency-agents 这类框架一般会提供上下文隔离的机制用起来。我实测下来重新注入角色描述这个动作看起来笨但效果非常稳。多花的那点 token比起流程跑偏后返工的成本完全不值一提。5.2 结构化输出的最后一公里问题让模型输出 JSON 不难难的是让它每次都输出合法 JSON。常见问题包括多输出了一段解释文字、字段名拼错、该用数组的地方用了对象、字符串里带了未转义的引号。应对手段是层层设防。第一层在 prompt 里给明确的格式示例最好给两三个。第二层用框架提供的结构化输出能力如果有的话从解码层面约束。第三层解析时做容错比如先尝试提取 JSON 块失败了再用宽松解析。第四层解析失败时把错误信息反馈给智能体让它重试。这四层里第二层最省事第四层最兜底。我一般会全上因为结构化输出出问题的概率实在不低多一层防护就少一次半夜被报警叫醒。5.3 成本失控多智能体是 token 消耗大户多智能体协作的 token 消耗往往是单智能体的好几倍。原因很简单每个智能体都有自己的 system prompt智能体之间传递的消息也是 token评审环节还要把内容再读一遍。一个原本单智能体几千 token 能搞定的任务多智能体跑下来可能几万 token。控制成本的手段有几个。一是按需调用不是每个任务都要走完整流程简单任务走简化路径。二是模型分级简单环节用小模型。三是上下文裁剪传给下游智能体的信息只保留必要的不要把整个历史都塞过去。四是缓存相同或相似的子任务结果可以复用。我做过一个对比同一个任务全用大模型跑完整多智能体流程和分级用模型加上下文裁剪成本差了将近五倍而输出质量几乎没有可感知的差异。所以成本优化不是抠门是让项目能持续跑下去的必要手段。5.4 调试困难多智能体的黑盒问题单智能体出问题你看一遍对话历史基本能定位。多智能体出问题你得在多个智能体的多轮对话里找线索难度高一个量级。我的做法是给每个消息打上完整的追踪信息哪个智能体发的、发给谁、属于哪个任务、第几轮。然后把这些消息按时间线汇总到一个日志里。出问题时顺着时间线看很快能定位到是哪个环节开始跑偏的。另外给每个智能体单独开日志也很有用。当你想看某个智能体到底经历了什么时直接看它的专属日志比在全局日志里翻要快得多。这些日志设施前期搭起来花点时间但后期调试时能省下大量精力。6. 这套框架适合什么场景不适合什么场景6.1 适合的场景任务可分解、质量要求高、流程相对稳定多智能体协作不是万能药它有明确的适用边界。最适合的场景是任务可以清晰分解成多个子任务且子任务之间有明确的依赖关系。比如内容生产流水线调研—撰写—审核—润色、数据处理流水线采集—清洗—分析—报告、软件开发辅助需求—设计—编码—测试。另一个适合的场景是对输出质量要求高需要多视角把关。单智能体容易自说自话多智能体引入评审和辩论机制后输出质量会有明显提升。这在需要严谨性的场景里价值很大。还有就是流程相对稳定、可以反复执行的场景。如果每次任务流程都不一样多智能体的编排成本就收不回来。流程越稳定前期投入的编排设计越划算。6.2 不适合的场景简单任务、强实时性、流程高度多变反过来简单任务不要上多智能体。一个智能体加两个工具能搞定的事搞成三个智能体协作纯属给自己找麻烦。判断标准很简单如果单智能体的输出你已经满意了就别折腾。强实时性场景也要慎重。多智能体意味着多轮模型调用延迟是叠加的。如果用户等不了几秒多智能体就不合适。这种场景下要么简化流程要么用更快的模型要么干脆回到单智能体。流程高度多变、每次都不一样的场景多智能体的编排成本很难摊薄。这种情况下一个能力强的单智能体加灵活的工具调用可能比僵化的多智能体流程更合适。6.3 一个判断清单你到底该不该上多智能体为了帮你快速判断我整理了一个清单。满足其中三条以上才值得考虑多智能体判断维度倾向单智能体倾向多智能体任务复杂度单步或两三步多阶段、有依赖输出质量要求够用就行需要严格把关流程稳定性每次都不同相对固定可复用实时性要求秒级响应可以等几十秒成本敏感度极度敏感可接受一定开销调试维护意愿不想折腾愿意投入建设这张表不是绝对的但能帮你快速做个初判。我见过太多项目明明单智能体就够用非要上多智能体最后维护成本高得没人愿意碰。7. 我对这类框架的一点个人看法做了一段时间多智能体相关的项目我最大的体会是框架本身不产生价值对问题的正确拆解才产生价值。agency-agents 这类框架提供的是协作的骨架但骨架怎么长肉、长成什么样取决于你对业务问题的理解。我见过有人把框架用得很花哨五六个智能体互相调用看起来很唬人但实际效果还不如一个精心设计的单智能体。也见过有人只用两个智能体一个生成一个审核就把内容质量提升了一大截。差别不在框架在于有没有想清楚这个任务到底难在哪、需要什么样的分工来解决。另外一个体会是多智能体系统的可观测性比功能更重要。功能可以慢慢加但如果系统是个黑盒出了问题你无从下手那这个系统就没法长期维护。所以我在搭这类系统时会花很大精力在日志、追踪、状态可视化上。这些基础设施看起来不产出直接价值但决定了系统能不能活下去。最后说个实操小技巧如果你刚开始接触多智能体别急着看框架文档先拿纸笔把你要解决的问题画成流程图标出每个环节的输入输出。画完之后你大概率会发现有些环节根本不需要智能体用普通代码就能处理。把智能体用在真正需要理解和判断的环节其余环节用确定性代码这样的系统既高效又稳定。这个思路比任何框架的文档都值钱。