AI/ML 详解:Multi-Agent 系统

Day 7 · 2026-05-25
面向:有编程经验的非 AI 方向工程师
工程对应 → super-individual D13: Multi-agent Systems(Orchestrator-worker、debate、何时反模式)

AutoGenMicrosoft AutoGen

框架对话式协作
一句话类比

把 multi-agent 系统建模成一个"内部 Slack 频道"——每个 Agent 是一个 channel member,所有协作通过"消息"完成。你不需要写状态机或显式控制流,而是定义谁能加入、谁发起、谁有权回话,让对话自然演进出结果。后端类比:把传统 RPC 编排换成事件驱动消息总线

它解决什么问题 + 工作机制

单个 Agent 上下文有限、技能受限——面对"读代码 + 写测试 + 跑测试 + 修 bug"这类多技能任务,你可以把它塞给一个 Agent,但代价是 prompt 越来越臃肿,模型注意力被稀释。AutoGen(微软 2023 年开源,2024 推出 v0.4 重写)的解法:把任务拆给多个专门化 Agent,让它们通过对话协作。它的核心抽象只有两个:

  • ConversableAgent——能收、能发、能调工具的"对话节点",底层就是 LLM + tools + memory;
  • GroupChat + GroupChatManager——决定下一个发言者的"群主",常见策略:round-robin、由 LLM 选下一个、按角色规则选。

整套系统类似 actor model——每个 Agent 是一个 actor,消息是唯一耦合方式。AutoGen v0.4 把这点做得更彻底,引入了真正的异步消息总线和分布式 runtime。

User Proxy Manager (决定谁说话)
    ↓ 路由
Coder Agent Tester Agent Reviewer Agent
↑ 全部消息进同一 GroupChat 历史 ↑
代码示例
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient

model = OpenAIChatCompletionClient(model="gpt-4o")

# 每个 Agent 只负责一件事——system prompt 决定它的"人格"
coder = AssistantAgent("coder", model_client=model,
    system_message="你是 Python 工程师。只输出可运行代码,不写解释。")

reviewer = AssistantAgent("reviewer", model_client=model,
    system_message="你是 code reviewer。指出 bug 和改进点;满意时回复 'APPROVED'。")

# 群聊:轮流发言,直到 reviewer 说 APPROVED 就终止
team = RoundRobinGroupChat([coder, reviewer],
    termination_condition=lambda msgs: "APPROVED" in msgs[-1].content)

async def main():
    async for msg in team.run_stream(task="写一个二分查找,要处理空数组"):
        print(f"[{msg.source}] {msg.content}")
常见误区 + 实践场景
"Agent 越多越聪明"——错。AutoGen 实测:超过 4-5 个 Agent 的群聊很容易陷入循环互捧沉默僵局(每个 Agent 都觉得别人该接),token 成本爆炸但任务无进展。生产经验:先用 2 个 Agent(执行者 + 评判者)跑通,再按需加角色,永远设置 max_turns 兜底。
📌 妈妈场景:自己的"投资研究小组"——三个 Agent 分别扮演多头分析师空头分析师风险经理,对同一只股票各自给出论证,最后让你(User Proxy)拍板。你不再读一份"客观但平庸"的报告,而是看一场结构化辩论
Takeaway + 思考题
💡 AutoGen 把 multi-agent 还原成了"消息总线 + 角色"两件事——不要写工作流,写对话规则。
🤔 你目前手动协调的工作流中,哪些步骤本质上是对话而不是流程图?

CrewAIRole-based Agent Orchestration

框架流程编排
一句话类比

如果 AutoGen 像"Slack 频道",CrewAI 就像"带 PM 的项目团队"——每个 Agent 有明确职责(Role)目标(Goal)背景(Backstory);任务(Task)被显式分配给某个 Agent;可以走顺序流(Sequential)也可以走层级流(Hierarchical,有 Manager Agent)。后端类比:从"消息驱动"变回"显式工作流引擎",更像 Airflow + Slack 的混合体。

它解决什么问题 + 工作机制

