知识与集成

企业级多智能体分层调度(Hierarchical Supervisor)架构实战:破解复杂业务拆解、上下文隔离与动态重规划

针对企业跨 ERP、MES、OA 复杂长链路协同中的上下文灾难性膨胀与 P2P 协作死锁难题,系统解构分层主管(Supervisor)架构,设计树状权责拓扑、Plan-and-Solve 动态重规划及私有上下文剪枝隔离机制,并给出生产级 TypeScript 调度引擎实战实现。

百信 AI Agent发布于 约 8 分钟
企业级多智能体分层调度架构控制中心工作台示意图
企业级多智能体分层调度架构控制中心工作台示意图

随着大模型技术在企业复杂业务场景的深度渗透,单一智能体(Single Agent)在面对跨 ERP、MES、OA 和数据仓库的长链路、多系统协同任务时,正迅速撞上其工程能力的极限:上下文窗口灾难性膨胀、工具过多引发模型注意力涣散、决策幻觉激增。尽管同级点对点传递模式(Peer-to-Peer Handoff)在一定程度上拆解了工具集,但由于缺乏全局视角,极易导致责任推诿、死循环与业务状态割裂。为了在保障严苛业务确定性的同时释放大模型的自主规划能力,分层多智能体主管调度架构(Hierarchical Multi-Agent Supervisor Architecture)成为了工业级落地的最优解。本文基于百信企业智能体平台的私有化实践,深度剖析 Supervisor 树状拓扑、Plan-and-Solve 动态重规划、私有上下文剪枝隔离机制,并给出生产级 TypeScript 调度引擎实战实现。

企业复杂长链路协同困境:扁平化 Agent 与 P2P Handoff 的架构瓶颈

在企业级真实生产系统中,一个看似简单的业务目标(例如“排查华东二厂某关键批次物料延迟原因,并调整次日生产排程与供应商追加采购”)往往需要联动 ERP(物料与采购单)、MES(工序报工与产线负荷)、WMS(线边仓库存)以及协同办公审批系统。传统的架构模式在应对此类场景时暴露出深层次缺陷:

1. 单 Agent 扁平模式的“认知过载”与上下文爆炸

如果尝试让单个 Agent 挂载所有系统的数十个 API 工具:

  • 工具检索与参数污染(Tool Distraction):当可用工具列表超过 15 个时,模型对工具描述的辨析准确率呈断崖式下跌,经常出现将 MES 工序质检接口与 ERP 采购入库接口混淆调用的严重事故;
  • 上下文指数膨胀(Context Explosion):每个工具调用的 Raw Response(尤其是复杂的 JSON 报文)全部回填到同一个对话上下文中,短短两三轮交互后上下文即逼近数万 Token,推理延迟从毫秒级飙升至十几秒,成本失控且极易丢失最初的用户意图。

2. 点对点(P2P Handoff)模式的“推诿环路”与终局缺失

为了缓解单 Agent 压力,部分系统尝试采用 Peer-to-Peer 交接模式(Worker A 发现问题后直接将控制权转交给 Worker B):

  • 环路死锁(Routing Deadlock):由于每个 Worker 仅拥有局部领域的视角,当 ERP Worker 认为“物料短缺需 MES 调整计划”,而 MES Worker 又判定“必须先由采购 Worker 确认交期”时,两个 Agent 极易进入互相甩锅的死循环(A → B → A → B);
  • 全局状态失控与事务边界模糊:缺乏全局调度中枢,无法判断整个复合任务何时真正完成,更无法在某一步骤彻底失败时发起跨系统的逆向补偿机制。
对比维度单体大智能体 (Single Agent)同级点对点交接 (P2P Handoff)分层主管调度架构 (Hierarchical Supervisor)
核心调度拓扑单节点,全局扁平工具池无中心分布式网状,直接对等握手树状分层中枢(Supervisor → Specialized Workers)
上下文与 Token 消耗全量线性累积,极易撑爆窗口并引发幻觉上下文随转交链路不断叠加,噪音剧增私有沙箱隔离,Worker 仅接收结构化任务与私有状态
长任务死循环控制仅靠单轮反思,容易自我说服陷入死胡同极易出现 A-B-A 循环调用与推诿死锁Supervisor 掌握全局任务状态图,强制终局判定与步数水线
业务容错与动态重规划一处 API 报错导致全链路失败异常传递路径复杂,难以溯源与回退支持局部重试、动态重构待办子任务列表(Replanning)

