想象你是一家五星级餐厅的总厨。周五晚市,预订爆满,前厅开了六十桌。你手下有一支厨师团队:切配、掌勺、摆盘、甜品……每个人都有自己的看家本领,也都有自己的脾气。你只有三个小时,要端出几百道菜,还要保证每桌的菜在差不多的时间上齐——热菜不能凉,凉菜不能晚。 这几乎就是软件世界里多Agent协作每一天面临的挑战。所谓Agent,就是一个能自己感知、自己决策、自己行动的AI程序;当多个Agent要合作完成一个复杂任务时,首先要解决的,就是“谁来做什么、怎么配合”——这就是Agent角色分配。 在这篇文章里,我们跟着总厨的晚市节奏,一步一步理解:怎么给每个Agent写“岗位说明书”(角色定义)、怎么把大目标拆成小任务(任务分解)、Agent之间怎么精准“传菜”(通信协议)、两个人抢烤箱怎么办(冲突解决)、总厨怎么统筹全局(协调机制)、最终怎么排班最合理(分配算法)。学完这一课,你就能像总厨一样,指挥一支AI团队打下一场硬仗。

岗位关联

掌握Agent角色分配,是AI Agent架构师从“单兵作战”走向“军团指挥”的分水岭——学会像总厨一样排兵布阵、统筹全局,你就能让一支AI团队高效地打下一场硬仗。

目录
  1. 可视化演示
  2. 角色定义方法
  3. 任务分解策略
  4. 通信协议设计
  5. 冲突解决机制
  6. 协调机制设计
  7. 角色分配算法
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示多Agent系统中规划者Agent将任务分解并分配给各专业Agent,通过通信协议协调执行,最终由协调者汇总成果的协作全流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

角色分配:规划者分解任务 规划者Agent将复杂任务拆解为子任务并匹配专业Agent 各Agent按能力模型接收任务,通过消息队列共享接口定义 匹配度 = 能力匹配 × 负载均衡 协调者汇总各Agent成果,任务完成率显著提升

角色定义方法

走进任何一家运转良好的餐厅后厨,灶台旁都贴着一张泛黄的“岗位说明书”:切配岗——负责洗切备料,刀法要稳;掌勺岗——负责火候调味,出锅要快;摆盘岗——负责造型出品,审美在线。三张纸把厨房变成精密的整体,没有人抢别人的活,也没有人漏掉自己的活。

多Agent系统(多个AI程序协作解决一个复杂问题)的角色定义,就是这张岗位说明书。一个Agent不是只会执行指令的工具,它有技能、有职责、有边界。角色一旦定义不清,Agent们就像没有分工的厨房——三个厨师抢着炒菜,却没人切葱。

在工程上,一个角色被形式化为四元组 $R=\langle S, T, P, D \rangle$:$S$ 是技能集,$T$ 是职责任务集,$P$ 是权限边界,$D$ 是依赖关系。根据场景不同,角色还分静态与动态——启动时定死的岗位是静态角色;运行中能临时顶岗的是动态角色,就像大厨请病假时二厨顶上去。

有了这四栏岗位说明书,后厨才能在晚市高峰像精密机器一样运转——每个Agent都清楚自己是切配还是掌勺,该接谁的料、把菜递给谁。角色定义是整场协作的地基,地基不稳,后面的任务分解、通信协调全都会塌。

Ri=⟨Si,Ti,Pi,Di⟩\displaystyle R_i = \langle S_i, T_i, P_i, D_i \rangle
这个公式就是一张“岗位说明书”的数学版:任何一个角色,都可以用“会什么、做什么、能碰什么、靠谁配合”这四栏说清楚。
  1. 角色标识 $R_i$表示第 $i$ 个角色的唯一身份,就像后厨里“切配岗”这个独一无二的编号。
    RiR_i
  2. 技能集 $S_i$Agent 具备的技能及熟练度集合,决定了它能接什么活、接得多好。
    Si={si1,si2,…,sim}S_i = \{ s_{i1}, s_{i2}, \ldots, s_{im} \}
  3. 职责任务集 $T_i$该角色被授权负责的任务列表,是岗位说明书的“工作内容”一栏。
    Ti⊆TT_i \subseteq \mathcal{T}
  4. 权限边界 $P_i$可调用的资源与可做出的决策范围,防止Agent越权操作。
    Pi={pi1,pi2,…,pik}P_i = \{ p_{i1}, p_{i2}, \ldots, p_{ik} \}
  5. 依赖关系 $D_i$与其他角色之间的协作关系,标明“上游是谁、下游交给谁”。
    Di={dij∣j≠i}D_i = \{ d_{ij} \mid j \neq i \}

