
1. 为什么需要“AI代理代为交互”1.1 单个AI助手解决不了的问题我在一开始构思这套“多人多AI协同系统”的时候其实是带着一个真实痛点来的单个AI助手在复杂协作项目里根本撑不住。你让一个AI同时承担信息搜集、数据分析、方案撰写、代码审核四件事它一开始看着全能干到第三件事的时候就开始“串味”——写方案的时候带着代码的语气做分析的时候又把网上查来的过时数据当成内部数据。这不是模型笨而是上下文污染。一个Agent的上下文窗口就是那么大任务越多、角色越复杂信息互相干扰就越严重。更麻烦的是多个人用同一个AI代理时身份是混乱的。项目经理提的需求和开发提的需求会被混在一个会话历史里AI分不清该听谁的。你可能会说那就开多个会话呗。但多个会话之间又完全没有信息共享A会话已经确认过的结论B会话里AI又要重新问一遍等于前面白干。我当时的判断是我们需要的是角色隔离、身份隔离、任务并行而不是一个大而全的“超级AI”。这就是“AI代理代为交互”这个思路的出发点——不要让人直接面对模型让人面对他自己的代理让代理代表他去跟其他代理、其他人交互。1.2 代理模式带来的架构红利把“代为交互”变成架构的核心思想之后整个系统的性质就变了。每个参与者包括人和AI都拥有一条独立的代理通道这条通道负责三件事表达、接收、决策缓冲。第一是表达。代理会根据它所代表的“主人”的设定按照统一的协议把需求发出去而不是直接暴露给其他Agent一个原始对话窗口。这样避免了A模型和B模型因为说话风格不同导致的理解偏差。第二是接收。代理接收外部消息之后不是直接塞进上下文就完事而是先做分类、过滤、排优先级。比如一个Agent正在执行高优任务时低优先级的外部询问会被暂存等当前任务切分点再处理。这个缓冲机制在纯对话式AI里是不存在的。第三是决策缓冲。代理可以自主做一些“不需要打扰主人”的决策遇到需要主人拍板的事情再上报。这个设计非常关键它在架构层面给“人机协同”留了接口。直接说好处解耦。人和AI的实现细节被隔离在各自代理后面代理之间只认协议不认实现。你想换掉底层的某个模型只要代理的对外行为不变整个协作网络不用动。我实测下来这个解耦带来的维护成本下降比想象中还要明显。2. 整体架构设计分层与核心模块拆解2.1 五层架构模型第一版架构我画得很复杂后面砍了三次才稳定成五层。这五层分别处理接入、路由、协同、执行和状态。层级核心职责轻量级实现组件接入层人的操作入口会话管理前端展示Web控制台Restful APIWebSocket路由与控制层Agent注册、发现、意图识别、消息路由Agent Registry意图路由服务协同调度层任务分解、执行调度、冲突裁决、人工仲裁入口Orchestrator裁决器执行层Agent运行容器、工具调用、模型接入Agent Worker工具沙箱模型API适配数据与状态层全局状态、共享记忆、事件日志、消息存储Redis StreamPostgreSQL为什么一定要分层因为我踩过不分层的坑。早期原型里所有Agent直接连同一个消息队列谁都可以给谁发消息任何一个Agent卡住或者发疯整个系统的日志就变成一锅粥。分层之后每层只依赖下一层提供的接口出了问题能顺着层定位。尤其是协同调度层独立出来之后任务状态和消息流转才真正变得可控。接入层和路由层之间我加了一个Agent Registry代理注册中心。所有Agent启动时先注册自己声明能力、权限、接受的消息类型。路由层拿到一条消息时不是盲目广播而是查注册表匹配。这一点是在实现“让数千个Agent协同”类场景时的标准做法注册发现机制能避免消息发错人。2.2 中心化、去中心化还是混合式多Agent协同系统最纠结的架构选择就是中心化还是去中心化。我先把两种方案的真实情况放在一起对比方案优点缺点擅长场景中心化调度状态一致流程可控日志好查协调者单点瓶颈链路长灵活性差MVP验证固定流程去中心化扩展性强Agent自治度高容错好一致性问题难解调试困难消息易爆炸大规模异构协作混合式控制面集中执行面分散兼顾可控与扩展实现复杂度中等需要定义好边界真实多人多AI项目我最终选的是混合式一个集中的控制平面负责任务分解、共识裁决、人工仲裁但Agent执行阶段的消息交换走的是事件总线不经过中心转发。原因很实际。多人多AI场景里人需要随时介入人介入就需要全局视图这要求控制面必须是收敛的——所有关键状态都要在中心能看到。但Agent之间的普通工作消息如果也全部绕中心走那中心就是瓶颈二十个Agent同时干活时消息延迟会高到无法接受。落地时的划分规则是三条凡是改变全局状态的消息必须经过控制平面凡是纯粹的业务数据交换走事件总线凡是需要人确认的由控制平面向上抛并等待人工响应。这个规则划清楚之后中心化带来的可控和去中心化带来的性能都拿到了。3. 代理之间怎么通信、怎么协作、怎么收敛3.1 消息模型与通信协议多Agent协同最基础的问题是Agent之间说什么话。这里不能直接让Agent互相发自然语言大段聊天一是解析成本太高二是不稳定。我设计了一套最小但够用的结构化消息模型这个JSON只做说明实际项目里可以直接照抄这个字段设计{ message_id: msg_8f3a2c91, task_id: task_1024, sender: agent.searcher, receiver: agent.analyst, message_type: request, payload: { action: analyze, content: 将searcher返回的原始数据转成趋势结论 }, timestamp: 1739000000, confidence: 0.9, signature: authorization-token }message_id是全局唯一的用来去重和追踪。task_id是任务链路的锚点一个任务从拆解到结束所有消息都挂在同一个task_id下。sender和receiver限定方向不允许一条消息绕过接收方直接发给第三方。比较容易被忽略的是message_type。我定义了五种基础类型request请求、response响应、event事件通知、cancel取消、escalate上报人工。为什么单独定义escalate因为AI代理判断不了的事情不能自己死磕得有一条标准通道把人拉进来。通信载体上第一版我直接用HTTP调用Agent之间点对点请求结果经常因为某个Agent超时把整条链路拖死。后来换成消息队列异步通信落地用的是Redis Stream轻量、生态成熟、处理消息积压方便。如果量再大可以换NATS或者Kafka但原则是异步化、事件驱动千万别做同步阻塞调用。3.2 任务分解与调度策略多AI协同要真正干活必须解决“一个需求怎么变成一串Agent动作”的问题。我采用的是“协调者Agent 工作流引擎”相结合的方式。协调者Agent收到人的需求后先把需求拆成子任务每个子任务标注依赖关系。这本质上是一个有向无环图。比如做“市场分析报告”这个任务拆出来四个子任务搜集资料、数据分析、生成结论、排版输出。其中“生成结论”依赖“数据分析”“数据分析”依赖“搜集资料”依赖关系明确。调度策略我一开始用最简单的拓扑排序按依赖顺序依次派发。后来发现这个方案太死板真实场景里“搜集资料”和“数据分析”前期可以并行一部分。于是升级成“依赖感知”调度只有被依赖的子任务完成之后才解锁下游任务没有依赖关系的子任务并行执行。执行层面还有一个关键点超时与重试。我给每个子任务设置了超时上限超时后先重试一次如果重试还是失败就走escalate通道上报人工而不是让后面的任务一直等。这个兜底必须有不然一个Agent卡住整个DAG都吊在那多人协同的项目会陷入无限等待。3.3 多Agent结果冲突时的共识与裁决机制多个Agent各自干活一定会有结论冲突的时候。一个Agent说方案A成本更低另一个Agent说方案B更稳人都不知道听谁的系统内部必须先有一层裁决逻辑。我试过三种方案最后根据场景混着用。第一种是加权投票。每个Agent根据历史任务完成质量有一个权重值冲突时按权重计票。这个方法快但权重的可信度需要积累初期不可靠。第二种是仲裁者模式。指定一个专门的仲裁Agent当检测到多个Agent对同一问题给出不一致结论时仲裁Agent把所有结论和自己的评估依据汇总生成一份冲突报告。如果报告能自动收敛就把结果写回任务流不能收敛上报人工。第三种是基于规则引擎的硬约束。有些冲突根本不需要AI裁决。比如数据合规问题上只要某条结论触发了规则条件直接拦截。硬规则优先级永远最高这个不用讨论。我的最终设计是“规则硬约束 仲裁者报告 加权投票”的三级裁决链。另外所有Agent输出的时候必须带一个confidence字段也就是置信度。低置信度的结论不会直接进入最终结果而是自动转到仲裁环节。这个小改动让我少处理了很多脏数据具体原因在常见问题章节展开说。3.4 状态同步、记忆分层与上下文管理多Agent系统最隐蔽的坑是状态不同步。A Agent已经更新了某个数据的结论B Agent还在用旧结论继续推导出来的东西自然就是错的。要解决这个问题所有全局状态必须集中存储并且通过消息通知订阅方。我用的是PostgreSQL加JSONB字段存全局状态每次状态变更都会向外发出一份event消息订阅了这个状态的Agent收到事件之后自行决定是否刷新本地缓存。Redis Stream在这里兼当事件总线正好复用通信层的基础设施。记忆管理则是另一个重点。多个Agent共享同一个任务上下文如果所有内容都往上下文里塞很快就触顶。我把记忆分成三层来管记忆层级可见范围生命周期存储位置全局共享记忆所有Agent可见跟任务生命周期一致PostgreSQLAgent私有记忆仅某个Agent可见随Agent会话结束Redis临时会话记忆当前交互上下文一次交互结束即清理Agent运行时内存全局共享记忆里只放任务相关的关键状态、结论性信息和明确的决策记录。每个Agent自己推理过程的详细内容放在私有记忆不让别人看到。这样既保证了协作需要的信息透明又避免了把每个Agent的思考过程全部摊开造成的上下文污染。再有就是上下文裁剪。长时间运行的任务会让Agent上下文越来越长。我的做法是每当全局共享记忆发生关键状态变更时触发一次“摘要更新”——把共享记忆里已经收敛的旧讨论压缩成一段摘要释放上下文空间。这个机制虽然实现起来多花了一点功夫但对长周期任务的稳定性提升是决定性的。4. 搭建一套可运行的原型系统4.1 技术选型的对比与建议说了这么多架构理念落到技术选型不少人还是懵。我先把我自己对比过的几个主流Agent框架放出来框架核心机制优点缺点适合场景LangGraph图编排、状态机编排能力强、流程可控、内置持久化学习曲线陡复杂多步骤流程CrewAI角色化Agent配合任务上手快、角色定义直观长链路控制偏弱多角色协作原型AutoGen多Agent对话驱动动态性强、适合探索状态容易失控研究型试验自研轻量消息层自定协议加Worker完全可控、贴合定制需求工作量较大最终生产架构我最终的架构没有完全依赖某一个框架而是把这套系统的底层通信和调度逻辑做成自研的消息层然后让LangGraph和CrewAI跑在Worker里作为执行引擎。原因很直接市面上这些框架擅长的是“编排单个Agent的任务流程”但我要的是“多名参与者之间的身份隔离与消息路由”这部分框架给不了只能自己做。模型接入这一层我用的是兼容OpenAI协议的统一适配层。不同模型商用API或者本地部署的开源模型都封装成一个统一的模型接口Agent不关心底层面的是哪个模型只按接口调用。这样后期切换模型或者同时混用多个模型都很方便不会把某个模型厂商绑死在系统里。另外提一句在做原型部署规划时要考虑到跨平台环境。我实际验证过基于aarch64的国产系统环境的部署问题比如在ARM架构的麒麟系统上安装Node.js 18以上版本时需要选择对应的arm64安装包而不能默认走x64版本Java/Python侧的SDK也建议提前验证兼容性。架构设计如果预留了这种多环境适配的抽象层后面从开发机迁到生产容器或者国产化服务器时不会伤筋动骨。4.2 从零搭建MVP的关键步骤如果你也准备搭一套这样的多AI协同系统我建议你按下面这个顺序做MVP少走弯路。第一步先定Agent角色和消息类型。不要一上来就写代码先把系统里有哪几个Agent、每个Agent能干什么、只允许接收什么类型的消息列成一张表。我第一版就是跳过了这步直接改代码后来返工了三次。第二步搭通信层。用Redis Stream建两个队列一个全局任务队列一个事件广播通道。所有Agent监听事件通道根据消息里的receiver字段决定是否处理。第三步写Agent Worker。每个Agent Worker只做四件事从队列取消息、调用模型接口、处理结果、把结果作为新消息发出去。这个Worker不关心外部路由只关心自己接到的这条消息。第四步实现调度中心。协调者Agent收到任务后按前面说的DAG方式拆解逐级派发。这一步是系统能否跑起来的关键需要把依赖关系和超时重试逻辑都定义清楚。第五步加入人工仲裁入口。调度中心提供一个仲裁消息队列前端页面上把需要人确认的消息列出来人工点选确认或驳回结果重新注入任务流。这个MVP跑通之后不要急着加并发、负载均衡那些生产特性先把两条链路验证齐第一条是“人发起需求到多个Agent协同完成”的正向链路第二条是“Agent之间冲突把决策转回给人”的异常链路。这两条链路通了整个架构的地基就算稳了。4.3 用三个人三个AI的场景做验证理论说了半天用一个真实场景验证一下这套架构到底怎么运转。假设一个小团队要产出一份市场分析报告。参与方是三个人一个项目经理、一个数据分析师、一个PPT设计师。对应的三个AI代理一个资料搜集代理、一个数据分析代理、一个排版代理。项目经理在控制台发布需求“请产出一份2025年智能硬件市场的分析报告重点看穿戴设备趋势周期半年内。”这条需求进入协同调度层协调者Agent把它拆成DAG资料搜集代理去抓取行业报告、公开数据产出一份原始资料包。数据分析代理消费资料包产出趋势结论。排版代理拿到趋势结论生成PPT草稿。项目经理和数据分析师两个真人对趋势结论做审核。执行过程中资料搜集代理发现两个数据来源对某个市场份额的统计差了三倍它没有直接选一个用而是把两条数据连同来源信息打包发了一条escalate消息给项目经理。项目经理在控制台看到冲突提示后选择了采用官方口径的数据。这条仲裁结果通过控制平面写回全局状态数据分析代理收到状态更新事件后自动基于新数据重新计算。整个过程里项目经理没有直接跟任何一个AI对话他所有指令都发给协调者所有需要他确认的信息都由系统主动推到他面前。三个AI之间默默把各自负责的部分做完谁先谁后、谁依赖谁全部由调度中心管理。这个场景验证下来我最满意的一点是人没有被淹没在AI之间你来我往的消息里他只在自己必须决策的时候出现。这才是“代为交互”该有的样子。5. 常见问题与避坑清单5.1 高发问题速查表以下是这套系统跑了一段时间之后在实际运行中最常遇到的一批问题直接做成速查表现象常见原因解决思路Agent之间来回传错误的中间结论对输出置信度没有约束低质量结论混入主流程强制所有响应带confidence字段低置信度自动转仲裁上下文迅速爆掉token费用飙升全局共享记忆无节制增长定期摘要压缩旧讨论转摘要只保留结论多个Agent互相等流程卡死缺少统一超时和看门狗机制所有子任务设超时超时自动重试一次再失败转人工消息满天飞日志完全没法看事件和请求混在同一个通道事件总线与任务队列分离全局链路追踪落到task_id上人工裁决后Agent还是按旧数据干状态变更没有触发订阅方刷新状态变更发event事件订阅方收到后主动拉最新状态部署到国产ARM环境后依赖装不上默认下载了x64版本的程序或SDK预先检查架构标识按平台选择arm64包在CI流程中固定架构这六个问题里前两个是我早期踩得最深的。尤其是第一个早期版本没有置信度机制一个Agent用一条错误中间结论往下传后面所有Agent都跟着错最后错误结论还堂而皇之进了对外交付的PPT里。被人在评审会上当场指出来场面极其尴尬。5.2 几条花了不少代价才换来的实操心得最后说几条我在这个项目里真正花代价换出来的经验。第一Agent的角色定义绝不是一个System Prompt就能搞定的。只靠提示词设角色Agent不知道该调用什么工具、不知道自己的权限边界、不知道哪些消息该自己处理哪些该转出去。我最后把角色定义拆成三份配置身份配置它是谁、能力配置它能用什么工具、边界配置它不能做什么、什么情况必须上报。三份配置分开管理改起来才不会牵一发动全身。第二调试多Agent系统最有用的工具不是日志而是事件重放。你调一个两个Agent的时候看日志够用一旦五个Agent并行跑起来日志之间根本没有统一的时序感。我后来把系统所有交互消息都存了一份事件流回放的时候能把每一秒发生了什么、谁给谁发了什么、谁为什么那样决策完全还原出来。同样是解决一个bug用事件重放定位的时间是看日志的五分之一。所以从第一天开始就记录所有交互消息这个成本千万不要省。第三不要追求“全自动”一定要保留人工介入的开关。这套系统早期设计时强调自主性结果出了几次问题之后发现越是关键决策越不能交给Agent全权处理。现在的原则是“机器干活人来把关”Agent负责执行和提出建议但关键节点必须保留人工确认的入口。前置设计好这个通道比我等到出了问题再补要省力得多。第四模型能力会迭代但消息协议要稳定。我最早把消息里的一些语义直接耦合到当时用的模型输出格式上后来换了一个更强的模型输出风格变了整条消息链路都得跟着改。重构一轮之后我规定所有模型输出必须先经过一个格式转换层转成统一的消息结构才能进入系统。模型随便换协议不出错。说句实在话这套“基于AI代理代为交互”的架构做到现在我最深的感受是多AI协同的瓶颈从来不是单个模型聪明不聪明而是消息设计得稳不稳、状态收敛得准不准、人在关键节点上有没有发言权。把这三点想明白系统就成功了一大半。后面我打算在这个基础上继续扩展不同行业里的落地场景让这套架构从实验原型慢慢长成真正能用的协作底座。