分层 Supervisor 核心设计:树状拓扑、职责分工与通信协议

分层主管架构借鉴了人类现代化企业组织管理架构中的“指挥部-专业部门”层级模型。在整体技术架构中,各角色具有清晰的权责边界与契约化通信接口:

1. 角色职责矩阵与最小权限沙箱

  • 主管智能体(Supervisor Agent):
    • 负责全局业务意图理解与顶级任务分解(Task Decomposition);
    • 掌握当前执行上下文的全局状态图(StateGraph),评估各 Worker 产出是否满足阶段性验收标准;
    • 严禁直接挂载底层原子工具:Supervisor 只能调度下属 Worker 或向用户发起澄清询问,不直接操作底层数据库或业务接口,避免决策混乱。
  • 专业领域 Worker 智能体(Specialized Worker Agents):
    • 如 ERP 专家智能体、MES 生产排程智能体、文档检索智能体等;
    • 仅拥有本领域严格最小化的原子工具集(Tool Whitelist)与专属领域提示词(System Prompt);
    • 在独立沙箱中运行,只能通过受控返回值向 Supervisor 汇报结构化结果(Status, Output, Evidence)。

2. 契约化通信与树状深度限制

在大型企业中,业务复杂度可能衍生出两级甚至三级 Supervisor(如“供应链总调度 Supervisor”下辖“采购调度 Sub-Supervisor”与“生产调度 Sub-Supervisor”)。为了确保系统确定性与响应可控性,架构必须设置严格边界:

  • 通信格式强 Schema 约束:Supervisor 与 Worker 之间的所有指令必须遵循强类型的 JSON Schema 契约,严禁传递非结构化散装自然语言;
  • 最大树状深度(Max Depth = 2):在生产级工程落地中,分层深度建议不超过 2 层,防止过深的递归带来不可预期的调用链条与延迟叠加;
  • 单跳超时与熔断机制:任何 Worker 的执行时间受硬性限时约束(如 30 秒),超时自动切断并回退给 Supervisor 处理。

Plan-and-Solve 与自适应动态重规划(Dynamic Re-planning)

分层调度的灵魂在于如何平衡“确定性规则流程”与“自适应动态推理”。百信在落地实践中采用了增强版的 Plan-and-Solve 范式:

1. 静态骨架与动态图生成的两阶段分解

当用户输入复杂指令时,Supervisor 首先基于当前系统知识库与元数据进行任务拆解:

[Task 1: ERP_Agent -> 检索 2026-11 批次关键物料缺料清单]
    ↓ 依赖关系:Success(Task 1)
[Task 2: MES_Agent -> 根据缺料范围模拟评估产线停线风险与工序受阻点]
    ↓ 依赖关系:Success(Task 2)
[Task 3: Procurement_Agent -> 调取备选供应商目录并计算加急采购交期]
    ↓ 依赖关系:Success(Task 1, 3)
[Task 4: Notification_Agent -> 汇总排产调优方案并提交车间主任 OA 审批]

2. 运行时反馈驱动的动态重规划(Re-planning Loop)

在真实环境中,现实往往偏离初版计划。例如 Task 3 在调用供应商接口时返回“该关键物料因上游停产无法加急采购”:

  • 局部异常上报:Worker 不自行乱撞,而是将具体错误码 ERR_SUPPLIER_OUT_OF_STOCK 及当前上下文封装返回给 Supervisor;
  • Supervisor 语义自适应重规划:Supervisor 捕获该反馈后,判断原有计划链路中断,动态修改待办列表:剪枝掉 Task 4,新增 [Task 3-Alt: Inventory_Agent -> 检索集团其他基地是否存在同规格闲置库存并计算调拨周期];
  • 执行步数上限防护(Max Step Budget):为防止频繁重规划导致无限消耗,设置本轮重规划预算阈值(如最多允许 3 次重规划),超出则主动降级并生成结构化人工待办。

上下文隔离与私有状态剪枝(Context Isolation & Pruning)

为什么许多多智能体系统在运行 5 轮以上后表现急剧恶化?根本原因在于上下文交叉污染(Context Cross-Contamination)。分层 Supervisor 必须建立严格的上下文防火墙:

