一、数百个Agent带来的管理复杂度

单Agent阶段,管理是简单的:一个实例、一套配置、一份日志。当Agent数量增长到数十、数百时,复杂度呈非线性上升:

身份爆炸。 每个Agent都需要独立身份、凭证和权限边界。用人工逐个配置,配置本身就成了瓶颈。

能力重复。 财务Agent和HR Agent都需要“文档解析”,各自建一套,维护成本翻倍。

权限失控。 Agent绑定岗位权限,执行低风险任务时仍持有高权限,攻击面扩大。

任务跨Agent无法编排。 一个“月度结账”任务需要财务、审计、报表三个Agent协作,没有统一编排层,任务流转靠人工协调。

可观测性缺失。 数百个Agent的执行日志分散在各处,出了问题不知道是哪个Agent、哪一步、哪个权限校验环节出的错。

生命周期混乱。 Agent上线、升级、下线没有统一流程,旧实例权限未回收、僵尸Agent持续运行。

“机器人工厂”要解决的,就是把Agent的注册、编排、权限、监控和生命周期统一管起来。

二、整体架构:五层机器人工厂

┌─────────────────────────────────────────────────────────────────┐
│                      任务接入层                                  │
│   用户指令 / 定时触发 / 事件触发 / 外部API                       │
│   任务解析 → 生成trace_id → 路由至编排层                        │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                     Agent注册中心                                │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ Agent身份注册│  │ 技能注册     │  │ 连接器注册   │          │
│  │ 能力标签/版本│  │ 参数/权限    │  │ API/屏幕操作 │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      任务编排层                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ DAG调度      │  │ 状态管理     │  │ 异常恢复     │          │
│  │ 依赖/并行    │  │ 持久化/断点  │  │ 重试/降级    │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    权限与审计层                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ 任务级权限   │  │ 字段级RBAC   │  │ 全链路审计   │          │
│  │ 随任务收敛   │  │ 数据范围隔离 │  │ 谁/什么/何时 │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    可观测与生命周期                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ 执行指标     │  │ 异常告警     │  │ 版本/下线    │          │
│  │ 成功率/耗时  │  │ 越权/失败    │  │ 权限回收     │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘

核心设计原则:Agent是能力载体,任务才是调度单位;身份独立,权限随任务收敛;注册、编排、审计、生命周期统一管理。

五层之间的调用关系可以概括为下面这张流程图:

反馈与回收

任务接入层
用户指令 / 定时 / 事件 / API

Agent注册中心
身份 / 技能 / 连接器

任务编排层
DAG调度 / 状态管理 / 异常恢复

权限与审计层
任务级权限 / 字段级RBAC / 全链路审计

可观测与生命周期
指标 / 告警 / 版本与下线

三、Agent注册中心:能力可发现、可组合

机器人工厂的第一步,是让每个Agent和每项能力“注册在案”。

3.1 Agent注册

Agent注册时声明能力标签,而不是岗位名称。岗位会变,能力相对稳定。

from dataclasses import dataclass, field
from typing import List

@dataclass
class AgentRegistration:
    agent_id: str
    name: str
    capabilities: List[str]       # 能力标签:data_query / report_gen / doc_parse
    skill_ids: List[str]          # 可加载技能
    max_concurrency: int = 5
    version: str = "1.0"
    status: str = "active"        # active / deprecated / retired

class AgentRegistry:
    """Agent注册中心:按能力发现Agent"""
    
    def __init__(self):
        self.agents = {}
    
    def register(self, reg: AgentRegistration):
        self.agents[reg.agent_id] = reg
    
    def find_by_capability(self, capability: str) -> List[AgentRegistration]:
        return [
            a for a in self.agents.values()
            if capability in a.capabilities and a.status == "active"
        ]
    
    def retire(self, agent_id: str):
        """退役Agent:回收权限,归档日志"""
        agent = self.agents.get(agent_id)
        if agent:
            agent.status = "retired"
            # 回收所有权限、归档日志

3.2 技能注册

技能是比Agent更细的能力单元,可被多个Agent复用,避免重复建设。

@dataclass
class SkillRegistration:
    skill_id: str
    name: str
    required_permissions: List[str]
    data_scope: dict
    handler: callable

在机器人工厂中,一个“文档解析”技能注册一次,财务Agent、HR Agent、法务Agent都可以加载,不需要各自重写。

技能复用带来的注册与加载关系如下:

文档解析技能
注册一次

财务Agent

HR Agent

法务Agent

Agent注册中心

四、任务编排:DAG调度与状态持久化

数百个Agent的协同,依赖统一的任务编排层。

import asyncio
from enum import Enum
from dataclasses import dataclass, field
from typing import List, Optional

class TaskStatus(Enum):
    PENDING = "pending"
    RUNNING = "running"
    SUCCESS = "success"
    FAILED = "failed"

@dataclass
class TaskNode:
    node_id: str
    agent_id: str
    skill_id: str
    params: dict
    depends_on: List[str] = field(default_factory=list)
    status: TaskStatus = TaskStatus.PENDING