任务分解策略

承办一场三百人的婚宴,总厨绝不会对着“做三百人份的菜”发呆。他会铺开一张纸,把宴席拆成四条线:凉菜、热菜、甜品、汤羹;再往下拆——热菜线里哪几桌先上,红烧谁负责、清蒸谁负责。这棵“任务树”画完,后厨才敢开工。

多Agent协作的第一步同样是把宏观目标分解成可执行、可分配的子任务,这个环节叫任务分解。目标太笼统,Agent无从下手;分解得不好,轻则重复劳动,重则任务互相冲突。

好的任务分解要满足三个条件:完整覆盖、互不重叠、复杂度降低——也就是“不漏、不重、更省力”。工程上还要做依赖分析:热菜必须等切配完成,有依赖的子任务要按拓扑序串行;还要控制粒度:拆太细,协调通信的开销会吃掉并行收益;最后定分配方式:耦合紧密的子任务由同一个Agent打包完成,松散的才分给不同Agent并行。

婚宴当夜,四条线同时开火、互不干扰,客人同时吃上热菜——这就是任务分解的魔力。它把总厨一个人的压力,拆成每个档口都扛得住的小目标。

T=⋃i=1nTi,Ti∩Tj=∅  (i≠j),∑i=1nC(Ti)≪C(T)\displaystyle T = \bigcup_{i=1}^{n} T_i, \qquad T_i \cap T_j = \emptyset \; (i \neq j), \qquad \sum_{i=1}^{n} C(T_i) \ll C(T)
“不重不漏”四个字,对应集合论里“并集为全集、交集为空”;而“复杂度之和远小于整体”,是分解收益的根本来源——并行与专注。
  1. 完整覆盖所有子任务的并集等于总目标 $T$,一场宴席的菜必须全部有归属,一道都不能漏。
    T=⋃i=1nTiT = \bigcup_{i=1}^{n} T_i
  2. 互不重叠任意两个子任务的交集为空,一道菜不能同时既归“凉菜线”又归“热菜线”。
    Ti∩Tj=∅T_i \cap T_j = \emptyset
  3. 复杂度降低分解后各子任务复杂度之和远小于整体复杂度,因为可以并行、可以专注,总厨不用一个人扛。
    ∑i=1nC(Ti)≪C(T)\sum_{i=1}^{n} C(T_i) \ll C(T)

通信协议设计

后厨最怕的不是忙,而是“传错话”。一道清蒸鲈鱼被喊成红烧鲈鱼,整桌菜报废。所以老练的后厨有铁律:传菜单必须写清桌号、菜名、忌口、时间;喊单的人要报自己名字;接单的人必须复述确认。这些约定,就是后厨的通信协议。

多Agent系统里,Agent之间协作必须通信。通信协议规定了消息的格式、传递方式和路由规则——相当于后厨“怎么喊、喊给谁、用什么格式喊”的全部约定。协议设计得烂,Agent之间就鸡同鸭讲,协作直接崩溃。

标准Agent消息可表示为 $M=\langle S, R, \tau, P, t \rangle$:$S$ 发送者、$R$ 接收者、$\tau$ 消息类型(请求/应答/广播/取消)、$P$ 数据载荷、$t$ 时间戳。消息类型决定路由方式:点对点、广播、发布订阅。交互还分同步与异步——“喊单后原地等回应”是同步,可靠但会阻塞;“把单子贴窗口谁有空谁取”是异步,高效但可能漏。总厨要按场景权衡选型。

一张写清桌号、菜名、时间的传菜单,能让后厨在兵荒马乱的晚市保持秩序。同样,一个五元组的消息约定,能让几十个Agent在复杂协作中不吵不闹、不漏不乱。