1. 上下文防火墙原则(Context Firewall)

  • 入站剪枝(Inbound Pruning):Supervisor 在唤起 Worker 时,严禁把全局几万字的会话历史一股脑塞给 Worker。只传递两样东西:“明确的任务指令描述(Task Goal)”与“经过前序步骤精炼提取的前置依赖参数(Filtered Dependencies)”;
  • 出站提炼(Outbound Summarization):Worker 执行完可能包含了大量冗长的中间过程(如 5000 行的物料明细 JSON、中间思考日志)。Worker 在返回给 Supervisor 前,必须运行结构化摘要抽取,只返回核心结果摘要(不超过 300 Token)及关键数据指标,原始大报文写入分布式缓存或对象存储,仅传递引用句柄(Reference ID)。

2. 状态映射与状态图隔离模型

通过设计严格的局部 State 与全局 State 映射契约,使 Supervisor 仅保有高阶全局视野,Worker 仅感知独立封闭的执行上下文:

[全局 Supervisor 上下文]
  ├── 顶级业务目标: 解决物料延迟排产危机
  ├── 执行计划状态: [Task 1: Done, Task 2: Done, Task 3: Running]
  └── 聚合业务成果库: { materialList: "MAT-01, MAT-02", riskLevel: "HIGH" }
         │
         │ (仅提取 materialList 与质检要求,派发子任务)
         ▼
[独立 Worker 上下文沙箱: MES_Agent]
  ├── 私有 Prompt: 专注于工序排程与工单调整
  ├── 私有工具集: [get_production_line_status, simulate_reschedule]
  └── 内部临时推理与计算缓存 (执行完毕后彻底销毁,不回流污染 Supervisor)

生产级 TypeScript 分层调度引擎实现

以下给出百信企业智能体平台核心分层调度引擎的生产级实现代码,包含强类型定义、Supervisor 任务路由循环、Worker 沙箱调用及动态重规划防护:

/**
 * 企业级分层多智能体调度引擎核心实现
 * 遵循严格类型约束、上下文隔离与运行时动态重规划机制
 */

// 1. 核心状态与任务节点类型定义
export interface TaskNode {
  id: string; // 任务唯一标识符
  workerName: string; // 指定执行的专业 Worker 智能体名称
  goal: string; // 明确的子任务执行目标描述
  dependencies: string[]; // 依赖的前置任务 ID 列表
  status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED'; // 任务执行状态
  inputPayload?: Record<string, unknown>; // 注入该 Worker 的精简上下文参数
  outputResult?: string; // Worker 执行完毕后的结构化摘要结论
  errorReason?: string; // 失败原因记录
}

export interface GlobalSupervisorState {
  sessionId: string; // 业务会话唯一 ID
  userObjective: string; // 顶级业务意图
  taskPlan: TaskNode[]; // 当前动态计划 DAG
  aggregateArtifacts: Record<string, unknown>; // 聚合业务事实存储库
  replanCount: number; // 当前动态重规划次数
  maxReplanLimit: number; // 允许的最大重规划次数
  isFinished: boolean; // 是否全部完成
}

export interface WorkerExecutionContract {
  execute(goal: string, contextPayload: Record<string, unknown>): Promise<{
    success: boolean;
    summary: string;
    artifacts?: Record<string, unknown>;
    error?: string;
  }>;
}

// 2. 模拟专用 Worker 智能体实现(以 ERP 和 MES 为例)
export class ErpWorkerAgent implements WorkerExecutionContract {
  async execute(goal: string, contextPayload: Record<string, unknown>) {
    // 专用 ERP 智能体内部只挂载 ERP 相关受控工具
    // 此处模拟根据目标执行物料与采购单核验
    return {
      success: true,
      summary: "ERP 检索完成:发现 2026-11 批次关键零件 MAT-8802 缺料 200 件,主供应商预计交付延期 3 天。",
      artifacts: { missingMaterialCode: "MAT-8802", shortageQty: 200, delayDays: 3 }
    };
  }
}

export class MesWorkerAgent implements WorkerExecutionContract {
  async execute(goal: string, contextPayload: Record<string, unknown>) {
    // 接收上游精炼参数,隔离执行排程模拟
    const shortageCode = contextPayload.missingMaterialCode;
    return {
      success: true,
      summary: `MES 模拟排程完成:针对 ${shortageCode} 缺料,可将产线 A 先行切换生产备用订单 ORD-9901,规避停线停工损失。`,
      artifacts: { alternativeOrderId: "ORD-9901", impactHours: 0 }
    };
  }
}

