Skip to content

05.3 — 角色分配与编排

定位: 多 Agent 系统的"组织设计"——理解如何为 Agent 设计角色、分配任务、编排工作流 面试高频度: ⭐⭐⭐ 考查方式: 设计题(设计多 Agent 角色体系)、策略题(动态 vs 静态角色分配)


一、这是什么?为什么需要它?

是什么

角色分配 是为每个 Agent 定义职责、权限和行为的规范。任务编排 是将多个 Agent 的工作组织成有序工作流的过程。

为什么需要角色和编排?

❌ 没有角色的多 Agent:
  所有 Agent 能力相同
  不知道谁该做什么
  重复工作和互相推诿并存
  缺乏责任感

✅ 有角色的多 Agent:
  每个 Agent 有明确的职责边界
  知道自己的任务和依赖
  专业化带来更高质量
  可追溯(谁做的什么)

核心洞察:角色设计就是多 Agent 系统的"组织架构设计"——好的角色设计让协作自然发生。


二、原理拆解

2.1 经典角色模式

角色职责prompt 关键词典型行为
管理者 (Manager)分解任务、分配、汇总规划、分配、监督"你负责 X,完成后报告"
执行者 (Worker)执行具体任务执行、完成、实现专注完成分配的任务
审查者 (Reviewer)检查质量、反馈审查、验证、确认"第3行有问题,建议改为..."
协调者 (Coordinator)解决冲突、同步进度协调、沟通、仲裁"A 和 B 的方案可以结合..."
专家 (Specialist)领域深度知识专业、深入分析提供某个领域的深入见解

2.2 角色系统设计

python
class AgentRole:
    """Agent 角色定义"""
    
    def __init__(self, name: str, description: str,
                 responsibilities: list, permissions: list):
        self.name = name
        self.description = description
        self.responsibilities = responsibilities
        self.permissions = permissions
    
    def build_system_prompt(self) -> str:
        """根据角色生成 system prompt"""
        return f"""你是{self.name}
{self.description}

你的职责:
{chr(10).join(f'- {r}' for r in self.responsibilities)}

你有以下权限:
{chr(10).join(f'- {p}' for p in self.permissions)}

请在你的职责范围内工作,不要越界。"""

# 定义常用角色
ROLES = {
    "researcher": AgentRole(
        "研究员",
        "负责信息收集和数据分析",
        ["搜索和分析信息", "整理数据报告", "验证事实"],
        ["使用搜索工具", "访问知识库"]
    ),
    "writer": AgentRole(
        "写手",
        "负责内容创作和文档编写",
        ["撰写文档", "优化表达", "保证可读性"],
        ["编辑文件", "使用格式化工具"]
    ),
    "reviewer": AgentRole(
        "审查员",
        "负责质量审核和反馈",
        ["检查错误", "给出改进建议", "验证合规性"],
        ["阅读所有文件", "标注问题"]
    ),
    "coordinator": AgentRole(
        "协调员",
        "负责团队协作和进度管理",
        ["分配任务", "跟踪进度", "解决冲突"],
        ["查看所有角色状态", "重新分配任务"]
    )
}

2.3 角色分配策略

策略做法优点缺点
固定角色每个 Agent 角色固定简单、可预测不够灵活
动态角色根据任务动态分配角色灵活、资源利用好需要角色切换机制
混合角色基础角色固定 + 临时角色兼顾稳定性和灵活性实现复杂
python
class DynamicRoleManager:
    """动态角色管理器"""
    
    def __init__(self, agents: list):
        self.agents = agents  # 所有可用 Agent
        self.role_assignments = {}  # agent -> current role
    
    def assign_role(self, agent, role: str, task: str):
        """为 Agent 分配角色"""
        self.role_assignments[agent.name] = role
        prompt = f"""你现在的角色是:{ROLES[role].name}
{ROLES[role].description}

当前任务:{task}
请在当前角色的职责范围内工作。"""
        
        agent.set_system_prompt(prompt)
    
    def switch_role(self, agent, new_role: str):
        """切换 Agent 角色"""
        old_role = self.role_assignments.get(agent.name)
        print(f"{agent.name}: {old_role}{new_role}")
        self.assign_role(agent, new_role, "")
    
    def determine_role(self, task: str) -> str:
        """根据任务决定需要的角色"""
        return llm.call(f"任务:{task}\n可选角色:{list(ROLES.keys())}\n最需要哪个角色?")

2.4 任务编排模式

串行编排:
  Agent A → Agent B → Agent C
  适合:流水线式任务(收集 → 分析 → 报告)

并行编排:
  Agent A ──→ 结果合并
  Agent B ──→ 结果合并
  Agent C ──→ 结果合并
  适合:独立子任务(同时搜索多个数据源)