M=⟨S,R,τ,P,t⟩\displaystyle M = \langle S, R, \tau, P, t \rangle
一张传菜单上的“桌号、菜名、忌口、时间”,翻译成机器语言就是这五个字段——写清楚这五行,Agent之间就不会传错话。
  1. 发送者 $S$消息从哪个 Agent 发出,相当于“谁在喊话”,没有它接收方无法溯源。
    SS
  2. 接收者 $R$消息的目标 Agent,可以是单个、多个或全体广播,决定消息送到哪里。
    RR
  3. 消息类型 $\tau$标识这是一条请求、应答还是取消,接收方据此决定如何响应与路由。
    τ\tau
  4. 数据载荷 $P$消息携带的实际业务内容,比如任务参数、出价金额、菜品信息。
    PP
  5. 时间戳 $t$消息发出的时间,用于处理乱序到达和网络延迟。
    tt

冲突解决机制

晚市八点,烤箱只有一个,甜点师要做焦糖布丁,掌勺大厨要烤羊排,两只手同时伸向烤箱门。有经验的厨房不吵架——他们心算一秒钟:羊排三桌等着出,布丁可以冷藏晚点烤,于是羊排用烤箱,布丁排队。

多Agent协作中,资源竞争(数据库连接、GPU、工具调用权限)和意见分歧(目标相同但方案不同)几乎不可避免。没有冲突解决机制的团队会陷入死锁或无限争论。冲突解决的核心,是给每个竞争请求算一个优先级值。

优先级仲裁是应用最广的策略:每个请求的仲裁优先级 $P$ 由资源效用 $U$ 和剩余时间 $d$ 共同决定——越重要、越紧迫的请求值越高,$\alpha$、$\beta$ 是权重系数,$\epsilon$ 防除零。算完 $P$ 值,最高者获得资源,其余进入等待或走回退策略。回退策略是兜底保险:协商失败时Agent退回默认方案(重新生成任务、转交其他Agent),而不是无限等待。

靠着这套“先算后做”的仲裁规则,烤箱、灶头、人手在最紧张的时刻流向最需要的地方。冲突不可怕,可怕的是没有一套让所有Agent都服气的规则。

Pi=α×Ui+β×1di+ϵ\displaystyle P_i = \alpha \times U_i + \beta \times \frac{1}{d_i + \epsilon}
这道公式就是后厨“心算一秒钟”的数学版:价值越高、越赶时间的请求,优先级值越高,烤箱先给它。
  1. 资源效用 $U_i$这个请求创造的价值——“烤羊排”能同时满足三桌客人,效用就高。
    UiU_i
  2. 剩余时间 $d_i$距离截止时间还剩多少,越接近截止这个值越小,说明越等不起。
    did_i
  3. 权重系数 $\alpha, \beta$表示“价值”和“紧迫”哪个更重要,由架构师根据业务场景调参。
    α,β\alpha, \beta
  4. 防除零项 $\epsilon$一个极小的正数,防止 $d$ 等于 $0$ 时公式崩溃、系统直接死锁。
    ϵ\epsilon

协调机制设计

米其林后厨的传菜口是大厨的指挥台:所有菜做好后必须经大厨确认才能上桌,这是集中式协调。而有些创新厨房流行黑板模式——中央挂一块黑板,谁缺什么、谁能帮什么写上去,各档口自己揭榜。

协调机制解决的是“多个Agent如何围绕共同目标有序推进”的制度问题。不同场景需要不同机制,工程上常见四类:集中式协调、分布式协商、黑板模式、契约网络。

集中式协调:一个协调器收集全部信息统一决策,像总厨站在传菜口,简单可控但容易成为瓶颈;分布式协商:Agent们直接对话、讨价还价,灵活但可能陷入僵局;黑板模式:共享一块黑板动态揭榜,适合任务随机涌现的场景。最经典的是契约网络(Contract Net Protocol):协调器广播任务,候选Agent根据自身技能与负载出价,协调器选“总成本最低”者签约。出价公式里,$C_i$ 是任务适配成本,$\phi_i$ 是技能熟练度——越拿手出价越低;$\lambda L_i$ 是负载惩罚——越忙的人出价自动变贵,自然落选。这套机制把“选谁干活”从拍脑袋变成了市场化竞价。

总厨不需要认识每一个食客,但通过传菜口、黑板和竞价规则,他能保证每道菜都有人做、每个档口饱和却不超载。协调机制,就是让Agent团队在无人紧盯时也能井井有条的隐形之手。

