Multi-Agent 协作模式

一句话:Multi-Agent(多智能体)= 让多个各有所长的 Agent 像团队一样分工协作,而不是一个 Agent 包揽所有事。核心挑战不是「能不能对话」,而是「谁干什么、怎么交接、出错了谁兜底」。


一、为什么需要 Multi-Agent?

单个 Agent 的能力有天花板——上下文窗口有限、单一模型不可能样样精通、长链路任务中途断了全丢。Multi-Agent 的核心思路和人类团队一样:把大任务拆成小任务,每人干自己最擅长的

对比单 Agent vs 多 Agent:

维度单 AgentMulti-Agent
能力边界受限于单模型 + 单上下文各 Agent 用不同模型、不同工具
容错性一处崩全崩单 Agent 崩了其他继续
调试一条线追踪需要追踪 Agent 间交接
延迟更长(多轮通信)
Token 开销1xNx(每个 Agent 各自消耗)

二、三种常见协作模式

graph TD
    subgraph SW[Supervisor-Worker]
        S[Supervisor] --> W1[Worker A]
        S --> W2[Worker B]
        S --> W3[Worker C]
    end
    subgraph DB[Debate]
        D1[Agent A] <-->|辩论| D2[Agent B]
        D1 <-->|辩论| D3[Agent C]
        DBJ[汇总者] --> D1
        DBJ --> D2
        DBJ --> D3
    end
    subgraph PL[Pipeline]
        P1[Step 1] --> P2[Step 2] --> P3[Step 3]
    end

模式对比表

模式结构控制流适合场景典型风险
Supervisor-Worker一主多从,Supervisor 分配任务集中式任务可拆分为独立子任务Supervisor 单点瓶颈
Debate平级 Agent 互相讨论分散式需要多视角达成共识讨论跑偏、无限辩论
Pipeline链式传递,每步一个 Agent顺序式流程固定的多步任务上游错误下游放大

三、Supervisor-Worker 深度解析(cr-agent 模式)

这是目前最成熟、最常用的多 Agent 模式。核心思想:一个 Supervisor 当「工头」,几个 Worker 当「专家」,Supervisor 不干活只派活

sequenceDiagram
    participant User as 用户
    participant Sup as Supervisor
    participant WQ as Worker: Quality
    participant WS as Worker: Security
    participant WP as Worker: Performance
    participant WST as Worker: Structure

    User->>Sup: 提交代码审查任务
    Sup->>Sup: 分析任务,拆分子任务
    Sup->>WQ: 委派:检查代码质量
    Sup->>WS: 委派:检查安全漏洞
    Sup->>WP: 委派:检查性能问题
    Sup->>WST: 委派:检查代码结构
    WQ-->>Sup: 质量报告
    WS-->>Sup: 安全报告
    WP-->>Sup: 性能报告
    WST-->>Sup: 结构报告
    Sup->>Sup: 汇总 + 去重 + 排序
    Sup-->>User: 综合审查报告

代码骨架:Supervisor-Worker

import asyncio
from dataclasses import dataclass, field
from enum import Enum
 
class TaskStatus(Enum):
    PENDING = "pending"
    WORKING = "working"
    COMPLETED = "completed"
    FAILED = "failed"
 
@dataclass
class SubTask:
    """Supervisor 下发的子任务"""
    id: str
    worker: str               # 指派给哪个 Worker
    description: str          # 任务描述
    status: TaskStatus = TaskStatus.PENDING
    result: str = ""
 
@dataclass
class WorkerAgent:
    """Worker: 各有所长的专家 Agent"""
    name: str
    expertise: str            # 专长描述(用于 Supervisor 分配任务)
    model: str                # 可独立选择模型
    tools: list[str] = field(default_factory=list)
 
    async def execute(self, task: SubTask) -> SubTask:
        """执行子任务,返回带结果的任务对象"""
        prompt = f"""
        你是 {self.name},专长: {self.expertise}
        请完成以下任务: {task.description}
        只做你专长范围内的事,不要越界。
        """
        task.status = TaskStatus.WORKING
        try:
            task.result = await call_llm(prompt)
            task.status = TaskStatus.COMPLETED
        except Exception as e:
            task.result = f"执行失败: {e}"
            task.status = TaskStatus.FAILED
        return task
 
 
