ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI代理作为交互中介:多Agent协同架构设计与实践

AI代理作为交互中介:多Agent协同架构设计与实践 最近一直在折腾多Agent系统的落地圈子里面聊得最多的一个话题就是当参与方从一个人对一个大模型变成多个人对多个AI的时候交互关系应该怎么设计直接让所有人都拉着各自的AI进同一群聊实测下来乱成一锅粥。今天想聊聊我这边的一个思路沉淀——把AI代理作为交互中介让代理与代理之间完成协同而不是让人类与AI直接高频互怼。无论你是做企业内部智能助手、多人协作工具还是研究AI系统架构这篇文章应该能提供一个相对完整的参考框架。我尽量把这些年做系统设计踩过的坑、想通的事、验证过的方案都写透。1. 整体设计思路与核心需求解析1.1 为什么不能让人直接跟多个AI对话我一开始觉得最自然的协同方式就是把人拉一个群把AI拉进群大家互相看消息有需要就艾特对应的AI。这个方案看起来直观实际上体验非常糟糕。第一个问题是上下文撕裂。群聊里每个AI都在看同样的历史消息流A模型对某个问题的理解被B模型的长篇输出带偏B模型又把A模型的错误结论当作前提继续推导。几轮下来整个上下文树就变成了一团乱麻。做系统的人都知道这种模式下没有任何一个Agent能拿到干净、稳定、可回溯的输入。第二个问题是响应竞争。多个AI同时输出的时候用户到底听谁的靠时间戳排序靠消息长度这些手段都不能真正解决结论冲突的问题。群聊里没有仲裁机制没有优先级回退最后一定是低质量重复内容的集合而不是协同后的高质量结论。第三个问题是身份与权限的颗粒度。现实中人和人协作是有角色和边界的但群聊模型无法表达这条消息只允许财务Agent和项目负责人的代理可见更没法将人类从高频交互中解耦出去。所以我最终选择了一个更重、更结构化、也更可控的架构AI代理代替人类完成交互。1.2 代理代交互的本质逻辑什么叫代理代为交互我的定义是人类用户不直接操作任何一个AI模型而是给自己的代理下达目标、提供资源和约束条件代理之间通过一条统一的消息总线进行交互代理可以在必要的时候回传请求让人类确认。这样就形成了一层完整的代理中间层。这层中间层解决的事情其实跟企业里的中层管理者非常像。代理负责理解上级人类的目标拆解成任务分派给执行方各类AI模型然后再把多方结果整合成一份结论上报。目标、上下文、资源调度都集中管理而不是让各方直接互相拉扯混战。从架构上来讲这属于典型的多智能体系统MAS思路但和传统MAS有本质区别的是传统MAS假设Agent都是同一套体系下的协作单元而我们的场景里底层模型可能是不同的开源模型、云服务、甚至外包的专用小模型代理层必须做到模型无关。这一层就是全系统最关键的一个抽象边界。1.3 核心场景与目标用户定位这套架构瞄准的场景大致有三类。第一类是研发团队的AI辅助评审。团队里有多个方向的工程师前端Agent、后端Agent、测试Agent各自负责维护专属知识库当产品经理的代理发布一个新需求之后各方向代理并行评估影响面最后由主代理合成一份综合评审报告。第二类是跨部门数据协作。财务、市场、生产三个部门的代理各自有权访问对应内部系统的数据通过代理间协议完成数据摘要交换不暴露底层数据。第三类是复杂任务研究。比如方案调研多个AI代理分别从材料学、工艺、成本、供应链这几个维度掌握信息最后汇总成结构化建议。这三类场景有两个共同点并发性强参与方多但目标一致结论需要整合而非堆砌。如果你正在面对的场景也有这些特征那这套架构的思路对你是适用的。2. 架构分层与核心角色定义虽然我画过很多版本的结构图但本质上可以归结为四层交互接入层、代理虚拟层、协调调度层、基座模型层。下面逐层拆解。2.1 交互接入层把人类从消息洪流中解耦交互接入层处理的是人类用户和系统之间的边界。在这套架构中用户客户端只与自己的代理通信不直接订阅其他Agent的输出。用户发的是目标指令比如调研三种异构部署方案的功耗差异收到的是代理合成后的结构化结论附带来源索引和置信度而不是一堆原始模型输出。接入层的协议设计很关键我们用的消息格式是自描述的JSON文档包含消息的唯一ID、发送代理ID、目标代理ID或广播域、类型意图说明/请求协作/结果发布/请求确认、内容体结构化数据而非自然语言原文、以及可追溯的引用关系。强调内容体结构化而不是自然语言是因为代理间协商如果来回传散文解析效率和准确度都会大幅下降。人类的确认请求Human-in-the-loop也走接入层。交互代理在某些关键动作前会返回一个确认卡给用户确认卡上列清楚执行动作、影响范围、所需权限。实测下来确认卡比开放式的聊天文本更容易让人快速做决策用户点起来也果断得多。2.2 代理虚拟层每个参与者都拥有一个专属代理这一层是整个架构中我投入研究精力最多的部分。代理虚拟层里的每个Agent本质上是三块功能的组合。第一块是感知功能。我把它做成了一套独立于模型的能力模块包含规则解析、上下文获取、用户状态感知、内部工具接口的封装。感知模块会把用户的原始指令转换成结构化的任务状态机状态之间有明确的依赖关系。比如先调研→再对比→最后给出建议状态机好了之后后续所有协调工作都基于状态来触发而不是靠语义猜测。第二块是决策功能。这里才是大模型发挥核心作用的部分。决策模块接收状态机当前的节点和所有输入数据使用基础模型生成行动计划。决策并不是每一步都调大模型很多确定性路径我直接写成代码或规则只有真正需要推理的部分才走模型推理这样可以大幅降低响应延迟和费用。第三块是表达功能。也就是把决策结果转成符合协议的消息按目标代理的期望格式做结构化输出。表达模块应当能够做格式协商对方要表格就给表格对方要JSON就吐JSON。每个代理都有独立的状态存储我用的是类似内存三态外部持久存储的组合。轻度交互状态在原地保存重大决策记录、消息副本和任务快照全部落到持久层。2.3 协调调度层多代理的仲裁与优先级代理虚拟层解决的是单代理的内部逻辑多个代理之间怎么配合需要协调调度层来定规则。这层我做了一个调度中心本质上是一个带优先级的消息路由器。每个代理启动时注册自己的能力标签比如capability:cost-analysis路由组件维护一张能力路由表。当某个代理发布协作请求时调度中心不再是简单地广播给所有人而是依据能力标签定向投递。仲裁策略也是这层的核心。多个代理对同一问题给出不同结论时我们不去轻信任何单一模型而是设了一套加权决策规则。权重来自于历史准确率、置信度、权威等级用户预先配置的偏好最后产出一个决策结果以及决策依据说明。这个说明在体验上极其重要因为人会不信任没有解释的结论。调度中心还负责整个系统的时序一致性。多Agent并行执行时有的快有的慢调度中心会根据依赖关系决定哪些代理可以并行、哪些必须等待上一步产物。这其实比人肉协作的效率高得多因为状态依赖被显式建模了不会被遗忘。2.4 基座模型层本地模型与远程模型的统一接入这套架构最底下一层处理模型接入问题。我见过很多多Agent项目是绑定某一个大模型厂的API来做的好处是省事缺点是系统的上限就是那一个模型的能力上限。我更倾向于做一个模型接入网关统一封装不同模型的调用协议。网关支持两类模型源。一类是远程模型API适用于复杂语义理解、开放域生成的大型模型另一类是本地模型用llama.cpp或者vLLM拉起开源模型跑在本地GPU节点上。两类模型实际上在代理虚拟层看来都是统一的推理接口区别只是在延迟、吞吐、成本三个维度打了不同的标签。强调一下基座模型层是不应该有业务逻辑的。代理的决策编排属于虚拟层的职责模型层只负责文本生成、逻辑推理、结构化抽取。这样如果换了更强的模型整个上层依然可以保持稳定。架构的可替换性在这个场景里不是理论需求而是实际被验证过很多次的需求——某个模型在某些类型任务上不行我们直接替换掉它业务链路完全不用改。3. 多人多AI协同的通信与协作机制架构定义清楚角色之后最复杂的问题就来了这些代理之间到底怎么通信、怎么同步、怎么避免冲突。这一章我讲通信协议、协作模式和并发控制三部分。3.1 代理间通信协议消息总线与定向投递代理间通信不讨论自然语言交互核心是消息总线。我参考了分布式消息中间件分布式交换机的思路把消息路由做成一个轻量级的交换核心每个代理与交换机之间维持一条长连接消息进入交换机之后交换机根据目标地址决定是单播、多播还是广播。单播用于两个代理之间的深度协作多播用于一个小团队内定向发布广播只用于探索性请求。做这套机制之前我犯过一个错误让代理之间直接互相点对点直连。看起来没有中间层更高效实际上代理数量一多连接数就爆炸了而且新代理加入时找不到能协作的伙伴。消息总线看起来多跳了一跳却换来了拓扑的收敛和运维的简单。协议层面我定义了五种核心消息类型意图发布、能力查询、任务投标、结果提交、反馈回执。意图发布用来宣告我有一个需要协同的问题能力查询用来搜索谁能处理某个标签的任务任务投标用来竞争承担任务结果提交是交付成果反馈回执是双向的发送方告知接收方你的成果我用了/无法采用。这套状态机跑顺了很多原本混乱的信息流转就变得清晰了。3.2 多人角色建模与权限隔离多人场景最容易被忽略的是人这个维度的建模。单个用户的代理上下文和另一个用户的代理上下文默认情况下必须相互隔离。要实现多人关联的协同时我引入了一个虚拟协同域的概念。协同域是一个动态创建的消息作用域只允许加入该域的代理看到域内的消息。域内再分角色角色定义了读写权限。比如一个研发评审委员会协同域里架构师代理可以读写评审观察员代理只读外部专家的代理只能看到被分享的视图。这套建模非常贴近现实工作流每个代理拿到的信息不是全局的而是与自己的角色匹配的信息切片。权限隔离在技术上实现不复杂但架构层面如果不从一开始设计后期加上去会非常痛苦。我的建议是每个代理的消息收发函数都必须显式声明目标域和角色不允许跳过校验。3.3 协同流程编排与冲突消解多人多AI协同过程中流程编排是主线。我实现了两种编排模式顺序链路和并行聚合。顺序链路适合那种前后依赖明显的任务流比如可行性分析→初步方案→成本核算”这种每个Agent的输出作为下一个Agent的输入。并行聚合适合那种各维度互相独立的任务比如市场分析和竞品调研可以同时跑最后汇总。调度中心里对每个代理发布了任务之后会维护一张依赖DAG有向无环图只有当一个节点的所有上游依赖完成后它才会被触发。冲突消解是另一件必须认真设计的事。代理并行返回的结论中经常存在相互矛盾的条款我采用的方式是创建冲突协商消息把两个矛盾的结论丢给专门的仲裁Agent或者必要时直接发起一次代理间辩论。辩论不是无限轮数而是设定最多三轮每轮每个代理允许发表一次观点最后仲裁代理做决策。实测中限定轮数后的辩论效率很可观而且能让人类用户看到矛盾点的清晰摘要。3.4 并发控制与状态一致性多代理协同最容易翻车的是并发一致性问题。多个代理同时修改一个共享状态比如同时向同一个任务文档追加结论处理不好就会互相覆盖。我最终采用的做法是事件溯源不共享可变状态所有状态变更都以追加事件的方式发布到总线的持久通道上。每个代理都从持久通道读取与自己相关的事件然后在自己的本地构建出当前状态视图。冲突的解决不再是锁机制而是事件顺序。这件事给我最大的启发是在分布式多代理系统里锁定往往不如记录事实顺序更可靠因为代理挂了还能通过重放事件恢复状态锁却没办法恢复。4. 底层系统架构选型与支撑组件剖析这套AI协同架构跑在实际物理环境里底层的系统架构选型会直接决定整个系统的稳定性上限。这个章节我结合自己实际搭建环境的经验把涉及系统架构层面的几个关键技术点拿出来拆解。4.1 本地模型服务的部署形态与硬件资源规划我们的系统里有一部分Agent跑远程模型但涉及内部数据敏感的任务必须走本地模型。本地模型部署的硬件规划有几个关键点显存容量决定模型规模内存带宽决定推理吞吐存储介质决定模型加载速度和上下文缓存效率。以一台双路服务器为例我们配置了4块GPU加速卡。模型并发加载时显存占用是线性累加的所以规划时不能只看单卡负载而是要估算所有同时驻留模型的显存峰值。本地模型的推理服务我用的是支持连续批处理的推理框架吞吐比朴素逐请求推理能提升一个数量级。如果你只是小规模原型验证用llama.cpp也足够但在多人并发的产线环境排队和批处理机制不可少。4.2 IOMMU与系统资源隔离对代理运行的影响聊到本地模型节点运维时IOMMU是一个绕不开的话题。IOMMU输入输出内存管理单元承担着设备访问内存的地址翻译和访问控制对于需要多GPU直通和多设备并发访问的场景它起到了隔离关键作用。这张虚拟化技术底层的系统架构和我代理层的隔离思路是同构的都强调每个单元只拿自己该拿的资源不互相越界。在启用IOMMU的平台上做GPU设备直通时整个系统更稳定驱动崩溃不容易拖垮宿主。但IOMMU也有代价就是性能开销。高频小包数据的DMA传输在IOMMU开启时吞吐会有所下降。所以在架构部署上我把延迟敏感的控制面消息走非直通路径把大批量推理张量走直通路径两个路径互相隔离。4.3 异构节点与启动部署策略由于硬件资源不同整个集群由异构节点组成部分节点是x86架构的传统服务器部分是基于ARM架构的低功耗推理节点。ARM节点跑一些小模型的功耗优势非常明显但要处理编译兼容问题。这里给个建议多Agent系统如果涉及异构节点一定要在交付部署流程中提前统一容器镜像或使用带构建缓存的可复现方案。有次我需要在一台ARM设备上外部挂载系统安装环境重新拉起完整的代理运行时栈整个过程中最大的成本就出现在交叉编译和本地化适配这块。后来我意识到这类场景的价值并不是教你如何在某种特定设备上把系统装起来而是提醒你在异构架构面前部署脚本里多写一行针对架构的兼容判断后面能帮你省下无数组装调试时间。而系统的安装引导介质在这个语境中不是在讨论某种特定操作系统而是泛指一套代理运行时的完整装配流程。4.4 轻量网关与流量调度优化多人多AI同时在线时代理消息和模型推理请求会产生双重的负载。我专门拆了一个轻量网关出来负责流量调度它做的事情和分布式交换机很相似维护每个代理的连接状态、平衡消息队列的消费速率、识别热点话题并把对应的推理请求优先调度到空闲模型。这个轻量网关还承担了代理实例的服务发现职能。每当一个新的代理实例上线它注册到网关网关把它加入到能力路由表。当某个代理实例异常宕机网关会把它从路由表摘除并将该代理域内的消息自动转交给指定备份代理。这一套机制保证了代理层的高可用性而参考的正是传统分布式系统架构设计的成熟经验。5. 实操过程与核心环节实现理论讲了很多实际搭建这套系统时我遵循的步骤、踩过的坑、以及最终跑通的配置值得完整记录下来。这一部分我把从零搭建的流程拆开尽量做到可以直接参考。5.1 最小可行架构的实现步骤先搭一个最小可运行的版本。我建议从两代理一调度中心的规模开始不要一上来就搞十个Agent。第一步本地拉起一个开源模型的推理服务确认它可以通过OpenAI兼容接口响应请求。第二步实现一个最小代理运行时它包含我刚才说过的感知、决策、表达三个模块这里不需要接复杂状态机先用最简单的if-else规则串联。第三步实现一个最小化的调度中心支持消息投递和简单的能力注册表。这个最小版本看起来简陋但它能极快地验证整条链路是不是通的。我实际跑通之后的第一感觉是链路通是一切的前提后续的所有复杂功能都建立在这条链路的稳定性之上。5.2 代理配置与消息协议定义示例下面给一份代理配置的示例。这套配置里我们定义了一个财务分析代理它注册了自己的能力标签、消息兴趣域和使用的模型。比如某个代理的配置会列出代理ID、名称、能力标签、模型接入参数。真正实现中我们定义的关键是确认每个代理只处理自己职责范围内的事件事件通过一个统一的消息入口进入处理流程处理结果通过出口发送回调度中心。整个过程中代理并不直接解析自然语言消息而是解析结构化的任务对象。这个细节相当重要因为大模型之间的消息如果全靠自然语言互相理解信息损失是累积的。5.3 代理调度的核心算法与策略权衡调度算法的核心问题是一个任务到达调度中心时应该由哪个代理来执行。我选择了基于能力匹配加负载加成本的三元路由。能力匹配是第一关代理必须拥有对应能力标签才能胜出。负载是第二关当前队列长度超过阈值的代理自动降权。成本是第三关同样能完成任务的前提下优先使用便宜的那个模型。这套策略里有一个看起来反直觉的设计我不要求调度中心做全局最优调度而是用贪心策略。原因是我所有代理都是独立自治的全局最优需要每个代理实时上报完整状态代价太高。贪心策略虽然上限略低但在系统设计里可预测性和系统稳定性往往比峰值性能更重要。5.4 模型路由与推理成本控制经验实际运行过程中我发现费用控制的最大杠杆在模型路由。同一个语义解析任务用本地小模型跑和用超大模型跑结论质量可能差距不大但成本差距可能达到几十倍。我在架构里设计了一个采样回退机制先对这个任务预估难度简单任务直接发到小模型只有高难度任务才落到大模型。这个预估可以由代理的状态机提供比如至今为止已经连续三次收到冲突结果时升级到大模型做仲裁。日志统计显示这套成本路由策略能够在不明显降低结论质量的前提下把单任务的平均推理成本降到原先的35%。这是我个人实践中最直观有效的一项优化。5.5 强化学习调参与性能指标的观察记录在平稳运行一段时间后我对系统做了一轮性能观测。关键指标有三个端到端响应时延、消息丢失率、多代理并发成功完成率。实测里端到端时延主要被模型推理时间占据消息传递本身的开销很小。消息丢失率在一个消息量很大的模拟压测场景中开始恶化后来定位是因为某个代理的连接池配置过小导致大量消息被拒绝。调整连接池参数之后这个问题就消失了。我的体会是这类系统的瓶颈往往不在AI模型的智能水平而在于基础设施的工程能力。智能再强的模型如果消息通路不可靠、状态恢复不完善整体体验也会被拖垮。6. 常见问题与排查技巧实录6.1 代理间消息风暴与干扰问题最典型的问题就是消息风暴。当多个代理出现递归协作比如A问BB为了回答又去问CC回来之后B又追加问A消息量会指数级暴涨。我开发的排查手段是限制每个任务生命周期内的最大消息跳数超过跳数自动触发保守回退策略。同时每个代理都必须设置最大并发协作数达到上限后新的协作请求直接进入等待队列不允许在同一时间再开分支。6.2 决策冲突与上下文污染问题冲突问题是多AI系统绕不开的坎。表现为两个代理的结论完全矛盾或者A代理决策时错误使用了B代理内部对话中的上下文。排查发现不少上下文污染是由于协作域边界校验不严导致的。为此我在消息总线上加了一道严格的域校验中间件所有消息在投递前强制校验接收方是否拥有对应域的读权限。这个改动上线后上下文污染事件下降了九成。至于结论矛盾我的经验是永远不要把矛盾藏起来要在最终报告中显式展示冲突方和冲突原因让人类用户做最后仲裁。6.3 响应延迟与资源调度瓶颈问题当并发用户数增加时模型推理的排队延迟会上升。这个问题的排查思路很明确先检查是CPU/GPU型瓶颈还是内存型瓶颈。我们的案例里瓶颈在GPU显存带宽原因是多个大模型同时驻留。解决方式是把不常用的大模型在空闲时卸载切换到轻量模型处理简单对话让用户感知不到有换模型。资源的问题本质上是配置规划的问题建模考虑峰值比考虑稳态更必要。6.4 代理死锁问题两个代理都在等待对方先完成任务时会出现死锁。我给出一个不太常规的解法允许死锁发生但调度中心通过超时机制检测超时的协作任务然后主动注入一条中断消息强制其中一方先行产出部分结果。这个机制我很常用它不追求预防死锁的理论完美性而是在工程上给了一个能够自动恢复的安全网。7. 一些长期迭代的心得这套架构陆陆续续迭代了几个月踩过无数坑之后想分享几点长期思考。第一不要追求让代理完全代替人类做决策。最好的体验是人掌握目标定义权代理掌握执行权与信息整合权。出现关键分歧时一定要有人类的确认环节。第二架构要设计得像可以随时换零件的机器。大模型领域迭代太快模型一定是最容易过时的那层你在代理层、调度层越抽象换模型的时候就越从容。第三多Agent协同系统的上限由最不可靠那一个模型决定而不是最强的那个。与其把十个模型都调到最强不如先把最弱的那个代理换成稳定可靠的专用小模型。最后再补充一个我一直很建议的做法把代理之间的所有消息从第一天起就做完整持久化。哪怕当前看起来用不上这些消息日志在后续排查问题、复现故障、优化决策权重的时候都是无可替代的宝库。这个习惯能让你在系统演进的每个阶段都心里有底。
返回列表