1. 概念与架构
监督者模式(Supervisor Pattern)是多智能体系统(Multi-Agent System)设计中最为经典实用的设计模式之一。它由一个中心化的监督者智能体和多个专用子智能体组成。监督者智能体作为中心化的控制器,负责接收用户请求并将其分发给适当的子智能体进行处理。专用子智能体负责执行具体的任务或提供特定的功能。监督者模式的核心思想是将系统的复杂性分解为多个独立的子系统,每个子系统负责特定的功能或任务。
监督者模式工作流程遵循严格的 "请求 - 决策 - 执行 - 反馈" 循环:
- 用户请求进入系统
- 监督者分析需求,拆解为子任务
- 监督者分配任务给最合适的工作者
- 工作者执行并返回结果
- 监督者整合结果,决定下一步或生成最终响应
2. 核心价值
- 专业化分工:将复杂任务分配给领域专家,提高执行质量和效率
- 全局控制:确保系统按预设规则执行,满足合规性要求
- 透明流程:所有决策和执行路径清晰可追溯,便于问题定位
- 容错能力:监督者可监控工作者状态,在故障时重新分配任务
- 资源优化:集中管理计算资源,避免重复工作和资源浪费
3. 实现机制
3.1 核心组件与交互
- 监督者职责
- 任务分析与分解:理解用户意图,创建子任务序列
- 智能体调度:基于能力匹配和上下文,选择执行工作者
- 状态管理:维护全局上下文,传递给各工作者
- 结果聚合:整合子任务输出,解决冲突,生成最终答案
- 异常处理:处理工作者故障,执行重试或重新分配
- 工作者特性
- 只与监督者通信,不直接与用户交互
- 专注单一领域,具备深度专业知识
- 接收任务、执行、返回结果,无自主决策能力
3.2 关键技术实现
- 任务路由机制
# 伪代码示例
def supervisor_decision(observation):
if "机票" in observation:
return flight_agent
elif "酒店" in observation:
return hotel_agent
else:
return default_agent
- 状态传递方式
- 上下文随每次任务调用传递,包含完整对话历史
- 使用摘要机制避免状态膨胀
- 支持外部存储引用,减少传输开销
- 执行控制
- 监督者决定执行顺序,工作者完成后控制权必须返回监督者
- 支持条件分支和循环,构建复杂工作流
4. 应用场景
- 企业级流程管控
- 金融交易系统:确保每笔交易符合监管规则,支持审计追踪
- 订单管理:从受理到交付的全链路监控与协调
- 医疗诊断辅助:协调专科 AI 进行多病种会诊,确保诊断合规
- 内容与数据处理
- 智能报告生成:研究、数据收集、分析、撰写、审核的流水线作业
- 多语言翻译:协调术语管理、语法分析、文化适配等专业模块
- 舆情分析:数据采集、情感识别、趋势预测、风险评估的一体化流程
- 复杂系统集成
- 智能客服:根据问题类型路由至不同领域的客服专家
- IoT 设备管理:监控设备状态,协调故障排除和维护
- 智能运维:多系统监控、故障诊断、自动修复的统一调度
5. 优势与挑战
5.1 优势
- 流程与控制优势
- 精确可控:执行路径完全在监督者掌控下,确保结果可预测
- 错误定位容易:所有操作通过单一节点,故障追踪效率高
- 全局优化:可实施全局约束 (如预算、优先级),实现系统级最优
- 管理与维护优势
- 易于理解:层次结构直观,系统设计和调试难度低
- 集中管理:新增或更新功能只需修改监督者逻辑,维护成本低
- 审计便利:所有决策和执行均有完整日志,满足合规审计要求
- 协作与扩展优势
- 专业化深度:工作者专注特定领域,可实现更高水平的专业能力
- 模块化设计:系统组件可独立开发、替换,增强可扩展性
- 负载均衡:监督者可根据工作者状态动态分配任务,优化资源利用
5.2 挑战
- 性能瓶颈风险
- 单点负载:监督者成为性能瓶颈,尤其在高并发场景
- 通信开销:所有交互通过监督者中转,增加延迟
- 可靠性挑战
- 单点故障:监督者失效将导致整个系统瘫痪
- 容错依赖:系统可靠性高度依赖监督者的健壮性
- 灵活性受限
- 刚性结构:修改流程需调整监督者逻辑,灵活性低于去中心化方案
- 创新抑制:工作者缺乏自主决策能力,难以应对未预设的情况
- 复杂度与规模问题
- 决策复杂性:随着系统扩大,监督者决策逻辑变得复杂,难以维护
- 状态管理负担:维护全局上下文消耗资源,可能导致性能下降
6. 代码示例
本案例中,我们使用监督者模式实现一个复杂问题求解系统。系统包含两个子智能体:一个数学专家和一个研究专家。数学专家负责解决数学问题,而研究专家负责搜索互联网获取相关信息。监督者智能体负责协调这两个子智能体,根据用户输入选择合适的智能体进行任务处理。
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain.tools import tool
# 加载环境变量
load_dotenv()
# 获取对话模型
def get_model():
model = init_chat_model(
api_key = os.getenv("model_api_key"),
base_url = os.getenv("model_api_base"),
model = "Qwen/Qwen3-8B",
model_provider = "openai",
temperature = 0.1,
)
return model
# 创建工具
@tool
def add(a: float, b: float) -> float:
"""Add two numbers."""
return a + b
@tool
def multiply(a: float, b: float) -> float:
"""Multiply two numbers."""
return a * b
@tool
def divide(a: float, b: float) -> float:
"""Divide two numbers."""
return a / b
@tool
def web_search(query: str) -> str:
"""Search the web for information."""
return (
"Here are the headcounts for each of the FAANG companies in 2024:\n"
"1. **Facebook (Meta)**: 67,317 employees.\n"
"2. **Apple**: 164,000 employees.\n"
"3. **Amazon**: 1,551,000 employees.\n"
"4. **Netflix**: 14,000 employees.\n"
"5. **Google (Alphabet)**: 181,269 employees."
)
# 创建智能体
model=get_model()
math_agent = create_agent(
model=model,
tools=[add, multiply, divide],
name="math_expert",
system_prompt="You are a math expert to solve math problems."
)
research_agent = create_agent(
model=model,
tools=[web_search],
name="research_expert",
system_prompt="You are a world class researcher with access to web search. Do not do any math task."
)
@tool("math_agent_tool",description="Use this tool to solve math problems. Input can be a math expression or a math problem description.")
def call_math_agent(query: str):
result = math_agent.invoke({
"messages": [{"role": "user", "content": query}]
})
return result["messages"][-1].content
@tool("research_agent_tool",description="Use this tool to search the web for information. Input can be a question or a topic.")
def call_research_agent(query: str):
result = research_agent.invoke({
"messages": [{"role": "user", "content": query}]
})
return result["messages"][-1].content
# Create supervisor agent
supervisor_agent = create_agent(
model=model,
tools=[call_math_agent, call_research_agent],
name="supervisor_agent",
system_prompt="You are a team supervisor managing a research expert and a math expert. "
"Your role is to break down user questions into multiple steps and coordinate tools to answer them. "
"For current events, use research_agent_tool. "
"For math problems, use math_agent_tool."
)
result = supervisor_agent.invoke({
"messages": [
{
"role": "user",
"content": "1. what are the headcounts of the FAANG companies in 2024? 2. Add each company's headcount together."
}
]
})
for message in result["messages"]:
message.pretty_print()