混合编排:
  ┌──→ Agent B ──→ ┐
  A ──→ Agent C ──→ D
  └──→ Agent E ──→ ┘
  适合:复杂任务(多个分析 → 综合汇总)
python
class TaskOrchestrator:
    """任务编排器"""
    
    def orchestrate(self, workflow: list, agents: dict):
        """执行工作流"""
        results = {}
        
        for step in workflow:
            task = step["task"]
            assignee = step["assignee"]
            depends_on = step.get("depends_on", [])
            
            # 检查依赖是否满足
            for dep in depends_on:
                if dep not in results:
                    raise ValueError(f"依赖 {dep} 未完成")
            
            # 执行任务
            context = {dep: results[dep] for dep in depends_on}
            agent = agents[assignee]
            result = agent.run(task, context)
            results[task["name"]] = result
        
        return results

# 示例工作流
workflow = [
    {"task": {"name": "收集数据", "desc": "搜索市场数据"}, 
     "assignee": "研究员"},
    {"task": {"name": "分析数据", "desc": "分析趋势"}, 
     "assignee": "分析师", "depends_on": ["收集数据"]},
    {"task": {"name": "生成报告", "desc": "写报告"}, 
     "assignee": "写手", "depends_on": ["分析数据"]},
]

orchestrator = TaskOrchestrator()
results = orchestrator.orchestrate(workflow, agents)

三、图解全景

┌──────────────────────────────────────────────────────────┐
│          多 Agent 角色与编排全景                          │
│                                                          │
│  角色定义层                                              │
│  ┌──────────────────────────────────────┐               │
│  │  Researcher  │  Writer  │  Reviewer  │               │
│  │  Coordinator │  Specialist           │               │
│  └──────────────────┬───────────────────┘               │
│                     │                                    │
│  编排层              │                                    │
│  ┌──────────────────▼───────────────────┐               │
│  │                                       │               │
│  │  并行区         串行区     条件分支    │               │
│  │  ┌──┐          ┌──→ ┌──→ ┌──┐       │               │
│  │  │  │          │    │    │  │       │               │
│  │  │  │──→ 合并 ─→    ─→   ─→  │       │               │
│  │  │  │          │         │  │       │               │
│  │  └──┘          └─────────┘──┘       │               │
│  └──────────────────┬───────────────────┘               │
│                     │                                    │
│  执行层              │                                    │
│  ┌──────────────────▼───────────────────┐               │
│  │  Agent A (研究员)                     │               │
│  │  Agent B (分析员)                     │               │
│  │  Agent C (写手)                       │               │
│  │  Agent D (审查员)                     │               │
│  └──────────────────────────────────────┘               │
└──────────────────────────────────────────────────────────┘

四、实战验证

python
# 角色化多 Agent:内容生产流水线

# 定义 Agent
agents = {
    "researcher": Agent(ROLES["researcher"]),
    "writer": Agent(ROLES["writer"]),
    "reviewer": Agent(ROLES["reviewer"]),
    "coordinator": Agent(ROLES["coordinator"])
}

# 任务:生产一篇技术文章
pipeline = """
1. [研究员] 收集 AI Agent 最新趋势信息
2. [写手] 基于收集的信息撰写文章
3. [审查员] 审查文章质量
4. [协调员] 如果需要修改,协调修改流程
"""

# 执行
orchestrator = TaskOrchestrator()
results = orchestrator.orchestrate([
    {"task": "收集 AI Agent 最新趋势", "assignee": "researcher"},
    {"task": "基于收集的信息写文章", "assignee": "writer", "depends_on": ["researcher"]},
    {"task": "审查文章", "assignee": "reviewer", "depends_on": ["writer"]},
], agents)

print("生产完成!")

五、面试视角

追问答案要点
角色设计的原则?单一职责(每个 Agent 聚焦一个领域)、职责不重叠(不要两个 Agent 做同样的事)、权限最小化(只给需要的权限)、角色可替换(任何 Agent 都能承担某个角色)
固定角色 vs 动态角色的选择?固定角色适合流程稳定的场景(简单、可预测),动态角色适合任务多样的场景(灵活、资源高效)。生产环境常用混合模式
任务编排中如何处理 Agent 故障?超时检测(Agent 超时无响应则重试)、角色冗余(关键角色有备选 Agent)、任务重分配(将失败任务重新分配)、降级模式(退化为串行执行)
角色和工具的关系?角色决定了 Agent "可以做什么",工具决定了 Agent "能做什么"。角色是权限层(应该做什么),工具是能力层(能够做什么)

📚 相关链接

  • **多智能体架构** — 角色运行的架构环境
  • **通信与协调** — 角色间的通信
  • **CrewAI** — CrewAI 的角色系统
  • **工具注册** — 角色的工具权限
  • ← 返回 **多智能体系统索引**

Knowledge4J — Java 知识库