
谁没动过把 agent 掰成两个的念头之前我在一个自动化任务里塞了太多职责结果 agent 一边调研资料一边写代码一边还要自我检查上下文一长就开始胡说八道改一个需求要反复调两三个小时。后来我索性把单个 agent 拆成几个专职小 agent让它们各干各的再用一套编排逻辑把结果拼起来——效果直接起飞。这篇文章就聊聊这种“多重影分身”式 agent 的拆法、框架选型、记忆共享和踩坑实录给正在单 agent 泥潭里挣扎的朋友一个可落地的参考。1. 为什么你想把 agent 掰成两个多 agent 的适用场景与设计思路先说一句大实话多 agent 不是银弹拆不好反而比单 agent 更乱。但如果你确确实实遇到了下面这几个症状那大概率就是拆分信号了。1.1 单 agent 的天花板任务混杂带来的失控单 agent 就像一个什么都干的“全栈员工”你要他在一个会话里完成调研、分析、写代码、QA、出报告等多项任务他很容易出现三个问题。第一个是“上下文漂移”。大模型的注意力窗口是有限的当对话轮次变长、参考材料增多早期的重要约束会被后续内容稀释。我遇到很多次开头明确规定“不要调用外部工具”结果跑了十几轮之后 agent 自己开始瞎编工具调用甚至产生了幻觉 API。这不是模型笨而是上下文里相互矛盾的信息太多了。第二个是“工具权限无法收敛”。单 agent 拥有全部工具时它在执行关键操作前的自控能力不稳定。尤其当你把文件写入、代码执行、网络访问这类高危工具全部挂给它时任何一步误判都可能导致整个工作区被污染。多个专职 agent 各持所需工具等于把权限边界物理隔离出问题时能快速定位到具体环节。第三个是“调试成本指数上升”。单 agent 的决策链是一条长线一旦中间步骤出错你很难判断是 prompt 措辞不准、工具返回格式不对还是上下文截断。而多 agent 每个节点输入输出都相对独立日志可单独追踪错误能被压缩到一个较小的范围内。1.2 判断拆分的三个标准并不是所有 agent 都值得拆。我一般用三个标准来评估要不要把某个 agent 拆成影分身。首先看职责是否足够内聚。如果你发现一个 agent 的 system prompt 超过了 1500 个 token并且里面同时包含“你是市场分析师”“你是代码审查员”“你是项目经理”三个角色定义那基本可以确定要拆。每个分身应该只做一件事做得专业且不用频繁切换思维模式。其次看工具依赖是否有明显边界。比如“资料调研 agent”只需要搜索引擎和 PDF 读取器“代码生成 agent”只需要文件读写和 shell 执行“报告撰写 agent”只需要文本处理和格式化输出。工具集合几乎没有重叠拆开自然水到渠成。最后看任务执行是否可以被并行化。如果在业务链路中有两个环节互不依赖却因为单 agent 的串行能力只能排队处理那就是典型的并行拆分机会。典型的例子是竞品分析可以同时让三个 agent 分别分析产品 A、B、C最后汇总。1.3 命名与角色边界给每个分身明确“人设”我在拆 agent 的时候会先给每个分身写一份“岗位说明书”。不要觉得这是形式主义角色边界模糊是影分身方案失败的头号原因。比如你有一个“内容选题 agent”和一个“内容撰写 agent”如果选型 agent 的 prompt 里没有明确“只输出选题方向和核心论点不写正文”它极可能抢着把全文写出来导致下游撰写 agent 失去了发挥空间。反过来撰写 agent 如果不知道选题 agent 的评分标准它又会朝错误的方向加工内容。我的习惯是给每个分身固定一个 JSON 合约定义输入字段、输出字段、必回结果的结构、以及拒绝处理的场景。这相当于给 agent 之间划了一道清晰的接口边界后面对接和调试都会轻松很多。2. 多重影分身怎么落地主流 agent 框架选型与协作模式方向想清楚之后下一步就是把影子们真的做出来。这里需要区分两个层次底层模型能力其实各家差不多真正的差异点在编排框架和记忆如何共享。2.1 框架横向对比LangGraph、CrewAI、AutoGen 还是自研现在主流的 agent 框架我基本都试过一轮。没有绝对的好坏关键看你需要的编排粒度。LangGraph 比较适合做状态机和复杂流程。它把每个步骤当作图中的一个节点节点之间的边由条件决定天然支持分支、循环、人工介入。如果你需要做“先把任务分发出去三个分身并行执行再聚合结果”这种严格 DAG 流程LangGraph 的体验非常顺。缺点是想做一个完全自由发言的多 agent 论坛式讨论并不方便它更强调流程可控。CrewAI 更贴近“团队管理”的抽象。你可以定义 Role、Goal、Backstory框架帮你处理任务委派和协作。上手很快但遇到需要自定义状态机的场景会有点拧巴。我拿它做过一次带 manager 的协作模式manager agent 负责拆解任务并分派给 writer、reviewer效果不错但如果子任务复杂到需要动态依赖CrewAI 的默认行为会让你想去改底层逻辑。AutoGen 的多 agent 会话模型自由度很高适合探索式讨论和代码生成场景。它的核心概念是 conversable agent多个 agent 之间可以自由对话你可以手动控制对话轮次。问题在于自由度高也意味着不确定性高生产环境里如果没有加好终止条件和重试策略很容易出现 agent 之间礼貌地聊到天荒地老的情况。还有一些细节要注意比如最新热词里提到的 harness 和 agent 的区别——harness 更偏向一个大“骨架”负责跑通工具调用、循环、上下文管理而 agent 本身只是策略层。很多框架给你的其实是一套 harness你在里面填充 agent 的思维逻辑。搞清这点之后你再去看架构图会通透很多。2.2 编排模式路由、管道、共享黑板多 agent 之间如何配合我归纳了三种最常见的模式。第一种是“路由器模式”。一个入口 agent 负责解析用户意图然后把请求分发到对应的专业分身。适合用户需求差异很大的场景比如一个助手既能订机票又能写邮件又能查天气这时候没必要让所有分身都感知全部能力只需要路由器根据关键字做判断。第二种是“流水线模式”。任务按固定顺序经过多个 agent每个 agent 专注处理自己负责的那一环节。内容生产、数据处理、代码生成都适合这种模式。流水线的关键是前一个节点的输出必须严格符合后一个节点的输入要求所以需要定义一个统一的“中间数据格式”。第三种是“共享黑板模式”。多个 agent 同时操作一个公共状态空间比如一个共享任务看板每个 agent 从上面领取子任务完成后更新结果。这个模式并行度最高但并发写同一个状态时有冲突风险一般需要维护者 agent 或者用数据库锁来控制。2.3 我的选择一个不太折腾的轻量编排方案说实话大多数项目并不需要重型的多 agent 框架。我目前最常用的是一套很朴素的做法主流程用 Python 脚本或 LangChain 表达式做编排每个 agent 是一个封装好的函数输入输出都是带 schema 的字典agent 之间通过一个中间结果队列交互。这样做的原因有几个。每个 agent 的 prompt、工具、模型参数都能独立配置链路排错时可以直接单测某个 agent 的输入输出换框架的成本低因为逻辑都收敛在自己的接口里。如果你刚开始尝试多 agent我也建议先在现成框架上跑通最小样本再决定要不要下沉到底层自己做。3. 实操把业务拆成多个 agent 并跑通全流程这一节我用一个真实做过的场景来完整演示搭建一个“行业调研→内容生成→质量审查”的多 agent 流水线。这个案例覆盖了角色拆分、记忆分配和状态传递三个核心问题。3.1 场景设定三个分身的岗位职责这个项目的目标是让 agent 在没有人工干预的情况下从一个行业主题出发最终产出符合要求的分析文章。我把它拆成三个分身长这样调研 agent负责搜索资料、提取关键数据、整理成结构化的“事实清单”。它不写任何观点性内容只输出参考资料、数据来源、风险提示。撰写 agent接收事实清单按照既定框架组织语言完成初稿。它不新增事实不做外部检索只基于上游提供的信息和自身知识生成内容。审查 agent扮演挑剔的编辑检查事实一致性、逻辑连贯性、合规风险并提出修改意见。如果发现问题它会把报告返回给撰写 agent 修改最多循环三次超过就转人工。这三个角色对应了任务链的三个阶段每一阶段的输入输出都非常清晰调试时可以单独给每个分身喂测试数据。3.2 每个 agent 的 Prompt 与工具配置要点写多 agent 的 prompt 和写单 agent 不太一样核心是“我只需要你做某件事别越界”。我会在 system prompt 里反复强调边界约束。调研 agent 的 prompt 会刻意写成这样你是行业资料调研助手你的任务是从给定主题出发输出一份结构化事实清单。你只能调用 web_search、fetch_url 两个工具不要撰写完整段落不要给出结论判断。输出 JSON 里只包含 facts、sources、risks 三个字段。撰写 agent 的配置则完全不同你是一名资深行业分析师只根据输入的事实清单撰写文章。不要自我检索不要猜测数据。如果事实清单中的资料不足以支撑某个论点请直接标记“此处缺乏数据”。文章结构严格按照标题、背景、主体分析、风险提示四段展开。审查 agent 的 prompt 要突出“找茬”而不是“创作”你的任务是审查稿件。重点检查事实是否有依据、数据是否一致、是否有夸大表述。输出问题时请指明具体位置和修改建议不要直接改写全文。从实操看prompt 长度并不是越长越好关键是让每个分身清楚自己“不该做什么”。我在所有 prompt 中都加了“如果碰到不满足输入要求的情况请输出特定错误码”这样一个兜底机制方便后期定位问题。3.3 记忆体系的落地短期、中期、长期怎么各管各多 agent 协作里记忆不是单点的问题而是每个分身之间如何共享“共同记忆”。我实际采用的分级方式可以给正在选型的人一个参考。短期记忆就是每个分身自己的会话上下文。它的特点是时间短、容量有限只负责当前任务的局部状态比如调研 agent 最近几轮搜索的关键词。中、长期记忆则需要外部存储。我搭建了一套比较轻的记忆方案用向量数据库存“事实库”里面是调研 agent 产出的所有事实条目和来源用 MongoDB 存“任务状态库”记录每个任务的进度、当前所处节点、已完成和待办项用文件系统存“成果库”也就是各个节点最终交付的文件。撰写 agent 每次从向量库检索当前任务相关的事实片段而不是把所有事实一股脑塞进上下文。这里尤其要注意如果所有分身都能随意写入长期记忆会出现“互相污染”的问题。比如审查 agent 的修改意见被写进了事实库下游撰写 agent 就会把修改意见误当成事实来源。我的控制策略是每个存储区由本节点独占写入其他节点只能读取执行专门权限校验后才能写。3.4 链路联调与状态传递当三个分身各自跑通之后下一步就是把它们串起来。我这里的实现思路是用一个主控制器调度按阶段依次调用。每一轮的 agent 输出不是自然语言散件而是带状态标记的 JSON 对象。比如调研 agent 完成后返回{status: ok, facts: [...], sources: [...]}。控制器读取 status如果是 “ok” 就把 facts 喂给撰写 agent如果状态是 “error_missing_data”则需要进入代理阶段重新检索。联调中最容易踩坑的是字段命名不一致。我之前试过上游输出 “facts”下游读取的时候却用了 “fact_list”结果下游 agent 看到的是空数据但没有任何报错因为它把缺失字段当成了“没有事实”——下游可能会自动编造一篇“缺乏依据”的文章。后来我在每个节点入口加了严格的字段校验函数字段必须是 schema 里定义的一旦缺键就直接抛出异常绝不能静默放过。4. 多 agent 协作的常见问题与排查实录这一节把实践中最常遇到的几个崩溃现场和解决办法整理出来。很多问题如果你没经历过单看文档基本不会意识到它们有多致命。4.1 上下文穿越A 的知识污染了 B 的判断最典型的现象是审查 agent 在上一轮提出“标题需要更吸引人”下一轮撰写 agent 写正文时居然开始大谈标题优化。原因是审查意见被原样封装进了撰写 agent 的输入上下文导致后者认为整篇文章都需要围绕审查意见来改。解决办法很简单每个节点的输入必须经过“格式净化器”把上游节点输出的动作项和目标明确分离。比如审查 agent 的返回只提取“修改指令列表”过滤掉它对整体方向的泛泛评价再喂给撰写 agent。这个教训告诉我多 agent 之间传递的每一步信息都需要“翻译”成下游可执行的结构化指令而不是直接把对话记录甩过去。4.2 循环依赖与死锁两个分身互相等对方在一个方案里我放过两个 agent方案 agent 生成计划评审 agent 审核计划。如果计划不合格方案 agent 需要重新修订。问题在于双方都依赖对方的输出推进下一步而 agent 之间没有形成“仲裁节点”结果就是双方来回踢皮球循环次数耗尽之后整个任务崩溃。解决办法是强制引入“超时仲裁”设定最大修订次数为 3如果超过次数仍未通过则由一个独立的人工决策节点介入。同时可以在方案 agent 的 prompt 中加入“每次修订只处理评审意见中列出的条目不得引入全新内容”防止 agent 为了通过评审而过度扩展改动范围。4.3 失败重试与 “agent execution terminated due to error”的排查思路很多朋友在日志里看到 “agent execution terminated due to error” 就慌了其实这个错误本身只表示 agent 的执行循环被强制终止了关键要看终止点之前最后几个动作。我在排查时有一套固定顺序。先查上下文是否截断。把最近一轮的 token 数打出来如果贴近窗口上限那很大概率是 agent 忘了早期约束。再查工具调用返回是否异常。部分工具在返回超长文本或空数据时agent 的解析逻辑容易挂掉这时你需要给工具封装一层“统一返回格式”把错误包成结构化字段。最后查退出条件。我在很多框架里发现如果用户没有明确要求 agent 在何时停止它可能会不断自我反思直到把上下文耗尽——这种问题在 AutoGen 的开放对话里尤其常见一定要设定硬性的停止轮次。我还习惯在关键节点加“冗余检查”当 agent 返回空结果时先不要直接重试同一 prompt 三次——那通常只会烧 token。更要紧的是检查之前步骤里是否有工具返回了 “no results”如果是优先修工具调用本身。4.4 安全与审计多分身带来的新风险多个 agent 同时拿工具意味着攻击面也变大了。你可能觉得多 agent 只是内部流程但任何一个分身只要权限配置稍有不慎就可能被注入指令或误操作高危工具。我把这一类风险统称为“分身权限失控”它的典型表现是某一个子任务触发了意外的文件覆盖或外部数据获取。我的安全底线有几个首先给每个分身最小工具集调研 agent 就只给搜索和抓取绝对不给 shell 执行权限其次全链路加审计日志所有 agent 的工具调用、输入摘要、输出哈希都落盘方便事后复盘最后对大模型输出做指令注入过滤比如某些网页里嵌入了“忽略之前指令”的对抗文本调研 agent 读到之后可能被诱导做出越界动作这就要在工具返回层做内容清洗。这些安全措施看起来很基础但在实际落地中极少有人第一步就做全。等出问题了再补成本至少翻倍。5. 几个能直接抄作业的避坑技巧最后分享几个我经过多轮实践沉淀下来的小技巧不一定写在官方文档里但真的很管用。第一个给每个分身加一个“工作日志”字段。让 agent 在每次动作之后输出一句简述说明自己为什么做这一步使用的是哪条信息。这些日志会大量消耗输出 token但对调试来说价值巨大建议只在开发环境开启。第二个固定一次任务的最大工具调用次数。没有上限的情况下agent 很容易陷入无意义的循环检索。我通常限制单个分身最多调用 15 次工具超过则自动进入失败处理分支。这个数字可以根据任务复杂度调节但一定得有。第三个多 agent 的输出合并不能只靠脑子记。我统一用“结果表”记录每个节点交付的文件路径和校验值控制器读结果表时如果发现某个节点状态是 “pending”就不会启动下游。这套机制相当于给影子分身们上了一个简单的锁避免重复执行和竞态问题。第四个所有 agent 共享同一个模型时务必给每个分身的温度参数设置差异化。调研类分身可以把温度设在 0.2 左右保证事实提取稳定撰写类分身可以到 0.7保留一点表达活力审查类分身再降到 0.3避免它提出过于天马行空的修改意见。别看这个细节很小实际效果非常明显。我个人在实际操作中最受益的一次改进是把“上下文压缩”作为显式步骤放进主流程。每两个节点之间插入一次摘要压缩把已经处理完的信息浓缩成结论再交给下一个分身。这样既保证了多 agent 各自拿到了足够的背景信息又不至于把整段历史都塞给他们。后来我再面对长链路、多轮修订的任务时几乎不再遇到上下文爆炸导致的行为漂移。如果你现在也在单 agent 的复杂任务里折腾得焦头烂额建议先挑一个小流程做拆分实验。不用一上来就上整套框架用脚本把两个分身串起来跑一周数据会告诉你拆分到底值不值。影子分身这个思路核心不是把 agent 变多而是让每一个分身把一件事做得足够精。