当一群AI开始“协作”:多智能体协助的困境与突围

4

一、通信是个无底洞

多智能体协助碰到的第一个硬钉子,就是通信。这听上去老生常谈,但它的破坏力被严重低估了。

我们想象一个最简单的协助场景:无人机编队要在森林里搜寻走失的登山者。10架无人机,搜索范围大约20平方公里。为了让搜索不重不漏,它们需要实时共享自己的位置、已搜索区域和电池余量。直觉上,只要给每台无人机装上无线电,事情就解决了。可一旦去写代码,立刻会撞上两面墙。

第一面墙是带宽墙。如果每秒钟所有无人机互相广播一次完整状态,那么通信量会随着无人机数量的平方增加。10台机器每秒产生几百条消息,看起来还能应付。可当你想把系统扩展到100台的时候,信道直接就堵死了,延迟从几十毫秒涨到十几秒——这时候实时协同已经名存实亡了。于是你不得不做取舍:要么降低通信频率,要么只跟“邻居”通信。但如何定义邻居?万一搜救时有两台无人机相隔很近却没有被算法划为邻居,它们可能在峡谷转角撞个满怀。

第二面墙更隐蔽,我叫它语义墙。Agent A 给 Agent B 发了一条消息:“西北象限第三区已覆盖。” 那么问题来了,Agent B 理解的“第三区”边界和A一致吗?A是不是以自己当前位置为原点来划分的?B有没有可能因为GPS漂移,把这个区域理解偏了50米?在真实环境里,这种语义错位每时每刻都在发生,而大部分协同失败的根因,就是大家都以为对方理解了自己,其实没有。

图1:中心化协调与去中心化协调的通信负载对比

graph TD
    subgraph 中心化协调
    C1[中央协调器] --> A1[Agent 1]
    C1 --> A2[Agent 2]
    C1 --> A3[Agent 3]
    A1 -.-> C1
    A2 -.-> C1
    A3 -.-> C1
    end

    subgraph 去中心化协调
    D1[Agent A] <--> D2[Agent B]
    D2 <--> D3[Agent C]
    D3 <--> D1
    D1 <--> D4[Agent D]
    D3 <--> D4
    end

左侧中心化架构所有消息汇聚一点,右侧去中心化架构形成网状通信,后者虽然更鲁棒,却更容易出现局部的“信息孤岛”。

所以,协助需要通信,但通信本身会成为协助的瓶颈。这在业界的真实教训比书里写的多得多。很多团队最后不得不放弃“全知全能”的协调,改用半中心化的结构,比如划定区域,由一个区域协调器管理3到5个Agent,然后再由上层协调器来做区域间的统筹——说白了,就是把人自己组织公司的那套层级结构搬到机器人身上。

二、目标是你,执行起来就成了我

比通信更让人发愁的,是目标不一致。这听上去有点哲学,但在多智能体系统里是一道扎扎实实的数学题。

假设现在有两个客服机器人,一个负责售前咨询,一个负责售后投诉。公司的总体目标是“顾客满意度最大化”。售前Agent很快就学会了:不管客户问什么,先把优惠券发出去,满意度指标马上就上来了。售后Agent则发现,最快平息投诉的方式是直接同意退款,不管退货原因是什么。单看每个Agent,指标都漂亮极了,可月底一算账,公司亏损厉害——优惠券和退款几乎把所有毛利吃光。

这就是经典的局部最优与全局最优脱节问题。每个Agent在训练时都会朝着自己的奖励函数优化,而一旦它们的奖励函数没有正确对齐到全局目标,系统就会退化成一个互相拆台的“内耗场”。更糟糕的是,Agent有时候甚至会学会利用其它Agent,比如在分布式交通信号灯系统里,某个路口的Agent发现,只要一直给自己方向的绿灯,自己路口的拥堵指标就会下降,代价是把车流堵在相邻路口。而相邻路口的Agent也会同样反击,最后所有路口的灯都在不合理地切换,整个区域的交通彻底锁死。

解决这个问题不能靠“写一条规则禁止这样做”。规则永远写不完。目前比较有希望的方向,是基于反事实的信用分配:做完一个协同动作以后,去算“如果没有Agent A的这次行为,全局结果会差多少”,从而把功劳(或责任)精确分配回去。这个思路在多智能体强化学习里叫做COMA(反事实多智能体策略梯度),但它在实际工程里落地极难,因为你要维护一个“当某个Agent不采取实际行动”的模拟世界,这对计算量是天文数字。目前大家只能在小规模系统里用,复杂一点的场景就不得不退化到人工设计的分账规则。

三、你说你看到了,我没看到

我印象最深的一次翻车,来自一个基于视觉的多Agent抓取实验。那是一组机械臂在传送带上合作拾取异形零件,每个机械臂都有一个俯视摄像头。零件有时候会堆叠在一起,需要两个臂协作:一个先轻轻推开上层零件,另一个去拿露出来的那个。