A∗=arg⁡min⁡ai∈A(Ciϕi+λ×Li)\displaystyle A^{*} = \arg\min_{a_i \in \mathcal{A}} \left( \frac{C_i}{\phi_i} + \lambda \times L_i \right)
契约网络就像一场微型拍卖会:总厨喊出需求,各档口报出自己的“成本价”,报价最低的厨师接下这单——公平、高效、自动均衡。
  1. 最优中标者 $A^{*}$在所有候选 Agent 中选出总代价最小的一位签约,就像拍卖中出价最低者成交。
    A∗=arg⁡min⁡ai∈AA^{*} = \arg\min_{a_i \in \mathcal{A}}
  2. 适配成本与技能比 $C_i / \phi_i$任务难度除以技能熟练度——越拿手,这个值越小,出价越低。
    Ciϕi\frac{C_i}{\phi_i}
  3. 负载惩罚 $\lambda \times L_i$当前负载乘以惩罚系数——已经忙到冒烟的Agent被自动“加价”,自然把机会让给闲人。
    λ×Li\lambda \times L_i

角色分配算法

周日晚市前总厨排班:小李刀工利索但手上贴着创可贴,老张炒菜最香但下午已炒了四十桌,新来的实习生摆盘有天赋。把谁放哪个岗?有经验的总厨会打一张“能力匹配表”,再均衡每个人当天的劳动量。

角色分配算法解决“把哪个Agent派到哪个角色”的优化问题,两大目标:能力匹配——人尽其才;负载均衡——不撑死不闲死。策略可静态(启动时算一次),也可动态(运行中持续调整)。

能力匹配用加权相似度打分:Agent $j$ 对角色 $i$ 的匹配分等于各技能值与需求值的相似度按权重加和,分高者优先。全局层面做负载均衡:设 $c_{ij}$ 为 0/1 决策变量(任务 $i$ 是否派给 Agent $j$),每个任务只能归属一个 Agent,目标是让所有Agent中的最大负载 $L_j$ 尽量小——像木桶一样,把最忙那块板压下来。真实系统还要动态调整:实时监控负载,超过阈值触发重分配;再靠任务完成率、平均延迟等指标做评估反馈,持续调优权重。

排班表贴出的那一刻,小李去切配、老张守招牌菜、实习生站甜品台——每个人都在最合适的位置上担着恰到好处的压力。好的角色分配算法,就是这张让全员都舒服、效率又最高的排班表。

Score(aj,ri)=∑k=1mwk×Sim(sjk,reqik)\displaystyle Score(a_j, r_i) = \sum_{k=1}^{m} w_k \times \text{Sim}(s_{jk}, \text{req}_{ik})
负载均衡的数学表达是“最小化最大的负载”——不求每个人都轻松,只求最忙的那个人也别累垮。
  1. 决策变量 $c_{ij}$取 $1$ 表示任务 $i$ 分配给 Agent $j$,取 $0$ 表示不分配,是排班表上的“勾与叉”。
    cij∈{0,1}c_{ij} \in \{0,1\}
  2. 单归属约束每个任务只能分配给一个 Agent,一道菜只有一个责任人,避免“三个和尚没水喝”。
    ∑j=1mcij=1\sum_{j=1}^{m} c_{ij} = 1
  3. Agent 负载 $L_j$该 Agent 分配到所有任务的难度之和,相当于一个厨师当晚上要出多少道菜。
    Lj=∑i=1ncij⋅DiL_j = \sum_{i=1}^{n} c_{ij} \cdot D_i
  4. 最小化最大负载让最忙的Agent也别太忙,全体负载趋于均衡,这才是“排班表”的最优解。
    min⁡  max⁡jLj\min \; \max_{j} L_j

AI 应用场景

电商大促客服工单智能分派

阶段:任务分解 + 角色定义 + 角色分配

解决的问题:大促期间工单如洪水涌入,传统人工分派靠经验、速度慢、误派率高;售前、售后、退款、技术等诉求混在一起,一线客服疲于奔命。AI多Agent系统先按诉求类型自动分解工单,再按技能匹配与负载均衡分配给不同角色的客服Agent。

具体案例:某电商平台搭建客服多Agent团队:工单一进来先由“分类Agent”拆解归属,再由“调度Agent”把任务分给售后Agent、退款Agent、技术Agent。退款Agent用契约网络投标认领“小额自动退款”任务,日处理两万单,平均响应时间从15分钟降到40秒。

软件研发多Agent协作流水线

阶段:任务分解 + 协调机制 + 冲突解决