AutoGen 的对话式协作灵活但难预测——同一个任务跑两次可能走完全不同的对话路径,对生产环境不友好。CrewAI(2024 年开源,迅速成为最流行的 multi-agent 框架之一)的设计哲学相反:让流程显式、让角色稳定。你预先定义好"3 个 Agent + 5 个 Task 的有向图",运行时按图执行。两种执行模式:

  • Sequential:Task1 → Task2 → Task3,前一个 Task 的输出是后一个的输入(管道式);
  • Hierarchical:一个 Manager Agent(自动生成,使用更强模型)负责拆解、分派、验收,下面是若干 worker Agent,类似公司层级。

"Backstory" 不是装饰——它显著影响模型的措辞和决策风格。给 Agent 写"你是有 15 年经验的资深财报分析师,以严谨保守著称"和写"你是分析师",输出质量差距明显(已被多个 benchmark 复现)。

代码示例
from crewai import Agent, Task, Crew, Process

researcher = Agent(
    role="市场研究员",
    goal="找出 {topic} 的 3 个最新趋势,附数据来源",
    backstory="你是有十年经验的行业分析师,擅长一手数据挖掘",
    tools=[search_tool])

writer = Agent(
    role="内容编辑",
    goal="把研究报告改写成 800 字精炼简报",
    backstory="你曾是《经济学人》编辑,追求事实密度和可读性")

# Task 显式分配给 Agent;context 字段声明依赖关系
research = Task(description="研究 AI Agent 2026 趋势", agent=researcher,
                expected_output="3 条趋势 + 引用链接")
write    = Task(description="改写为简报", agent=writer,
                context=[research],   # 等 research 完成后才跑
                expected_output="800 字 markdown")

crew = Crew(agents=[researcher, writer], tasks=[research, write],
            process=Process.sequential)
result = crew.kickoff(inputs={"topic": "AI Agent"})
常见误区 + 实践场景
"Role/Backstory 写得越长越好"——错。超过 200 字的 backstory 会挤占工具描述和 task context 的注意力预算,反而劣化表现。最佳实践:role 一句话、goal 含可验证产出(不是"做好分析"而是"输出 3 条带引用的趋势")、backstory 突出1-2 个性格特征
📌 妈妈场景:每周日跑一次"家庭周报 Crew"——4 个 Agent:日程聚合员(汇总下周日程)、营养规划员(生成菜单)、孩子学业跟进员(看作业完成度)、家庭 CFO(汇总账单)。Sequential 跑完,输出一份周日晚上的家庭简报,比一个全能 Agent 出错少得多。
Takeaway + 思考题
💡 CrewAI 选择"角色 + 流程"的可预测性,AutoGen 选择"对话"的灵活性——两者是不同的 trade-off 而非高下。
🤔 你的某个工作流,结构稳定 vs 探索灵活哪边更值钱?你的选择决定该用哪个框架。

角色分工Role Specialization

设计原则认知
一句话类比

把一个 Agent 拆成多个角色,对应后端世界的"单体 → 微服务"——不是因为"分工"是美德,而是因为小上下文 + 专门 prompt + 受限工具集三件事能显著降低单 Agent 的认知负载,让每一步推理都更准。代价也和微服务一样:通信、调试、整体一致性都变难。

它解决什么问题 + 工作机制

给一个 Agent 同时挂上 20 个工具 + 5 段长 system prompt + 完整任务上下文,模型很容易"意图漂移":写代码写到一半开始解释架构,做研究做到一半开始问用户。Anthropic 2024 年的"Constitutional AI"和 OpenAI 的"Specialized Agents" 实验都验证了同一件事:缩窄角色范围 → 任务完成率显著提升。背后是三个机制:

  • 注意力聚焦——short prompt + 少工具,每个 token 都"想清楚自己在做什么",类似 Day 4 RAG 缩窄检索范围;
  • 错误隔离——一个 Agent 失败不会污染整条链路的对话历史;
  • 独立优化——可以给关键角色用更强模型(Opus)、给辅助角色用更便宜模型(Haiku),成本/质量双优。