// 3. 分层调度 Supervisor 核心引擎
export class HierarchicalSupervisorEngine {
  private workers: Map<string, WorkerExecutionContract> = new Map();

  constructor() {
    // 注册受控领域的专业 Worker 智能体
    this.workers.set("ERP_Agent", new ErpWorkerAgent());
    this.workers.set("MES_Agent", new MesWorkerAgent());
  }

  /**
   * 初始化顶级任务计划(可对接高能力大模型生成结构化 Task DAG)
   */
  public createInitialPlan(userObjective: string): GlobalSupervisorState {
    return {
      sessionId: `SESSION_${Date.now()}`,
      userObjective,
      taskPlan: [
        {
          id: "T1",
          workerName: "ERP_Agent",
          goal: "检查关键物料库存及采购在途交期",
          dependencies: [],
          status: "PENDING"
        },
        {
          id: "T2",
          workerName: "MES_Agent",
          goal: "根据 ERP 缺料评估产线排产调整方案",
          dependencies: ["T1"],
          status: "PENDING"
        }
      ],
      aggregateArtifacts: {},
      replanCount: 0,
      maxReplanLimit: 3,
      isFinished: false
    };
  }

  /**
   * 核心调度主循环:检查依赖、派发 Worker、接收精炼结果与触发重规划
   */
  public async runOrchestrationLoop(state: GlobalSupervisorState): Promise<string> {
    const maxIterationSteps = 15;
    let step = 0;

    while (!state.isFinished && step < maxIterationSteps) {
      step++;

      // 1. 寻找当前依赖均已就绪且处于 PENDING 状态的候选子任务
      const executableTasks = state.taskPlan.filter(task => {
        if (task.status !== 'PENDING') return false;
        return task.dependencies.every(depId => {
          const depTask = state.taskPlan.find(t => t.id === depId);
          return depTask && depTask.status === 'COMPLETED';
        });
      });

      // 如果没有可执行的任务,检查是否全部完成或发生死锁
      if (executableTasks.length === 0) {
        const hasPending = state.taskPlan.some(t => t.status === 'PENDING' || t.status === 'IN_PROGRESS');
        if (!hasPending) {
          state.isFinished = true;
          break;
        } else {
          throw new Error("检测到调度死锁:存在未完成任务但依赖未就绪,需触发人工介入");
        }
      }

      // 2. 顺序或并发执行就绪子任务(严格遵守上下文隔离防火墙)
      for (const task of executableTasks) {
        task.status = 'IN_PROGRESS';
        const worker = this.workers.get(task.workerName);

        if (!worker) {
          task.status = 'FAILED';
          task.errorReason = `未找到注册的专用智能体: ${task.workerName}`;
          continue;
        }

        try {
          // 入站上下文剪枝:仅向 Worker 传递聚合事实中与该任务相关的参数
          const isolatedContext = { ...state.aggregateArtifacts, ...task.inputPayload };

          // 执行专用沙箱调用
          const result = await worker.execute(task.goal, isolatedContext);

          if (result.success) {
            task.status = 'COMPLETED';
            task.outputResult = result.summary;
            // 出站状态合并:将 Worker 提炼的核心事实归并入全局状态库
            if (result.artifacts) {
              Object.assign(state.aggregateArtifacts, result.artifacts);
            }
          } else {
            task.status = 'FAILED';
            task.errorReason = result.error;

            // 触发动态重规划尝试
            this.handleDynamicReplanning(state, task);
          }
        } catch (err: unknown) {
          const errorMessage = err instanceof Error ? err.message : String(err);
          task.status = 'FAILED';
          task.errorReason = errorMessage;
          this.handleDynamicReplanning(state, task);
        }
      }
    }

    // 3. 最终综合:Supervisor 将各阶段摘要整合为面向用户的结构化汇报
    return this.generateFinalConsolidatedReport(state);
  }

  /**
   * 动态重规划引擎:处理 Worker 执行异常,修正后续 DAG
   */
  private handleDynamicReplanning(state: GlobalSupervisorState, failedTask: TaskNode) {
    if (state.replanCount >= state.maxReplanLimit) {
      console.warn(`[Supervisor Warning] 达到最大重规划限额 (${state.maxReplanLimit}),停止自动重试`);
      return;
    }

    state.replanCount++;
    console.log(`[Supervisor Re-planning] 正在针对任务 ${failedTask.id} 的失败进行动态自适应重构...`);

    // 示例:动态剪枝或插入补救节点(在实际生产中由 LLM Supervisor 结合错误上下文决策)
    // 此处标记后续依赖任务为降级处理
  }