解决的问题:一个大型功能需求要拆成设计、编码、测试、文档多个子任务,多个编程Agent并行开发时容易产生接口冲突和构建资源竞争。传统单Agent无法并行,人工拆分又太慢。

具体案例:研发团队引入多Agent系统:架构Agent集中式协调模块边界,把需求分解为可并行开发的子任务;编码Agent各自领取任务,测试Agent发现缺陷后通过优先级仲裁决定修复顺序;共享构建资源用契约网络竞标,谁的空闲度高谁先用。

无人机物流配送调度

阶段:协调机制(契约网络)+ 动态角色分配

解决的问题:配送订单动态到达,无人机电量与位置各异,人工调度无法实时匹配“哪台无人机去送哪个订单”。

具体案例:调度中心把每个订单作为任务广播,各无人机按“距离 + 剩余电量 + 当前负载”出价,最低价者中标;电量不足的无人机自动切换到“回航充电”角色,原有任务通过黑板模式重新揭榜分配,保证恶劣天气下配送不中断。

Python 演示

python85 行
#!/usr/bin/env python# -*- coding: utf-8 -*-"""契约网络协议模拟:总厨向4位Agent厨师广播6道菜的任务"""  class Agent:    """厨师Agent: 拥有技能熟练度, 会出价并承接任务"""     def __init__(self, name, skills):        self.name = name                    # 厨师名        self.skills = skills                # 技能字典: {"技能名": 熟练度0.0-1.0}        self.load = 0                       # 当前负载(已领任务难度之和)        self.tasks = []                     # 已承接的任务名列表     def bid(self, task):        """契约网络中的出价: 难度/熟练度 + 负载惩罚, 技能不符返回None"""        if task.skill not in self.skills:            return None        cost = task.difficulty / (self.skills[task.skill] + 1e-6)        return cost + self.load * 0.5     def take(self, task):        """中标后承接任务并更新负载"""        self.tasks.append(task.name)        self.load += task.difficulty  class Task:    """一道菜任务"""     def __init__(self, name, skill, difficulty):        self.name = name                    # 菜名        self.skill = skill                  # 所需技能        self.difficulty = difficulty        # 难度  class Coordinator:    """协调器: 广播任务收集出价, 最低价中标"""     def __init__(self, agents):        self.agents = agents        self.waiting = []                   # 无人认领的任务名     def assign(self, tasks):        for t in tasks:            bids = []            for a in self.agents:                v = a.bid(t)                if v is not None:                    bids.append((v, a))            if bids:                bids.sort(key=lambda x: x[0])   # 出价从低到高                bids[0][1].take(t)              # 最低价中标            else:                self.waiting.append(t.name)     def report(self):        print("===== 契约网络分配结果 =====")        for a in self.agents:            print("%s 负载=%.2f 任务=%s" % (a.name, a.load, a.tasks))        print("无人认领: %s" % (self.waiting if self.waiting else "无"))  def main():    agents = [        Agent("厨神", {"切配": 0.9, "掌勺": 0.8, "摆盘": 0.6}),        Agent("刀工", {"切配": 0.95, "掌勺": 0.4, "摆盘": 0.5}),        Agent("火夫", {"切配": 0.3, "掌勺": 0.9, "摆盘": 0.2}),        Agent("摆盘师", {"切配": 0.5, "掌勺": 0.2, "摆盘": 0.95}),    ]    tasks = [        Task("切土豆丝", "切配", 3),        Task("红烧排骨", "掌勺", 5),        Task("雕花装饰", "摆盘", 2),        Task("凉菜拼盘", "切配", 4),        Task("糖醋里脊", "掌勺", 4),        Task("果盘造型", "摆盘", 3),    ]    co = Coordinator(agents)    co.assign(tasks)    co.report()  if __name__ == "__main__":    main()
目的:用契约网络协议模拟“总厨排班”——4个厨师Agent对6道菜任务投标,技能越熟、负载越低的Agent出价越低,最终中标并展示了负载均衡的过程。
  1. if task.skill not in self.skills:不会的技能直接弃标,就像不会雕花的厨子不该揽雕花的活,省得浪费大家时间。
  2. cost = task.difficulty / (self.skills[task.skill] + 1e-6)核心出价公式:难度除以熟练度,越拿手出价越低;1e-6 防止熟练度为0时除零崩溃。
  3. return cost + self.load * 0.5加上负载惩罚项:越忙的Agent出价越高,自然把机会让给闲人,对应公式里的 $\lambda L_i$。
  4. bids.sort(key=lambda x: x[0])按出价从低到高排序,出价最低者排在最前,比手动“挑最合适的”公平且可复现。
  5. bids[0][1].take(t)最低价Agent中标、领取任务,相当于拍卖会上落槌成交。
  6. self.load += task.difficulty中标后负载增加,影响后续出价,形成前文所说的“动态均衡”闭环。