判断"该不该拆"的简单启发:当某个 Agent 的失败案例大多集中在"做错了类型"(该写代码却给建议、该总结却扩写)而不是"做得不够好",就该拆。

代码示例
# 反面:一个全能 Agent 既写又审又跑
generalist = AssistantAgent("engineer",
    system_message="你是工程师,会写代码、审代码、跑测试、修 bug、写文档...",
    tools=[write_code, run_tests, lint, format, git, search_docs])

# 正面:三个专门角色,每个 prompt 简短、工具收敛
coder = AssistantAgent("coder", model_client=opus,
    system_message="只写实现。不写测试不写文档。",
    tools=[write_code, search_docs])

tester = AssistantAgent("tester", model_client=haiku,  # 用更便宜的模型
    system_message="只写 pytest 用例并执行。报告 pass/fail。",
    tools=[run_tests])

reviewer = AssistantAgent("reviewer", model_client=opus,
    system_message="只审代码。指出最严重的 1-3 个问题,不重写。",
    tools=[lint])
常见误区 + 实践场景
"分得越细越好"——错。每多一个 Agent 就多一次 LLM 调用 + 一次上下文传递损失,过度分工会导致信息丢失、延迟膨胀、调试地狱。经验阈值:单个 Agent 工具数控制在 5-7 个、system prompt 控制在 100-200 字以内时,已经够专一了,不必再拆。微服务有"合理粒度",Agent 也一样。
📌 妈妈场景:你的"跨学科学习助手"——读一篇论文时,拆成翻译 Agent(中英双向)、类比 Agent(用熟悉领域举例)、反驳 Agent(找文中可能的弱点)。每个 Agent prompt 极短、输出极聚焦,比一个"帮我读论文"的全能 Agent 信息密度高得多。
Takeaway + 思考题
💡 角色分工的本质不是"模拟人类团队",是给 LLM 减负——让每次推理只用必要的上下文。
🤔 你过去给单个 LLM 写过的 1000+ 字 prompt,能不能拆成 3 个 300 字的角色?拆完后你最担心丢什么?

协作协议Collaboration Protocols

分布式架构模式
一句话类比

多 Agent 之间"怎么交换信息和达成一致",是经典分布式系统协调问题的 LLM 版本——Paxos、leader election、gossip 协议、blackboard pattern 全都有对应版本。今天的 multi-agent 框架本质都是在这几种范式里组合。

它解决什么问题 + 工作机制

当你有 N 个 Agent,必须回答两个问题:(1) 谁在什么时候发言/行动?(控制流)(2) 共享状态怎么管?(数据流)。主流四种协议:

① Hierarchical(层级 / Manager-Worker)
Manager 拆任务 A B C 汇总
类比:CTO + 工程师;对应 CrewAI Hierarchical

② Sequential / Pipeline
A → output → B → output → C
类比:CI/CD pipeline;CrewAI Sequential 默认

③ Debate / Group Chat
ABC(共享对话历史,轮流发言)
类比:会议;AutoGen GroupChat、Multi-Agent Debate (Du et al. 2023)

④ Blackboard / Shared Memory
共享状态(DB/KV)A B C(独立读写)
类比:actor + Redis;LangGraph State、Letta、A2A 协议正在标准化

选哪种取决于任务:任务可拆且结果可合并用 Hierarchical;有明确依赖顺序用 Sequential;需要多视角辩论用 Debate;任意子集需要访问任意中间结果用 Blackboard。生产中常混合——外层 Sequential,某一步内部 Debate。

2024-2025 年还出现了新协议层:Google 的 A2A (Agent-to-Agent) 协议把跨厂商 Agent 互操作标准化(类似 Day 6 MCP 之于工具);Anthropic Claude 的 Computer Use + sub-agents 模式让 Agent 能 spawn 子 Agent。本质都还是这四种范式的工程化。

代码示例
# LangGraph:用图 + 共享状态实现混合协议(实战最常用)
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