class SupervisorAgent:
    """Supervisor: 只派活、汇总、不亲自干活"""
 
    def __init__(self, workers: list[WorkerAgent]):
        self.workers = {w.name: w for w in workers}
 
    async def run(self, user_request: str) -> str:
        # 1. 分析任务,拆分子任务
        subtasks = await self._plan(user_request)
        # 2. 分发给对应 Worker(可并行)
        completed = await self._dispatch(subtasks)
        # 3. 汇总、去重、排序
        return await self._aggregate(user_request, completed)
 
    async def _plan(self, user_request: str) -> list[SubTask]:
        """LLM 规划:把大任务拆成子任务,并匹配 Worker"""
        worker_list = "\n".join(
            f"- {w.name}: {w.expertise}" for w in self.workers.values()
        )
        prompt = f"""
        你是任务分配专家。根据用户需求和可用 Worker 拆分子任务。
 
        用户需求: {user_request}
        可用 Worker:
        {worker_list}
 
        返回 JSON 数组:
        [{{"worker": "Worker名", "description": "子任务描述"}}, ...]
 
        规则:
        - 每个子任务只分配给最匹配的 Worker
        - 能并行就拆开,不必串行
        - 不需要某类 Worker 就别分配
        """
        plan = json.loads(await call_llm(prompt))
        return [
            SubTask(id=f"task_{i}", worker=p["worker"], description=p["description"])
            for i, p in enumerate(plan)
        ]
 
    async def _dispatch(self, subtasks: list[SubTask]) -> list[SubTask]:
        """并行分发子任务给各 Worker"""
        async def run_one(task: SubTask) -> SubTask:
            worker = self.workers.get(task.worker)
            if not worker:
                task.status = TaskStatus.FAILED
                task.result = f"找不到 Worker: {task.worker}"
                return task
            return await worker.execute(task)
 
        return await asyncio.gather(*[run_one(t) for t in subtasks])
 
    async def _aggregate(self, request: str, completed: list[SubTask]) -> str:
        """汇总结果:去重、排序、生成最终报告"""
        results_text = "\n---\n".join(
            f"[{t.worker}] ({t.status.value}): {t.result}" for t in completed
        )
        prompt = f"""
        你是汇总专家。将以下 Worker 结果整合成一份连贯报告。
 
        用户原始需求: {request}
        Worker 结果:
        {results_text}
 
        要求: 去重、合并相似点、按重要性排序、标注冲突点。
        """
        return await call_llm(prompt)

四、幻觉放大风险(Hallucination Amplification)

这是 Multi-Agent 最容易被忽略的坑。Agent 链条每多一环,幻觉概率不是加法增长,而是乘法放大

单 Agent 幻觉率: 5%
Pipeline 3 个 Agent: 1 - (1-0.05)³ ≈ 14.3%(不是 5%×3=15%,但也很接近了)
 
更可怕的是: 上游 Agent 编了一个假事实,
下游 Agent 基于它继续推理 → 假事实被当成真前提 → 输出完全偏离。

缓解手段

手段做法成本
交叉验证关键事实让两个 Agent 独立查,对不上的标记增加 1 次调用
溯源标注每个 Agent 输出带上信息来源(哪个工具、哪次检索)提示词工程成本
Supervisor 二审Supervisor 汇总时不只拼接,还要质疑各 Worker 的矛盾点Supervisor 的提示词设计
地面真相锚定在关键节点注入确定性数据(数据库查询结果、API 返回值),不让 Agent 「猜」工具调用成本

五、Pipeline 模式简述

Pipeline 是最简单的多 Agent 模式——像工厂流水线,每个 Agent 只做一个步骤,做完传给下一个。