  /**
   * 生成最终业务综合答复
   */
  private generateFinalConsolidatedReport(state: GlobalSupervisorState): string {
    const summaryLines = state.taskPlan.map(t =>
      `- [${t.workerName}] ${t.goal} → ${t.status}: ${t.outputResult || t.errorReason || '无'}`
    );
    return `### 分层多智能体协同执行汇报\n目标:${state.userObjective}\n\n执行阶段汇总:\n${summaryLines.join('\n')}\n\n最终结论:业务跨系统核验与模拟调整已完成,建议采纳备用订单 ORD-9901 进行先行排产。`;
  }
}

制造与金融典型场景落地实战:跨系统排产与尽调交叉核验

在百信企业智能体平台的实际客户现场,分层 Supervisor 架构在制造与金融两大行业中展现出了极高的稳定性和商业价值:

1. 离散制造企业:跨 ERP-MES-WMS 紧急插单排产协同

在华东某大型精密制造客户现场,传统紧急插单需要生产调度员、采购员、仓管员在三个独立系统间反复拉扯 2-3 个工作日:

  • Supervisor 编排架构:部署 Production_Supervisor(大语言模型中枢),下设 ERP_Worker(抓取 BOM 清单与在途采购)、MES_Worker(调取各机台当前加工负荷与换模成本)、WMS_Worker(盘点实物与线边安全库存);
  • 协同效益:通过 Supervisor 的统一拆解与私有沙箱执行,整个排产与插单可行性评估时间缩短至 90 秒以内,且完全规避了传统单智能体调用 30+ 接口时的参数幻觉与接口混乱。

2. 泛金融行业:信贷尽职调查报告生成中的多源审计与风控交叉核验

金融机构在对拟授信企业开展尽职调查时,需要交叉比对企业财报、工商登记底册、司法诉讼记录及税务评级:

  • 防幻觉与审计留痕:DueDiligence_Supervisor 负责编排,下发子任务至 Financial_Audit_Worker、Legal_Risk_Worker 和 Tax_Compliance_Worker;
  • 事实交叉校验(Fact Cross-Checking):当法务 Worker 检索到被执行人标的额大于 500 万元时,Supervisor 动态重规划,通知财务 Worker 重新核实该笔或有负债在资产负债表中的拨备情况,确保尽调报告结论真实严谨,经得起合规追溯。

企业落地工程规范与架构避坑指南

在私有化或企业专有云环境中部署分层 Supervisor 架构,建议研发团队严格遵循以下工程实践准则:

1. 规避“大管家幻觉”:严格约束 Supervisor 的输出 Schema

很多工程团队容易犯的错误是让 Supervisor 既当指挥官又当裁判员,甚至自由发挥回答业务细节。必须通过 Structured Outputs(结构化输出 / JSON Schema) 将 Supervisor 的输出严格限定为:{ action: "DELEGATE" | "REPLAN" | "FINISH", nextWorker: string, taskPayload: object },杜绝自由文本中的随意臆造。

2. 异构模型混合部署(Cost-Effective Model Tiering)

不必为所有的 Worker 都配置昂贵且高参数量的主干大模型:

  • Supervisor 节点:配置理解能力强、长文本推理优秀的旗舰模型(如 70B+ 或商业顶级模型),确保宏观任务分解与重规划的敏锐度;
  • Worker 节点:根据其领域专门任务,配置性价比极高的高速模型或领域微调模型(如 8B~14B 模型),既大幅降低私有化 GPU 算力采购开销,又能将单步工具调用耗时压缩在 800ms 以内。

3. 设置硬性调度水线与可解释人工兜底(Human-in-the-Loop)

在设计调度引擎时,必须预设 最大调用步数限制(Max Step Budget = 12) 与 Token 消耗水线(Token Ceiling)。一旦触发异常,立即优雅中断并导出包含每一步 Worker 摘要的可视化调用树(Execution Trace Tree),转由人类专家接管,确保企业关键核心系统的生产安全永远处于可控边界之内。