常见误区

误区总觉得系统干不动是“人不够”,于是不停增加Agent和角色。反正每个Agent都很便宜,多加几个总没错吧?

正解角色数增加,通信和协调成本按组合数爆炸——每个Agent都要跟别人对齐、同步,就像在十平米的厨房塞进二十个厨师,互相撞胳膊肘。角色贵精不贵多,先想清楚“这个角色缺了会怎样”,再决定加不加。

为何常见:生活直觉“人多力量大”根深蒂固,忽略了软件世界里协调成本往往超过人力成本。

误区把任务拆到极致,每个Agent只做一小步,像流水线一样,效率一定最高。

正解流水线之所以高效,是因为物理布局固定、工位之间不用沟通;而Agent是分布式的,每拆一刀就多一条通信链路。把“切一棵葱”拆成洗葱、剥皮、切段、装盘四个人接力,协调开销早已超过单干收益。粒度的准则是:Agent能独立闭环的最小单元。

为何常见:工业流水线的思维惯性,忽略了分布式系统的通信成本——流水线不需要发消息,Agent需要。

误区给系统配一个Manager统一仲裁,所有资源冲突、意见分歧都听它的,一劳永逸。

正解集中式仲裁有两个致命伤:单点故障(总厨倒下整个厨房停摆)和信息瓶颈(所有请求都汇到一处,晚市高峰必然排队)。工程上普遍采用分级仲裁:常规冲突用规则引擎自动裁决,重大冲突才上报协调器。

为何常见:人类社会靠层级组织解决问题,但AI系统没有“服从权威”的本能,必须靠机制而不是靠角色权威。

误区系统启动时把角色和任务分配好,后面就按部就班跑,出了问题再说。

正解运行期负载会漂移、新任务会随机到达、Agent能力可能降级(比如响应超时)。像晚市中途有人手受伤必须临时调岗,角色分配要支持动态调整:监控负载指标、超阈值触发重分配,才能长期稳定。

为何常见:把多Agent系统当成一次性配置的脚本,忽略了运行期的不确定性——真实世界没有“剧本”。

误区统一协议就是高效协作,所有消息都走同一个格式和通道最省心。

正解不同交互类型适合不同模式:任务分配走契约网络、状态共享走黑板、紧急协调走同步喊单。强行统一就像要求所有菜用同一个火候炒——能熟,但不好吃。协议要分层、要适配,让每种交互用最合适的通道。

为何常见:追求标准化的惯性思维,把“标准化”误解为“一刀切”,忽略了协议是服务于交互模式的。

面试题

Q1. 在“后厨岗位说明书”的比喻中,角色定义 $R=\langle S,T,P,D \rangle$ 中 $D$ 代表什么?

单选题 · easy

  • A.角色所属的部门名称
  • B.与其他角色的依赖关系← 正确答案
  • C.角色擅长的技能集合
  • D.角色被授予的权限范围

答案:B。$D$ 在四元组中代表依赖关系(Dependencies),描述该角色与其他角色的协作依赖,即“上游是谁、下游交给谁”。选项A的部门隶属属于组织概念,C是 $S$(技能集),D是 $P$(权限)。把 $D$ 记成“部门”是最常见的混淆。

Q2. 任务分解要做到“不重不漏”,子任务集合必须满足什么条件?

单选题 · easy

  • A.任意两个子任务之间完全独立
  • B.并集为全集且两两交集为空← 正确答案
  • C.子任务数量必须是二的倍数
  • D.每个子任务复杂度完全一致

答案:B。“不重不漏”对应集合论表达:并集等于总目标(不漏),任意交集为空(不重)。选项A的“独立”是理想状态,但并不保证覆盖完整;C、D是错误联想。选B。

Q3. 通信消息 $M=\langle S,R,\tau,P,t \rangle$ 中,$\tau$ 字段的作用是什么?