class PipelineAgent:
    """链式 Agent: 每个 Step 是一个独立 Agent"""
 
    def __init__(self, steps: list[callable]):
        self.steps = steps
 
    async def run(self, input_data: str) -> str:
        result = input_data
        for i, step in enumerate(self.steps):
            result = await step(result)  # 每步的输出是下一步的输入
        return result
 
# 例子: 简历处理流水线
pipeline = PipelineAgent([
    extract_text,      # Step 1: 提取纯文本
    parse_sections,    # Step 2: 解析段落结构
    extract_skills,    # Step 3: 提取技能关键词
    match_jobs,        # Step 4: 匹配职位
])

Pipeline 的风险:上游一步错,下游全歪。适用场景是流程固化、每步可独立验证的任务。


六、Debate 模式简述

Debate 模式让多个 Agent 从不同角度讨论一个议题,最终通过汇总者(Aggregator)合成结论。适合需要多视角验证的开放性问题。

核心机制:多轮讨论 → 每个 Agent 看到他人的观点后修正自己 → 汇总者找共识或标记分歧。

风险:可能陷入无限辩论(需设 max_rounds),且 Token 消耗极大(每轮 N 个 Agent 同时发言)。


七、A2A 协议:Multi-Agent 的通信底座

Multi-Agent 的「协作」需要标准化的通信协议。A2A(Agent2Agent Protocol)正是解决这个问题的开放标准——它定义了 Agent 如何发现彼此、委派任务、追踪状态。

详见:A2A 协议。关键概念速查:

概念作用Multi-Agent 中的对应
Agent Card描述 Agent 身份和能力Worker 的「简历」
Task有状态的任务生命周期Supervisor 下发的子任务
Message / Part通信单元Agent 之间的对话内容
Artifact最终产物Worker 交回的成果

▶ 对应原理:29-多Agent协作基础与框架选型

▶ 对应原理:43-多Agent编排四种模式

▶ 对应原理:52-A2A协议核心概念

▶ 对应原理:53-MCP-vs-A2A本质区别

速记卡(面试闪卡)

Q1:一句话讲清「Multi-Agent 协作模式」到底是什么? A:Multi-Agent 是让多个各有所长的智能体像团队一样分工协作,而非单个 Agent 包揽所有事。

Q2:一、为什么需要 Multi-Agent? —— 怎么理解? A:像组建团队:单人能力有天花板(上下文有限、技能单一),拆任务给专人干自己最擅长的;Multi-Agent(多智能体)靠分工突破单 Agent 上限。

Q3:二、三种常见协作模式 —— 怎么理解? A:像三种团队编法:Supervisor-Worker(工头派活,集中式)、Debate(平级辩论,分散式)、Pipeline(流水线,顺序式);协作模式(Collaboration Pattern)按场景选。

Q4:三、Supervisor-Worker 深度解析(cr-agent 模式) —— 怎么理解? A:像工头加专家:Supervisor 只派活、汇总、不亲自干,Worker 各管一摊;Supervisor-Worker(主管-工人)最成熟常用,对应代码审查里 Quality、Security 等专家 Agent。

Q5:四、幻觉放大风险(Hallucination Amplification) —— 怎么理解? A:像传话游戏:链条每多一环,假话被当真前提继续推理,错误乘式放大;幻觉放大(Hallucination Amplification)靠交叉验证、溯源标注、地面真相锚定缓解。

Q6:核心速记主线有哪些?

  • 为什么需要:单 Agent 有上限,分工突破天花板
  • 三种模式:Supervisor-Worker、Debate、Pipeline
  • Supervisor-Worker:工头派活、Worker 专家、只汇总
  • 幻觉放大:链式乘式放大,靠验证溯源缓解

口诀 A:单 Agent 有天花板, 三种模式按需选; 工头派活不亲干, 幻觉乘放需锚定。

相关链接


技术学习路线图 > 规划与高级模式

相关链接