class State(TypedDict):
    question: str
    research: Annotated[list, operator.add]   # blackboard 共享区
    answer: str

def researcher(s): return {"research": [search_web(s["question"])]}
def critic(s):     return {"research": [critique(s["research"])]}
def writer(s):     return {"answer": synthesize(s["research"])}

g = StateGraph(State)
g.add_node("research", researcher); g.add_node("critic", critic)
g.add_node("writer", writer)
g.add_edge("research", "critic")        # sequential
g.add_conditional_edges("critic",            # 条件路由
    lambda s: "writer" if good_enough(s) else "research")
g.add_edge("writer", END)
g.set_entry_point("research")
app = g.compile()
result = app.invoke({"question": "2026 年 AI Agent 趋势?", "research": []})
常见误区 + 实践场景
"用 Debate 协议让 N 个 Agent 投票就能消除幻觉"——只对了一半。研究(Du et al. 2023)显示 Debate 能改善事实推理题准确率约 5-15%,但对需要外部知识的题几乎无效——Agent 都是同一个底模,错误是相关的(correlated errors),投票无法纠正系统性偏差。真要消除幻觉,加 RAG 比加 Agent 投票有效得多。
📌 妈妈场景:用 LangGraph 搭一个"家庭决策助手"——blackboard 上放着家庭日历、预算、孩子近期情绪日志;三个 Agent 独立读写(行程规划 / 财务影响评估 / 亲子时间评分),最终汇总给你一个"周末是否安排额外补习班"的多维建议。共享状态比"多轮对话"更适合需要事实一致性的家庭决策。
Takeaway + 思考题
💡 multi-agent 协议设计的核心不在"AI 协作",在"分布式系统协调"——你的分布式背景就是核心 leverage。
🤔 如果你把 N 个 Agent 看成 N 个微服务,它们的失败模式和分布式系统有何相同/不同?(提示:思考"幂等"和"因果一致性"在 LLM 输出场景下意味着什么)

深入资源Further Reading

深入思考Deep Questions