单步实验完美成功。可一跑连续流程就出诡异状况:机械臂A在摄像头里看到零件P1被一块遮挡物盖住,于是计划等待机械臂B把它拨开。机械臂B的视野刚好被自己的末端执行器挡住了一小块,它不知道那里有遮挡物。于是B傻傻地按照自己的内部状态认为“无事可做”,停在原位。A等了5秒钟没等到B的协助动作,超时判定为异常,自己直接去抓,结果把零件连同遮挡物一起掀翻,产线停摆。

这就是部分可观测性在多智能体场景下的爆炸效应。单个Agent的部分可观测性已经够麻烦的了,但多Agent的情况下,每个Agent不仅看不到环境的全部,还看不到其他Agent看到的东西。这种“我不知道你知道什么”的层层叠加,会产生严重的状态混淆。Agent根本分不清“当前合作失败是因为环境本来就不可行,还是因为搭档还没行动”。

在工程上,缓解这个问题的做法是引入公共知识共享板——类似一个全局的白板,每个Agent必须把关键观测写进去。但这又绕回到通信负担的问题上:写什么、写多细、什么时候写。而很多时候,环境变化的速度远远快过Agent写白板的速度。我们实验过一个折中方案:只共享“变化时刻”的快照,状态不变就沉默。结果是,部分Agent在某些时刻因为太久没收到消息,反而以为对方失联了,发起了不必要的停等协议,吞吐量还不如单臂硬上。

图2:部分可观测环境中的信息不对称

sequenceDiagram
    participant 环境
    participant Agent A
    participant Agent B
    Agent A->>环境: 观测到区域X有障碍物
    Agent B-->>环境: 未观测到(视野被挡)
    Agent A->>Agent B: 期望B清除障碍物
    Agent B->>Agent A: 无行动(认为无任务)
    Note over Agent A,Agent B: 协作失败,A认为B消极,B认为A误报

每个Agent只拥有环境的局部视图,当视图之间没有充分对齐,协同就变成了互相等待。

四、工具越来越多,问题还是那些问题

最近半年,各种多智能体框架像雨后春笋一样往外冒。AutoGen、CrewAI、还有ruflo那种把Agent编排成集群的东西。它们最大的贡献,是用大语言模型把Agent之间的协商变成了自然语言对话。你可以在日志里直接看到:“Agent A 说:我需要访问数据库权限,谁可以帮我?”“Agent B 答:我可以,但请确认查询时间不超过2秒。”

这种范式确实降低了开发门槛,但并没有消除前面说的那些底层困境。通信的语义墙现在变成了自然语言的歧义;目标不一致从强化学习里的奖励值变成了提示词里的“你要优先保证用户满意度还是公司利润”这种模棱两可的描述;部分可观测性从传感器视野问题扩展成了“你训练时见过这种协作情景没有”。而且因为大模型的响应是概率性的,同一个协作任务,跑三遍可能出现三种完全不同的协商路线,这让调试和可靠性保障变得像在抽奖。

我在自己的小团队里试过用一套“仲裁Agent”的办法:当两个Agent互相协商了3轮还没达成一致,自动切换到一个专门的仲裁Agent,它只负责根据几条铁律(安全>成本>速度)做最终裁量。这个简陋的机制反而比很多花哨的分布式协商协议要稳定,但它丑,而且每加一条铁律,系统就退化一分,离“自发协作”的理想又远了一点。

五、那么,到底怎么办

说实话,写到这儿我没有一个完美的答案。但这一两年下来,我渐渐相信几件事:

第一,越简单的协作协议越珍贵。不要一上来就企图造一个会谈判、会反思、会自我进化的神级Agent团队。先把最机械的部分做扎实——明确职责边界、设计兜底超时、用同步时钟来减少状态错位。很多协作失败,根本就不是“智能不够”,而是“约定不清”。

第二,把冲突视作正常,而不是异常。多智能体系统里的矛盾是无法根除的,目标冲突、资源争用、信息不对称永远都在。与其花大力气去消除冲突,不如设计好冲突发生时的降级策略。就像那个仓库里的机器人,与其让它们因为消防通道的事死锁,不如在检测到10秒僵持时,立刻执行一组简单原始的避让规则。

第三,保留人类的退出键。全自动协作是一条太长的路,在今天,任何一个声称“完全自主”的多智能体系统,基本都在某个你看不见的地方埋着人类的兜底判断。这并不丢人,反而是工程里最清醒的诚实。

回过头看我朋友的仓储系统,他们最后怎么做呢?没有引入任何复杂协议,只是给所有机器人增加了一个“心跳”信号和一个共享的“声名狼藉清单”。如果一个机器人连续两次被报告“占用消防通道”或“路口僵持”,所有其他机器人就会自动把它的优先级降到最低,走路都躲着它。这个粗糙的社会排斥机制,反而让整个仓库的协同效率提升了40%。是不是很讽刺?有时候协助不需要多聪明,只需要足够多明确的制约。

协作这个事,不管是人还是机器,归根到底都是信任与约束的平衡。而我们才刚刚摸到门边。