class TaskOrchestrator:
    """任务编排器:按DAG调度Agent"""
    
    def __init__(self, agent_registry, skill_registry, state_store):
        self.agents = agent_registry
        self.skills = skill_registry
        self.state = state_store
    
    async def execute(self, nodes: List[TaskNode], trace_id: str) -> dict:
        results = {}
        executed = set()
        
        while len(executed) < len(nodes):
            ready = [
                n for n in nodes
                if n.node_id not in executed
                and all(d in executed for d in n.depends_on)
            ]
            if not ready:
                break
            
            batch = await asyncio.gather(*[
                self._run_node(n, trace_id) for n in ready
            ])
            for node, result in zip(ready, batch):
                results[node.node_id] = result
                executed.add(node.node_id)
        
        return results
    
    async def _run_node(self, node: TaskNode, trace_id: str):
        self.state.save(trace_id, node.node_id, {"status": "running"})
        skill = self.skills.get(node.skill_id)
        result = await skill.handler(**node.params)
        self.state.save(trace_id, node.node_id, {
            "status": "success", "result": result
        })
        return result

状态持久化的价值:任务执行到一半中断,恢复后从最后一个成功的检查点继续,而不是从头重跑。

以“月度结账”为例,DAG 调度与断点恢复的过程如下:

失败

断点恢复

月度结账任务
trace_id

财务Agent
数据汇总

审计Agent
合规校验

报表Agent
报表生成

结果汇总

状态存储
检查点

五、权限隔离:身份独立,权限随任务收敛

数百个Agent共用一套权限体系时,最危险的设计是“Agent绑定岗位全量权限”。正确的做法是任务级权限收敛。

class TaskScopedPermission:
    """任务级权限:按任务授予,任务结束收回"""
    
    def __init__(self, permission_store):
        self.store = permission_store
    
    def grant_for_task(self, agent_id: str, task_id: str,
                       skill, user_context: dict):
        # 校验Agent是否有该技能的静态授权
        if not self.store.agent_has_skill(agent_id, skill.skill_id):
            raise PermissionError("Agent not authorized")
        
        # 按任务数据范围收窄
        scope = {
            "org_id": user_context["org_id"],
            "tables": skill.data_scope.get("tables", []),
            "row_filter": f"org_id = '{user_context['org_id']}'",
            "expires_at": now_ms() + 3600_000
        }
        return self.store.create_task_token(agent_id, task_id, scope)
    
    def revoke_after_task(self, token: str):
        self.store.revoke_token(token)

在机器人工厂的实践中,沈管家AI数字员工的权限模型采用了类似设计:每个数字员工实例拥有独立身份,字段级RBAC权限按任务范围收敛,任务结束后权限自动收回。这种“身份独立、权限随任务”的设计,是数百个Agent能够安全共存的前提。

任务级权限的授予与回收时序如下:

"Agent""权限服务""编排层""用户""Agent""权限服务""编排层""用户""提交任务""按任务申请权限""校验静态授权 + 收窄数据范围""返回任务级Token""携带Token执行""返回执行结果""任务结束,回收Token"

六、可观测性与生命周期管理

6.1 全链路审计

审计记录以trace_id串联,覆盖任务全链路:哪个Agent、调用了什么技能、访问了哪些数据、权限校验结果、耗时、状态。出了问题能追溯到具体环节。

6.2 生命周期管理

Agent的上线、升级、退役需要统一流程:

  • 上线:注册身份、绑定技能、配置权限、审核通过后激活
  • 升级:新版本注册,旧版本标记弃用,灰度切换
  • 退役:回收所有权限、归档日志、释放资源,避免“僵尸Agent”

Agent 生命周期的状态流转如下:

"审核通过"

"新版本上线"

"灰度切换完成"

"直接下线"

"回收权限 / 归档日志"

注册中

已激活

已弃用

已退役

七、工程实践要点

Agent不绑定岗位。 Agent是能力载体,注册能力标签,不注册岗位。任务需要什么能力,就调度具备该能力的Agent。

技能可复用。 通用能力注册一次,多个Agent加载,避免重复建设。

权限按任务收敛。 任务执行时授予所需权限,任务结束收回。字段级RBAC是基础。

状态持久化。 每个节点状态实时写入存储,支持断点恢复。

审计按trace_id串联。 审计记录覆盖任务全链路,而不是分散在各Agent日志里。

生命周期统一管理。 上线、升级、退役有标准流程,退役必须回收权限、归档日志。

FAQ

Q1:机器人工厂和普通的Agent编排平台有什么区别?

A:普通编排平台关注“任务怎么调度”,机器人工厂额外关注“数百个Agent怎么管”:身份注册、能力复用、任务级权限收敛、全链路审计、生命周期管理。编排是其中一层,不是全部。

Q2:数百个Agent会不会导致权限管理失控?

A:如果采用“Agent绑定岗位权限”的模式,会失控。正确做法是任务级权限收敛:Agent执行任务时获得临时权限,任务结束收回,权限范围按任务数据需求收窄。

Q3:状态持久化对机器人工厂为什么重要?

A:数百个Agent执行的任务链路长、并发高,中断概率大。没有状态持久化,中断就前功尽弃。状态存储必须与执行实例解耦,执行实例可销毁重建,状态独立保留。

Q4:中小企业需要机器人工厂吗?

A:Agent数量少于10个、任务链路简单时,可以先从“技能注册+简单编排”起步。当Agent数量增长、任务开始跨Agent时,再引入完整的注册、权限、审计和生命周期管理。

Q5:沈管家AI数字员工在机器人工厂架构中能提供什么支持?

A:沈管家支持数字员工实例的独立身份注册、技能插件按任务加载、字段级RBAC权限随任务收敛、任务引擎DAG编排和断点恢复、全链路审计日志按trace_id追溯。具体技术细节可访问官网了解。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