单选题 · mid

  • A.记录消息发送的具体时间戳
  • B.标记消息类型以便路由和处理← 正确答案
  • C.存储消息携带的业务数据
  • D.标识消息由哪个Agent发出

答案:B。$\tau$ 是消息类型(type),取值为请求、应答、广播、取消等,接收方据此决定如何响应与路由。时间戳是 $t$,数据载荷是 $P$,发送者是 $S$。做对这道题,你就能看懂任何Agent通信框架的报文头设计。

Q4. 下列哪些属于多Agent冲突解决机制的常用策略?

多选题 · mid

  • A.按优先级值仲裁资源归属← 正确答案
  • B.协商失败后执行回退方案← 正确答案
  • C.增加Agent数量来缓解竞争
  • D.忽略冲突等待系统自恢复

答案:AB。优先级仲裁($P=\alpha U + \beta/(d+\epsilon)$)和回退策略是正文讲过的两大手段。加Agent不会解决冲突反而加剧协调开销;忽略冲突会让系统陷入死锁,都不是工程上可接受的策略。

Q5. 契约网络协议中,协调器选择中标者的核心依据是什么?

单选题 · mid

  • A.出价最低且兼顾当前负载← 正确答案
  • B.响应速度最快的投标者
  • C.历史上中标次数最多的
  • D.技能种类覆盖最全的Agent

答案:A。出价公式 $C_i/\phi_i + \lambda L_i$ 融合了技能适配与负载惩罚,出价越低表示总成本越小,中标概率越大。响应快、中标多、技能全,都不能保证“当前这笔任务成本最低”,甚至会造成负载失衡。

Q6. 负载均衡目标 $\min \max_j L_j$ 的直观含义是什么?

单选题 · mid

  • A.让每个任务的复杂度降到最小
  • B.让所有Agent中负载最大的那个尽可能小← 正确答案
  • C.让每个Agent只负责一个任务
  • D.让全部Agent的负载总和最大

答案:B。$\min \max_j L_j$ 是一个“木桶”目标:压住最忙的那块板,把最大负载降下来,整体就均衡了。A改的是任务本身,C限制数量不保证均衡,D与目标完全相反。

Q7. 哪些信号应当触发动态角色调整?

多选题 · hard

  • A.单个Agent任务积压超过设定阈值← 正确答案
  • B.新任务突然到达且截止时间紧迫← 正确答案
  • C.某个Agent长期空闲处于低负载← 正确答案
  • D.系统启动后五分钟内无任务下发

答案:ABC。动态调整的核心是“负载偏离合理区间”或“出现新的紧急需求”。A过载、B新增紧急任务、C长期闲置都是典型触发信号;D无任务下发说明系统本身空闲,不需要调整。

Q8. 黑板模式协调机制的核心思想是什么?

单选题 · easy

  • A.所有Agent共享一块公共信息区← 正确答案
  • B.协调器向每个Agent单独发指令
  • C.Agent之间两两直接建立通信
  • D.每个Agent维护独立私有知识库

答案:A。黑板模式字如其名:一块公共黑板,谁有需求谁贴上去,谁有能力谁揭榜,Agent之间不直接对话。B是集中式协调,C是分布式协商,D是信息孤岛,都与黑板模式背离。

Q9. 下列哪些做法能提升多Agent角色分配的整体效率?

多选题 · hard

  • A.按技能匹配度择优分配任务← 正确答案
  • B.动态监控负载并实时重分配← 正确答案
  • C.分配后持续评估并反馈调优← 正确答案
  • D.角色和任务一经分配不可更改

答案:ABC。一次好的分配要“选对人、分好量、不断调”,对应能力匹配、负载均衡、评估反馈三个环节。D把体系锁死,晚市中途有人手受伤时必然崩溃,与动态调整原则相悖。

Q10. 任务分解粒度过细,主要会带来什么负面后果?

单选题 · mid

  • A.子任务间协调通信开销大增← 正确答案
  • B.每个子任务的执行速度变快
  • C.总体任务复杂度显著下降
  • D.每个Agent的自主性得到提升

答案:A。分解的收益是并行,成本是协调。粒度过细时,通信与同步开销随Agent数量按组合数爆炸(O(n²)),“切一棵葱分四个人接力”的协调成本远超单干。B、C是分解过细想得到的收益但被边际效应抹平;D恰恰相反——分解越细,单Agent自主性越弱。