智能体设计模式解析:监督者模式(Supervisor Pattern)

108 阅读6分钟

1. 概念与架构

监督者模式(Supervisor Pattern)是多智能体系统(Multi-Agent System)设计中最为经典实用的设计模式之一。它由一个中心化的监督者智能体和多个专用子智能体组成。监督者智能体作为中心化的控制器,负责接收用户请求并将其分发给适当的子智能体进行处理。专用子智能体负责执行具体的任务或提供特定的功能。监督者模式的核心思想是将系统的复杂性分解为多个独立的子系统,每个子系统负责特定的功能或任务。

监督者模式工作流程遵循严格的 "请求 - 决策 - 执行 - 反馈" 循环:

  • 用户请求进入系统
  • 监督者分析需求,拆解为子任务
  • 监督者分配任务给最合适的工作者
  • 工作者执行并返回结果
  • 监督者整合结果,决定下一步或生成最终响应

2. 核心价值

  • 专业化分工:将复杂任务分配给领域专家,提高执行质量和效率
  • 全局控制:确保系统按预设规则执行,满足合规性要求
  • 透明流程:所有决策和执行路径清晰可追溯,便于问题定位
  • 容错能力:监督者可监控工作者状态,在故障时重新分配任务
  • 资源优化:集中管理计算资源,避免重复工作和资源浪费

3. 实现机制

3.1 核心组件与交互

  1. 监督者职责
  • 任务分析与分解:理解用户意图,创建子任务序列
  • 智能体调度:基于能力匹配和上下文,选择执行工作者
  • 状态管理:维护全局上下文,传递给各工作者
  • 结果聚合:整合子任务输出,解决冲突,生成最终答案
  • 异常处理:处理工作者故障,执行重试或重新分配
  1. 工作者特性
  • 只与监督者通信,不直接与用户交互
  • 专注单一领域,具备深度专业知识
  • 接收任务、执行、返回结果,无自主决策能力

3.2 关键技术实现

  1. 任务路由机制
# 伪代码示例
def supervisor_decision(observation):
    if "机票" in observation:
        return flight_agent
    elif "酒店" in observation:
        return hotel_agent
    else:
        return default_agent
  1. 状态传递方式
  • 上下文随每次任务调用传递,包含完整对话历史
  • 使用摘要机制避免状态膨胀
  • 支持外部存储引用,减少传输开销
  1. 执行控制
  • 监督者决定执行顺序,工作者完成后控制权必须返回监督者
  • 支持条件分支和循环,构建复杂工作流

4. 应用场景

  1. 企业级流程管控
  • 金融交易系统:确保每笔交易符合监管规则,支持审计追踪
  • 订单管理:从受理到交付的全链路监控与协调
  • 医疗诊断辅助:协调专科 AI 进行多病种会诊,确保诊断合规
  1. 内容与数据处理
  • 智能报告生成:研究、数据收集、分析、撰写、审核的流水线作业
  • 多语言翻译:协调术语管理、语法分析、文化适配等专业模块
  • 舆情分析:数据采集、情感识别、趋势预测、风险评估的一体化流程
  1. 复杂系统集成
  • 智能客服:根据问题类型路由至不同领域的客服专家
  • IoT 设备管理:监控设备状态,协调故障排除和维护
  • 智能运维:多系统监控、故障诊断、自动修复的统一调度

5. 优势与挑战

5.1 优势

  1. 流程与控制优势
  • 精确可控:执行路径完全在监督者掌控下,确保结果可预测
  • 错误定位容易:所有操作通过单一节点,故障追踪效率高
  • 全局优化:可实施全局约束 (如预算、优先级),实现系统级最优
  1. 管理与维护优势
  • 易于理解:层次结构直观,系统设计和调试难度低
  • 集中管理:新增或更新功能只需修改监督者逻辑,维护成本低
  • 审计便利:所有决策和执行均有完整日志,满足合规审计要求
  1. 协作与扩展优势
  • 专业化深度:工作者专注特定领域,可实现更高水平的专业能力
  • 模块化设计:系统组件可独立开发、替换,增强可扩展性
  • 负载均衡:监督者可根据工作者状态动态分配任务,优化资源利用

5.2 挑战

  1. 性能瓶颈风险
  • 单点负载:监督者成为性能瓶颈,尤其在高并发场景
  • 通信开销:所有交互通过监督者中转,增加延迟
  1. 可靠性挑战
  • 单点故障:监督者失效将导致整个系统瘫痪
  • 容错依赖:系统可靠性高度依赖监督者的健壮性
  1. 灵活性受限
  • 刚性结构:修改流程需调整监督者逻辑,灵活性低于去中心化方案
  • 创新抑制:工作者缺乏自主决策能力,难以应对未预设的情况
  1. 复杂度与规模问题
  • 决策复杂性:随着系统扩大,监督者决策逻辑变得复杂,难以维护
  • 状态管理负担:维护全局上下文消耗资源,可能导致性能下降

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()