周六晚上,一家老字号餐厅的后厨进入白热化状态。主厨一个人要面对几十张订单,既要洗菜、又要切配、还要同时看两口锅,手忙脚乱,顾客久等,差评一堆。老板痛定思痛,把后厨改造成一条流水线:有人专职切配,有人专职炒菜,有人专职做甜点,传菜员只负责把订单和菜品送到对应窗口,主厨只做“排菜”和“把关”。每位师傅都只擅长一两个拿手活,但整条班子一运转,出菜速度反而翻了几倍。这就是协作的力量——单个师傅能力有限,一个组织起来的分工体系却能扛住整条街的客流。 这篇文章要讲的SLM多Agent协同框架,就是把同样的思路用在“小语言模型”身上。单个SLM参数少、能力薄,干不了复杂的任务;但若按角色把多个SLM组织成一支“AI后厨班底”——有人拆解任务、有人执行计算、有人传递消息、有人审查结果——它们就能在手机、智能音箱、车载盒子这类资源有限的设备上,完成过去只有云端大模型才敢接的复杂活儿。接下来,我们就从后厨的视角,一步步拆解这套框架的设计要点。
掌握SLM多Agent协同设计,你就能在算力稀缺的端侧设备上搭建复杂的多智能体系统,摆脱对云端大模型的依赖,这是端侧AI与多Agent系统交叉方向的核心竞争力。
可视化演示
展示小语言模型多Agent协同框架:编排器协调规划者、执行者、审查者三类角色,通过结构化通信协议实现任务分配与结果聚合。切换模式查看不同协作机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
多Agent协作架构 编排器(Orchestrator)负责任务分解、Agent调度与结果聚合 规划者制定计划、执行者完成任务、审查者校验质量 能力 = Σ Agent_i × 协作效率 多SLM协作弥补单模型能力不足
角色分工设计
后厨里没有谁是全能的。主厨不切菜,切配师傅不炒菜,传菜员不掌勺,品控师傅只检查不烹饪。每个人都只干自己最拿手的活,菜品质量才能稳定下来。SLM多Agent框架也遵循同样的逻辑:单靠一个“什么都会一点”的小模型,远不如把一个团队拆成明确角色、各守一摊来得可靠。
在SLM多Agent协同系统中,“角色分工”是最顶层的设计决策。一个典型的架构包含四种角色:决策者Agent负责拆解用户请求、决定子任务派发给谁;执行者Agent接收分配的任务,用自身的小模型能力完成具体子任务;协调者Agent维护整个系统的运行状态,同步各Agent进度,处理依赖关系;监督者Agent负责检查输出质量,过滤低质量或有害结果,防止“垃圾进垃圾出”。这四种角色既可以由同一个SLM通过不同提示词切换,也可以分配给多个独立的SLM实例。
如何判断一个任务该交给谁?我们可以用匹配度分数来量化。
这就像主厨在菜单上勾选“这道菜归哪个师傅”:川菜找川菜师傅,甜品找甜品师傅。角色分工的价值,就是让每个Agent永远只做自己最擅长的菜。
- 匹配度定义$P(A_i, T_j)$ 表示第 $i$ 个 Agent 执行第 $j$ 个任务的匹配度分数,值越高表示越合适。
- 能力的加权求和$\sum_{k=1}^{m}$ 对 $m$ 种能力逐项累加,每一项是能力权重 $w_k$ 与能力函数 $f_k$ 的乘积。
- 能力函数取值$f_k(A_i, T_j)$ 在 Agent 擅长该能力时返回 1,不擅长时返回 0,$w_k$ 表示该能力对任务的重要程度。
通信协议机制
后厨高峰期最怕传菜员对所有厨师喊“这个菜是谁的?”每个人都被打断,切配的手一抖,炒菜的火候就过了。所以餐厅规定了一套喊话格式:“五号桌宫保鸡丁”只有炒锅师傅响应,“三号桌蒸鱼”只有蒸锅师傅接。统一的喊话方式,就是后厨的通信协议。
Agent之间也一样。通信协议要回答三个问题:消息长什么样?消息怎么送达?谁优先送达?在SLM多Agent框架中,消息通常采用结构化的JSON格式,至少包含发送者、接收者、消息类型和载荷内容四个字段。路由方式主要有四种:广播适合一对多通知,比如决策者向所有执行者广播任务;轮询是接收方每隔一段时间主动查询消息队列,实现简单但实时性一般;令牌传递让一个令牌在环形网络里按顺序流转,只有拿到令牌的Agent才允许发言,从物理上避免消息冲突;优先级通道则为紧急消息开辟一条“快车道”,让高优任务插队。
通信不可能永远成功,所以协议还要考虑可靠重试。一条消息发一次可能会丢,重试 $n$ 次后到达的概率是多少?
传菜员喊一次没应就再喊一次,只要重复足够多次,厨师总能听到。通信协议的意义,就是让“喊话”既有格式可依,又有可靠的兜底。
- 单次成功率$p$ 表示一条消息单次发送成功的概率,例如网络状况良好时 $p=0.7$。
- 连续失败概率$1-p$ 是单次失败的概率,$(1-p)^n$ 是连续失败 $n$ 次的概率,值越小说明重试越有效。
- 重试总成功率用 $1$ 减去连续失败概率,得到重试 $n$ 次后消息至少成功一次的总概率,这是衡量通信可靠性的关键指标。
任务分配策略
主厨不会把所有凉菜都堆给一个师傅。他扫一眼每个人的排队数量,手头活儿少的师傅优先接新菜单。任务分配的本质,就是“能力匹配”和“负载均衡”的双重博弈。
在SLM多Agent架构中,任务分配的目标有三个:做得好、做得快、别累垮。能力匹配是硬约束,任务优先发给技能项命中的Agent;负载均衡用于防止某一个Agent的推理队列过长;动态调度在运行过程中根据实时负载持续微调;失败重试则在某Agent执行失败后把任务转交给下一个合适的Agent。
整体完工时间由谁决定?答案是系统里最慢的那个环节。设 Agent i 当前队列负载为 $L_i$,新任务预估耗时 $a_i$,则全体完工时间可以表示为:
主厨只要盯着最忙的那个师傅,保证他的排队不超阈值,整条出菜线就稳了。
- 单个Agent总耗时$L_i$ 表示 Agent i 队列中已有任务的预估总耗时,$a_i$ 是新任务的执行时间,两者相加是它要承担的总时间。
- 瓶颈最大耗时$\max_{i}$ 对全体 Agent 取最大值,这个最大值就是系统的最慢环节,也叫完工时间。
- 最小化目标任务分配算法的目标,就是通过合理安排新任务归属,让这个最大值尽可能小。
结果聚合机制
一道菜出锅前,主厨会亲自尝一口、看看色泽,还会让身边的师傅互相打量一眼。确认没跑味,才肯走菜。多个Agent分别给出答案之后,同样需要一个“走菜”环节——把零散结果聚合成一个可信的最终答案。
结果聚合要解决两件事:谁说了算?意见矛盾怎么办?常用的机制有四种。投票表决是最直接的方式,少数服从多数;加权融合更进一步,每个Agent按置信度或历史准确率拥有不同权重,权重高者的意见更算数;管道接力适合顺序型任务,比如一个Agent负责检索、下一个Agent负责总结、再下一个负责润色;冲突消解负责兜底,当不同Agent的答案严重冲突时,要么选置信度最高的,要么直接返回“不确定”让用户澄清。
多个Agent各自的投票如何合并成最终答案?加权投票的数学表达如下:
几个师傅都说“咸了”,那这道菜就真的咸了;只有一个人说咸、其他人沉默,那就按多数人的感受上菜。结果聚合,就是把个体判断升级为团队判断。
- 单个Agent的答案$y_i$ 是第 $i$ 个 Agent 给出的答案,可以是分类标签,也可以是生成内容的主题类别。
- 指示函数计票$\mathbb{1}(y_i = c)$ 是二值函数,当 Agent i 的答案恰为类别 $c$ 时取 1,否则取 0,相当于一张选票。
- 加权投票与胜出$\sum_{i=1}^{n} w_i \times \mathbb{1}(y_i = c)$ 对全体 Agent 加权计票,再用 $\arg\max_{c}$ 选出加权票数最高的类别作为最终答案。
架构设计原则
后厨的动线决定了出菜效率:备菜区、炒菜区、出菜口互不交叉,一个灶台坏了,其他灶台照常烧。多Agent系统也一样,角色和通信方式定好之后,还需要几条顶层架构原则来保证整个团队长期稳定。
第一条是去中心化。不要把所有控制逻辑放在一个Agent身上,否则它一旦崩溃全系统瘫痪。第二条是模块化插拔。每个Agent最好是独立模块,换掉一个执行者不必改动其他组件。第三条是协议标准化。消息格式公开统一,不同Agent之间才能自由互操作,新Agent也能即插即用。第四条是故障隔离。某个Agent出错时,错误应该被限制在局部,而不是沿消息链扩散传染。
这四条原则最终都指向一个量化目标——系统可用性。假设每个Agent的可用性为 $A_i$,系统只要有任意一个Agent存活就能继续运行,那么整体可用性为:
哪怕一个师傅临时请假,只要其他师傅还在灶台上,后厨就能继续出菜。架构设计给系统的“余量”,就是它在意外面前的底气。
- 单个Agent不可用概率$1 - A_i$ 是第 $i$ 个 Agent 发生故障的概率,可用性越高,故障率越低。
- 全体同时故障$\prod_{i=1}^{n}$ 把所有 Agent 的故障率连乘,得到它们同时全部故障的概率。
- 系统可用性用 $1$ 减去联合故障概率,得到系统至少有一个 Agent 可用的总可用性,它比任何一个单点都高。
资源受限适配
小店后厨就一张案板、两口灶,但照样能出菜单上的每一道菜。秘诀是什么?提前把复杂菜式的半成品备好,高峰时快速组合出餐。SLM要跑在手机、智能音箱、车载盒子上,同样得精打细算。
资源受限适配有四个常用手段。模型量化把模型权重从32bit浮点数压成8bit整数,内存占用直接缩到四分之一;内存调度通过分时复用和按需加载,保证多个Agent不打架;算力分摊利用多核CPU或NPU并行执行不同Agent的推理任务;离线运行依赖本地权重和缓存,断网也照常服务。这套组合拳,让“微型后厨”也能撑起整张菜单。
但压缩是有代价的。量化前后的数值差异,会直接影响模型输出质量。我们定义量化误差为:
菜谱从精装版变成口袋本,关键配料和火候比例还在,端上来的菜味道就差不了太远。资源受限适配,就是用工程手段把“味道损失”控制到最低。
- 量化前后差值$x$ 是原始模型的激活向量,$Q(x)$ 是经过量化再反量化的近似向量,两者相减得到损失。
- 平方范数误差$\left\| \cdot \right\|^2$ 对差向量的每个分量求平方和,把多维误差压缩成单一数值,误差越大说明量化越激进。
- 量化目标设计方案的目标是在内存约束下让 $E$ 尽量接近 0,使量化后的模型行为与原模型保持一致。
AI 应用场景
智能家居离线语音助理
阶段:端侧多Agent协作推理与任务执行
解决的问题:家中断网时,智能音箱无法调用云端大模型。单个端侧SLM既要听懂方言口音,又要理解设备控制语义,还要处理多轮对话,经常顾此失彼。多Agent分工后,每个SLM只负责一个窄环节,任务被拆解为“语音识别→意图解析→设备控制→结果复核”流水线。
具体案例:住户对音箱说“把客厅灯调暗一半,空调设到26度”。执行者Agent A完成语音转文字,执行者Agent B解析出“灯→亮度50%”“空调→26℃”两条指令,决策者Agent将指令分别派发给对应设备驱动模块,监督者Agent核对设备状态变化与用户意图是否一致,最终聚合输出“已为您调整”。
工业产线边缘质检
阶段:多Agent协作感知与结果聚合
解决的问题:产线上单个SLM只能识别一种瑕疵,精度不够且极易漏检。多个SLM各管一项检测指标,再由聚合Agent综合判断,既降低了单个模型的参数量,又提升了整体检出率。
具体案例:手机外壳质检线上,Agent A 检测划痕,Agent B 检测色差,Agent C 检测装配缝隙。三个Agent分别输出“合格/不合格”及置信度,协调者Agent收集结果后做加权投票:两个及以上判不合格则整机下线,否则放行。监督者Agent每隔一小时抽查聚合结果,防止某个Agent因数据漂移而失准。
Python 演示
import randomfrom collections import Counter class Agent: def __init__(self, name, role, skills): self.name = name self.role = role self.skills = set(skills) self.load = 0 self.mailbox = [] def receive(self, task): self.mailbox.append(task) def respond(self, task): if task["type"] in self.skills: return self.name, task["type"], 0.9 if random.random() < 0.2: return self.name, "guess", 0.3 return self.name, "none", 0.0 def dispatch(agents, task): best = None score = -1.0 for agent in agents: s = 1.0 if task["type"] in agent.skills else 0.0 s -= agent.load * 0.05 if s > score: score = s best = agent return best def aggregate(results, lead_name): votes = Counter() total = 0.0 for name, answer, conf in results: if answer == "none" or conf <= 0: continue weight = conf + (0.5 if name == lead_name else 0.0) votes[answer] += weight total += weight if not votes: return "none", 0.0 top = votes.most_common(1)[0] return top[0], top[1] / total def main(): agents = [ Agent("chief", "coordinator", ["plan", "route"]), Agent("worker_a", "executor", ["parse", "fetch"]), Agent("worker_b", "executor", ["classify"]), Agent("supervisor", "supervisor", ["verify"]), ] tasks = [ {"type": "parse", "text": "turn on light"}, {"type": "classify", "text": "cat photo"}, {"type": "plan", "text": "go to station"}, ] for task in tasks: lead = dispatch(agents, task) print("ASSIGN {} -> {}".format(task["type"], lead.name)) results = [] for agent in agents: agent.receive(task) results.append(agent.respond(task)) answer, conf = aggregate(results, lead.name) print("RESULT {} conf={:.0%}".format(answer, conf)) for agent in agents: if agent.name == lead.name: agent.load += 1 if __name__ == "__main__": main()
class Agent:定义一个Agent类,封装名字、角色(coordinator/executor/supervisor)、技能集合、当前负载和消息邮箱。def respond(self, task):Agent对任务作答:命中技能返回0.9置信度的答案,否则有20%概率随机猜一个低置信度答案,其余返回"none"。def dispatch(agents, task):任务分配函数:匹配技能得1分,再减去负载乘以0.05的惩罚项,得分最高者接单。s = 1.0 if task["type"] in agent.skills else 0.0能力匹配的硬编码逻辑:擅长该类型任务就加分,不然不加。def aggregate(results, lead_name):结果聚合函数:对每个有效答案按置信度加权,领衔Agent额外加0.5权重。weight = conf + (0.5 if name == lead_name else 0.0)权重设计:执行者本身置信度越高权重越大,被选中的主导Agent再加成。top = votes.most_common(1)[0]取加权票数最高的答案作为团队最终结果。agent.load += 1每次任务完成后给接单Agent增加负载,让后续分配自动避开热点。
常见误区
误区既然单个小模型能力弱,那开一百个也一样弱,不如直接上一个云端大模型,省心又强大。多Agent只是花架子。
正解这个想法忽略了一个关键事实——任务可以被拆解。单个SLM干不了“语音识别+意图理解+设备控制”的全链路,但每个环节只抽一个窄任务时,小模型完全能胜任。就像切配师傅不会炒菜,但切菜比大厨还快。多个SLM按流水线协作,能完成超出单个模型能力边界的复杂任务,而且功耗、延迟、隐私都优于调用云端大模型。
为何常见:人们习惯把模型能力等同于参数规模,忽略了系统架构设计和任务拆解也能成倍放大系统的整体能力。
误区启动好几个SLM实例,把用户的问题抛给它们,让它们在对话框里你一言我一语地“讨论”出答案,这就是多Agent协作。
正解无组织的自由对话必然产生混乱:谁先说?听谁的?消息格式不统一,Agent之间根本无法解析对方输出。真正的多Agent协同需要严格的角色分工、结构化的消息格式和明确的聚合机制。后厨里传菜员不能对着全厨房喊“菜来了”,必须喊“五号桌宫保鸡丁交给炒锅师傅”。
为何常见:Agent这个词让人天然联想到“自由对话”,忽略了工业级系统设计中对秩序和结构的依赖。
误区让所有Agent随时交换所有信息,沟通越多协作越紧密,系统应该更聪明。
正解通信是有成本的——每条消息都要占用带宽、消耗内存、增加推理时间。盲目高频通信会让系统陷入“闲聊”,甚至造成消息风暴。好的协同框架会设计合理的通信频率、精简消息内容,并用广播、令牌、优先级等机制控制通信开销。不是话越多越好,而是该说的时候说、不该说的时候闭嘴。
为何常见:直觉上“多沟通”总是好的,但资源受限的端侧场景下,通信开销直接挤占推理资源,反思这一点需要工程视角。
误区既然多Agent框架这么强,那我所有任务都让四五个Agent一起上,肯定比单个模型效果好。
正解多Agent协作会引入通信延迟、聚合误差和系统复杂度。对于“2+2等于几”这类简单任务,单Agent一步就能答对,强行协作反而降低了效率。好的系统会先评估任务复杂度:简单任务走单Agent快车道,复杂任务才启用协作班组。就像后厨小炒单锅单出,宴席才全班人马。
为何常见:学会一个框架后容易“手里拿着锤子,看什么都像钉子”,过度设计是工程师的常见冲动。
面试题
Q1. 在SLM多Agent协同中,负责把大任务拆解并派发给其他Agent的角色是?
- A.决策者Agent(拆解分派)← 正确答案
- B.执行者Agent(具体干活)
- C.监督者Agent(质量把关)
- D.协调者Agent(状态同步)
答案:A。决策者Agent负责拆解用户请求并决定子任务派发给谁,类似主厨排菜。执行者只管执行,监督者管质量,协调者管状态同步。选B就混淆了“规划”与“执行”两层职责。
Q2. 以下哪种通信方式适合一对多通知全部Agent?
- A.令牌传递
- B.串行单播
- C.广播发送← 正确答案
- D.点对点握手
答案:C。广播是一对多高效通知方式,决策者通知所有执行者时最合适。令牌传递用于避免冲突,单播和点对点都是一对一通信,效率上无法一次覆盖所有Agent。
Q3. 设Agent A负载为5,新任务预估耗时2;Agent B负载为1,新任务预估耗时3。按“最小化最大完成时间”应选谁?
- A.选择A,总耗时更短
- B.选择B,最大完成时间为4← 正确答案
- C.选择A,完成时间为7
- D.两者完成时间相同
答案:B。A的最大完成时间为max(5,5+2)=7,B的最大完成时间为max(1,1+3)=4。选B时系统整体完工时间更短,符合“最小化最大完成时间”的目标,所以应选B。
Q4. 加权投票中,两个Agent权重分别为0.8和0.2,回答分别为“猫”和“狗”,最终结果是?
- A.狗,因为权重不能决定答案
- B.猫,因为权重更高者胜出← 正确答案
- C.猫狗混合答案
- D.无法判断需要多数
答案:B。加权投票按权重计票,“猫”得0.8分,“狗”得0.2分,猫的加权票数更高。权重代表Agent的可信度,高权重Agent的意见理应占更大比重,所以最终结果是猫。
Q5. 以下哪些做法有利于SLM多Agent系统的可靠性与扩展性?
- A.消息格式标准化← 正确答案
- B.模块化插拔设计← 正确答案
- C.去中心化部署← 正确答案
- D.全部任务集中调度
答案:ABC。标准化让新Agent即插即用,模块化让组件可独立替换,去中心化避免单点故障,都提升可靠性和扩展性。而“全部任务集中调度”会形成单点瓶颈和单点故障,与可靠性目标相悖。
Q6. 两个Agent可用性分别为0.9和0.8,用公式 $A_{sys} = 1 - \prod (1-A_i)$ 计算系统可用性为?
- A.0.72
- B.0.85
- C.0.98← 正确答案
- D.1.70
答案:C。代入公式:1-(1-0.9)×(1-0.8)=1-0.1×0.2=0.98。系统只要至少一个Agent存活就能工作,因此整体可用性 0.98 高于任一单点。A是两者同时可用的概率,B是平均数,D超过1不可能。
Q7. 资源受限设备上部署SLM,最有效控制内存并保留语义能力的方法是?
- A.8bit模型量化← 正确答案
- B.无限长上下文
- C.同时部署多个大模型
- D.提高采样温度参数
答案:A。8bit量化把参数从32bit压到8bit,内存降为四分之一,语义能力损失有限。无限上下文和多模型部署恰恰增加内存压力,采样温度只影响生成随机性,与内存无关。
Q8. 关于SLM多Agent通信协议,下列说法正确的有?
- A.令牌传递避免消息冲突← 正确答案
- B.广播适合一对多通知← 正确答案
- C.轮询方式实时性最高
- D.优先级通道保障紧急任务← 正确答案
答案:ABD。令牌传递保证同一时刻只有一个发送者,从机制上杜绝冲突;广播天然适合一对多通知;优先级通道让紧急消息插队。轮询有固定询问间隔,紧急消息必须等下一次轮询,实时性反而不高,所以C错误。
Q9. 监督者Agent的主要职责是?
- A.输出质量与安全把关← 正确答案
- B.生成最终答案
- C.解析用户输入
- D.管理历史消息
答案:A。监督者类似后厨品控师傅,负责检查Agent输出是否合格,防止错误或有害结果流出。生成答案是决策者和执行者的职责,解析输入是入口模块的事,管理历史消息属于协调者范畴。
Q10. 以下哪些属于多Agent结果聚合的正确机制?
- A.多数投票表决← 正确答案
- B.置信度加权融合← 正确答案
- C.管道接力精炼← 正确答案
- D.取最后Agent结果
答案:ABC。投票表决、加权融合、管道接力都能有效聚合多个Agent的输出,各自适用于不同场景。只取最后一个Agent的结果会丢失前面所有Agent的信息,且最后一个Agent未必最可靠,不属于正确的聚合机制。