Multi-Agent 不是「找 N 個 LLM 一起跑」的單一概念。常見的分類整理出四種模式,各自合適不同問題。本文拆解 Supervisor、Handoffs、Router、Skills 四種模式的核心特徵、運作流程、優缺點與 Token 成本,並提供選擇決策框架。
快速概覽:四種模式 + 選擇決策
| 模式 | 適合什麼 | 不適合什麼 |
|---|
| Subagents (Supervisor) | 任務可分解 + 子任務獨立(報告生成、研究) | 需要 agent 間長時序記憶 |
| Handoffs | 流程中切換專精角色(客服 → 技術支援) | 任務無明確接力點 |
| Router | 純分派(問題分類後分發) | 需要彙整跨 agent 結果 |
| Skills | 動態工具加載(Claude Code 模式) | 多角色協作 |
真實系統常常混合使用:一個 Supervisor 底下,每個 Subagent 本身可能又是 Skills 模式。對應到 Claude Code,就是 Subagents(用 Agent tool 指定 subagent_type)和 Skills(用 Skill tool 動態載入 .md)兩種模式並存。
從核心特徵來看,四種模式在狀態管理與執行方式上有明顯差異:
| 模式 | 核心特徵 | 狀態管理 | 執行方式 |
|---|
| Subagents (Supervisor) | 中心化編排 | 主 Agent 有狀態,Subagents 無狀態 | 可並行 |
| Handoffs | 對等轉移 | 狀態跨 Agent 持久化 | 序列 |
| Router | 並行分派 | 無狀態 | 並行 |
| Skills | 動態加載 | 單一 Agent 累積上下文 | 序列/並行 |
模式一:Subagents (Supervisor 模式)
也稱:Hierarchical、Orchestrator-Workers、Manager-Worker。
架構圖
flowchart TD
U[用戶] --> S[Supervisor]
S --> A[Sub A] & B[Sub B] & C[Sub C]
A & B & C -.彙整.-> S
中心化編排:所有請求經過 Supervisor 分派給 Sub Agents,Sub Agents 各自獨立執行後將結果回報,由 Supervisor 彙整成最終結果。
核心特徵
| 特徵 | 說明 |
|---|
| 中心化控制 | 所有請求經過 Supervisor 路由 |
| 上下文隔離 | 每個 Sub Agent 獨立上下文窗口 |
| 狀態管理 | Supervisor 維護對話狀態,Sub Agents 無狀態 |
| 執行方式 | 可並行調用多個 Sub Agents |
| 結果彙整 | Supervisor 負責合成最終結果 |
運作流程
def subagents_architecture(task):
# 1. Supervisor 接收任務
supervisor_context = {"task": task, "history": []}
# 2. Supervisor 分解任務並分派
subtasks = supervisor_agent.plan(task)
results = []
for subtask in subtasks:
# 3. 調用 Sub Agent(可並行)
result = subagent.execute(
task=subtask,
context={} # 無狀態,每次新鮮開始
)
results.append(result)
# 4. Supervisor 彙整結果
final = supervisor_agent.synthesize(results)
return final
優缺點
| 優點 | 缺點 |
|---|
| 上下文隔離,Sub Agents 不累積 token bloat | 每次互動 +1 次 model call(經過 Supervisor) |
| 可平行執行多個 Sub Agents | Sub Agents 無記憶,無法記住過往互動 |
| 不同團隊可獨立開發 Sub Agents | Supervisor 可能成為效能瓶頸 |
| 所有路由決策統一管理 | |
效能數據
| 場景 | Model Calls | Token 用量 | 說明 |
|---|
| 單次請求 | 4 次 | 基準 | +1 次 Supervisor 開銷 |
| 重複請求 | 4 次/次 | 基準 | 無累積節省 |
| 多領域查詢 | 5 次 | ~9K | Token 效率最佳(vs Skills 15K) |
適用場景
- 個人助理(協調日曆、郵件、CRM)
- 研究系統(分派給領域專家)
- 複雜編碼任務(多文件修改)
- 需要平行執行的多領域查詢
實作範例
from langchain.agents import create_supervisor_agent, create_subagent
# Supervisor
supervisor = create_supervisor_agent(
model="claude-sonnet-4",
subagents=["researcher", "coder", "reviewer"]
)
# Sub Agents(無狀態)
researcher = create_subagent(
model="claude-haiku",
system_prompt="You are a research specialist...",
tools=[search_tool]
)
# 執行
response = supervisor.invoke({
"input": "Research quantum computing and write a summary"
})
模式二:Handoffs (對等轉移模式)
也稱:Peer-to-Peer、State-Driven Transitions、Relay。
架構圖
flowchart TD
U[用戶] --> A[Agent A]
A -->|handoff| B[Agent B]
B -->|handoff| C[Agent C]
B --> U2[用戶]
C --> U3[用戶]
對等架構:所有 Agents 地位平等,當下只有一位 Agent 活躍。Handoff 時將累積的上下文狀態傳遞給下一位 Agent,活躍的 Agent 可直接與用戶對話。
核心特徵
| 特徵 | 說明 |
|---|
| 對等架構 | 所有 Agents 地位平等 |
| 狀態轉移 | Handoff 時傳遞上下文狀態 |
| 單一活躍 | 當下只有一位 Agent 活躍 |
| 序列執行 | 必須按順序轉移 |
運作流程
def handoffs_architecture(task):
# 1. 初始 Agent 接收
state = {
"current_agent": "agent_a",
"context": {"task": task, "history": []},
"preconditions": {}
}
while not is_complete(state):
# 2. 當前 Agent 處理
current_agent = get_agent(state["current_agent"])
result = current_agent.process(state["context"])
# 3. 決定是否 Handoff
if result.needs_handoff:
# 4. 狀態轉移(關鍵:context 保留)
state["current_agent"] = result.next_agent
state["context"]["history"].append(result.summary)
state["preconditions"].update(result.preconditions)
else:
state["context"]["history"].append(result)
return state["context"]["history"]
優缺點
| 優點 | 缺點 |
|---|
| 自然對話流,用戶感覺在跟單一系統對話 | 序列執行,無法平行處理多領域查詢 |
| 跨 Agent 保留上下文(重複請求節省 40% calls) | 需要仔細設計狀態持久化 |
| 可強制執行前置條件 | 上下文可能越來越大(Token 累積) |
| Agent 可直接與用戶對話 | |
效能數據
| 場景 | Model Calls | Token 用量 | 說明 |
|---|
| 單次請求 | 3 次 | 基準 | 無 Supervisor 開銷 |
| 重複請求 | 2 次 | 基準 | 節省 40%(狀態保留) |
| 多領域查詢 | 7+ 次 | ~14K+ | 必須序列執行,效率較低 |
適用場景
- 客服流程(分段收集資訊)
- 多階段對話體驗
- 需要前置條件的工作流
- 諮詢→執行→驗證的序列任務
模式三:Router (並行分派模式)
也稱:Parallel Dispatch、Query Decomposition。
架構圖
flowchart TD
U[用戶] --> R[Router]
R --> A[Agent A] & B[Agent B] & C[Agent C]
A & B & C --> SY[Synthesizer]
SY --> U2[用戶]
查詢分解:Router 將任務拆成多個子查詢,並行分派給專精的 Agents,最後由獨立的 Synthesizer 組件負責彙整結果。每次請求獨立處理,無狀態。
核心特徵
| 特徵 | 說明 |
|---|
| 查詢分解 | Router 將任務分解為子查詢 |
| 並行執行 | 多個 Agents 同時處理 |
| 結果合成 | 獨立組件負責彙整 |
| 無狀態 | 每次請求獨立處理 |
運作流程
def router_architecture(task):
# 1. Router 分類/分解查詢
sub_queries = router.decompose(task)
# 輸出:[{"domain": "python", "query": "..."}, ...]
# 2. 並行調用 specialized agents
results = parallel_map(
lambda q: get_agent(q["domain"]).execute(q["query"]),
sub_queries
)
# 3. Synthesizer 彙整
final = synthesizer.combine(results)
return final
優缺點
| 優點 | 缺點 |
|---|
| 多領域查詢平行執行,效率最佳 | 無對話記憶,不適合多輪對話 |
| 每個 Agent 獨立上下文 | 每次都需要分類/分解(路由開銷) |
| 無狀態設計,每次請求效能穩定 | 難以處理跨領域依賴 |
| Token 效率高,無累積開銷 | |
效能數據
| 場景 | Model Calls | Token 用量 | 說明 |
|---|
| 單次請求 | 3 次 | 基準 | 高效 |
| 重複請求 | 3 次 | 基準 | 無累積節省 |
| 多領域查詢 | 5 次 | ~9K | 與 Subagents 並列最佳 |
適用場景
- 企業知識庫(多來源查詢)
- 多垂直客服助理
- 需要跨來源合成的研究任務
- 一次性查詢(非對話式)
模式四:Skills (技能加載模式)
也稱:Progressive Disclosure、Quasi-Multi-Agent。
架構圖
flowchart TD
U[用戶] <--> SA[Single Agent]
SA -.load.-> K1[Skill A] & K2[Skill B] & K3[Skill C]
本質上是單一 Agent,啟動時只知道 Skill 名稱與描述,按需動態加載專精的 prompt。加載後的 Skill 內容會保留在對話歷史中累積。
核心特徵
| 特徵 | 說明 |
|---|
| 單一 Agent | 本質上是單一 Agent |
| 動態加載 | 按需加載 specialized prompts |
| 上下文累積 | Skills 加載後保留在對話歷史 |
| 輕量級 | 比完整 Multi-Agent 更簡單 |
運作流程
def skills_architecture(task):
# 1. Agent 啟動時只知道 Skill 名稱/描述
agent_context = {
"skills": [
{"name": "sql_expert", "description": "SQL query specialist"},
{"name": "data_viz", "description": "Visualization expert"}
]
}
# 2. 判斷需要哪個 Skill
if needs_skill(task, "sql_expert"):
# 3. 動態加載完整 Skill context
skill_context = load_skill("sql_expert")
agent_context["history"].append(skill_context)
# 4. 執行(上下文已累積)
return agent.process(task, agent_context)
優缺點
| 優點 | 缺點 |
|---|
| 單一 Agent,易於調試 | Skills 累積在對話歷史(Token 膨脹) |
| Agent 直接與用戶對話 | 單一 Agent 序列處理,無平行執行 |
| 重複請求節省 40% calls | Skills 間無明確邊界,無隔離 |
| 不同團隊維護不同 Skills | |
效能數據
| 場景 | Model Calls | Token 用量 | 說明 |
|---|
| 單次請求 | 3 次 | 基準 | 高效 |
| 重複請求 | 2 次 | 基準 | 節省 40% |
| 多領域查詢 | 3 次 | ~15K | Token 累積嚴重(vs Subagents 9K) |
決策框架
根據需求選擇模式
| 你的需求 | 推薦模式 |
|---|
| 多個獨立領域(日曆、郵件、CRM),需要平行執行 | Subagents |
| 單一 Agent 有多種專業化,輕量級組合 | Skills |
| 序列工作流,有狀態轉移,Agent 與用戶全程對話 | Handoffs |
| 獨立垂直領域,平行查詢多來源並合成結果 | Router |
五維度評估矩陣
| 模式 | 分布式開發 | 平行執行 | 多跳支援 | 直接用戶互動 | 上下文效率 |
|---|
| Subagents | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐⭐ |
| Skills | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| Handoffs | ⭐⭐⭐ | — | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Router | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | — | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
Swarm 架構補充
Swarm 概念來自 OpenAI 早期實驗加上學術研究,強調去中心化協作。
Swarm vs 傳統 Multi-Agent
| 特徵 | 傳統 Multi-Agent | Swarm |
|---|
| 控制 | 中心化(Supervisor)或規則驅動 | 去中心化、湧現行為 |
| 通訊 | 明確 handoff 或 tool call | 廣播/共享黑板 |
| 決策 | 預定義規則 | 分散式共識 |
| 靈活性 | 中 | 高 |
| 可預測性 | 高 | 低 |
Swarm 關鍵特徵
- 去中心化控制:無 Supervisor,決策分散
- 共享黑板:Agents 通過共享工作區協作
- 湧現行為:整體行為從局部互動湧現
- 動態角色:Agents 可動態切換角色
Swarm 適用場景
- 開放式探索任務
- 創意發想/腦力激盪
- 研究問題(無明確答案)
- 需要多樣視角的複雜問題
實作建議
何時升級到 Multi-Agent
當單一 Agent 遇到以下限制時,可考慮升級:
- Context Window 不足 → 上下文隔離:Subagents / Router
- 團隊協作需求 → 明確邊界:Subagents / Skills
- 複雜任務分解 → 動態規劃:Subagents
- 多階段對話 → 狀態轉移:Handoffs
- 多來源查詢 → 平行執行:Router / Subagents
效能優化建議
| 優化目標 | 推薦模式 |
|---|
| 最低延遲(單次請求) | Skills / Handoffs / Router |
| 最低 Token 用量(多領域) | Subagents(67% 節省 vs Skills) |
| 最佳對話體驗 | Handoffs / Skills |
| 最佳平行效能 | Subagents / Router |
參考文獻