1. Anthropic 在 "Building Effective Agents" 中明确说"先用 workflow 别用 multi-agent"——为什么?什么时候 multi-agent 真的不可替代
核心论点:multi-agent 引入额外的故障面(每多一个 Agent 多一次 LLM 失败概率)+ 通信成本(消息传递 token 浪费)+ 调试难度(非确定性叠加)。多数所谓"multi-agent"任务用显式 workflow + 单 Agent 就能解决,效果更稳成本更低。真正不可替代的场景:(a) 任务并行性强——10 个独立子问题,单 Agent 串行跑要 10×时间,10 个 Agent 并行 1×时间;(b) 需要对抗性视角——红蓝方辩论、生成-评判,单 Agent 同时演两角色会"自我安慰";(c) 角色权限隔离硬约束——客服 Agent 不能看到财务 Agent 的数据,安全上必须分离进程;(d) 长任务需要不同模型——便宜模型做大量初筛、强模型做最终决策。其他场景 workflow 优先。这跟"先 monolith 再考虑微服务"是完全一样的工程智慧。
2. multi-agent 系统的非确定性来自哪里?怎么让它的输出在生产环境可复现、可测试?
非确定性源头三层:(a) LLM 采样温度 > 0 自带随机;(b) Agent 之间消息顺序在异步场景下不固定;(c) 工具调用结果(外部 API)本身不稳定。缓解策略:(1) temperature=0 + 固定 seed——OpenAI/Anthropic 都支持 seed 参数,能消除 LLM 端随机;(2) 显式流程(CrewAI Sequential / LangGraph)替代自由对话(AutoGen GroupChat)——把"谁先说话"从 LLM 决策变成代码决定;(3) 外部工具 mock——评估时把 search/DB 调用替换成 fixture,剥离外部噪声;(4) 评估改用分布而非单跑——跑同一任务 N 次记录通过率,而不是看一次输出"过没过",更接近 ML 模型评估思维;(5) 结构化输出——强制每个 Agent 用 JSON Schema 输出,让中间状态可 diff。这套思路本质是把 multi-agent 从"魔法"还原成"可测试系统"。
3. 给 multi-agent 系统定价:怎么估算一个 5-Agent crew 的单次任务成本?哪些隐藏开销最容易低估?
基线公式:总 token = Σ (每个 Agent 的 system_prompt + 累计对话历史 + 工具描述) × 该 Agent 被调用次数。最容易低估的隐藏开销:(a) 对话历史膨胀——AutoGen GroupChat 默认所有 Agent 共享完整历史,5 个 Agent × 10 轮 = 50 次 LLM 调用,每次都带全量历史,token 是 O(N²) 增长;(b) 工具描述重复——同一个工具被 3 个 Agent 用,schema 在每个 Agent 的 prompt 里都要塞一遍;(c) 失败重试——Agent 输出格式错被 reviewer 打回重做,token 翻倍;(d) 不必要的"礼貌寒暄"——Agent 之间互相确认"好的,我开始做"占了 5-10% token。降本招数:使用 prompt caching(Day 6 提到过)、定期 summarize 对话历史压缩成 memory、关闭礼貌 prompt("直接交付结果,不要确认")、用 Hierarchical 替代 Debate(前者通信量是 O(N)、后者是 O(N²))。一个典型 5-Agent 任务从 50K token 优化到 8K token 是常见的,单次任务成本能降 80%。
4. 把"多 Agent 协作"和你熟悉的分布式共识算法(Paxos / Raft)对比,相同点和不同点是什么?这对 multi-agent 系统设计有什么启发?
相同点:都在解决"多个不可靠节点如何就一个值达成一致"——LLM 像分布式节点一样会"失败"(输出错误)、"分区"(上下文不一致)、"拜占庭"(恶意/被 prompt injection)。不同点:(a) Paxos/Raft 假设节点失败独立,但同一个底模的多个 Agent 失败是高度相关的(同样的 bias、同样的盲点),共识投票效果弱;(b) Paxos 优化的是正确性 + 延迟,multi-agent 优化的是正确性 + 创造性——前者要消除分歧,后者要利用分歧;(c) 分布式共识有形式化证明(safety/liveness),multi-agent 几乎没有理论保证。启发:(1) 多 Agent 投票要用不同底模(Opus + GPT-4 + Gemini)才能降低相关性;(2) 引入外部 ground truth(RAG、工具)打破"群体幻觉";(3) 关键节点必须能否决(human-in-the-loop = veto power);(4) 接受 multi-agent 的"liveness"不能保证——必须有 timeout 和 fallback。把分布式系统的悲观假设带进 multi-agent 设计,能避开 80% 的踩坑。
5. multi-agent 似乎在模拟"组织"——但人类组织效率低、政治内耗多。如果把 multi-agent 系统当作"新型组织设计的沙盒",能反过来教给人类管理什么?
这是有趣的反向思考。multi-agent 实验里反复验证的几条经验,对真人组织也成立:(a) 角色边界越清晰,协作越高效——多 Agent 失败案例 80% 是"职责不清",人类组织同理;(b) 显式流程优于灵活协商——AutoGen GroupChat 易陷僵局,CrewAI 显式 Task 稳定,对应"会议文化 vs 异步文档文化";(c) 专门化 + 短上下文 > 全能 + 长上下文——通才负责协调、专才负责深度,是同一原理;(d) 评判者比执行者更便宜——给 reviewer 用便宜模型效果不差,对应"好的 code review 不需要最资深的人,需要规则清晰的人";(e) 层级(Manager)比纯民主(Debate)更出结果——但 Manager 必须有更高质量的"大脑"(更强模型 / 更广视野)。反过来,multi-agent 提醒我们:组织设计不是"多放人就更聪明",而是"在什么场景下,结构化分工的收益超过协调成本"。这正好回到 Anthropic 那个清醒派立场——能用单 Agent / 单人解决就别堆人,复杂度永远要付代价。这种跨学科映射是 BigCat 你最擅长的思考方式。