# 人机协同:Supervisor 与 Plan-Execute-Replan 子智能体 本示例演示了一个**嵌套多智能体架构**,将 **Supervisor** 模式与 **Plan-Execute-Replan** 作为子智能体相结合,并配合 **审批** 人机协同模式。 它展示了如何构建一个层级化系统,其中项目经理主管协调专业化智能体,包括一个需要用户批准敏感操作(如预算分配)的复杂规划智能体。 ## 工作原理 1. **嵌套架构**:项目经理主管管理两个智能体: - **research_agent**:用于快速研究任务的简单 ChatModel 智能体 - **project_execution_agent**:用于复杂多步骤项目任务的 Plan-Execute-Replan 智能体 2. **Plan-Execute-Replan 子智能体**:`project_execution_agent` 本身是一个多智能体系统: - **规划(Plans)**:为项目创建分步计划 - **执行(Executes)**:使用专业化工具执行每个步骤 - **重规划(Replans)**:根据执行结果调整计划 3. **执行器中的可审批工具**:`project_execution_agent` 内的执行器有一个被 `InvokableApprovableTool` 包装的 `allocate_budget` 工具。当需要预算分配时,会在嵌套智能体层级的深处触发中断。 4. **工作流程**: - 用户请求复杂的项目设置 - 主管委托给 `project_execution_agent` - 规划器创建多步骤计划 - 执行器执行步骤(分析需求、创建设计等) - 当调用 `allocate_budget` 时 → **中断以获取批准** - 用户批准或拒绝 → 恢复 - 完成剩余步骤(团队分配) - 主管汇总结果 ## 架构图 ``` ┌─────────────────────────────────────────────────────────────┐ │ 项目经理主管 (Supervisor) │ │ │ │ ┌──────────────────┐ ┌────────────────────────────────┐│ │ │ research_agent │ │ project_execution_agent ││ │ │ (研究智能体) │ │ (Plan-Execute-Replan) ││ │ │ │ │ ││ │ │ - search_info │ │ ┌─────────┐ ┌──────────┐ ││ │ │ │ │ │ 规划器 │→ │ 执行器 │ ││ │ │ │ │ └─────────┘ └────┬─────┘ ││ │ │ │ │ │ ││ │ │ │ │ ┌────────────┴────────┐ ││ │ │ │ │ │ 工具: │ ││ │ │ │ │ │ - analyze_requirements│ ││ │ │ │ │ │ - create_design │ ││ │ │ │ │ │ - allocate_budget ⚠️│ ││ │ │ │ │ │ - assign_team │ ││ │ │ │ │ └─────────────────────┘ ││ │ │ │ │ ││ │ │ │ │ ┌───────────┐ ││ │ │ │ │ │ 重规划器 │ ││ │ │ │ │ └───────────┘ ││ │ └──────────────────┘ └────────────────────────────────┘│ └─────────────────────────────────────────────────────────────┘ ⚠️ = 需要用户批准 ``` ## 实际示例 以下是嵌套中断流程的示例: ``` ======================================== User Query: Set up a new project called "Customer Portal" for the engineering department. This should include analyzing requirements, creating a design, allocating a budget of $150,000 from engineering, and assigning a team of Alice, Bob, and Charlie starting from 2025-02-01. ======================================== name: project_manager path: [{project_manager}] action: transfer to project_execution_agent name: Planner path: [{project_manager} {project_execution_agent} {Planner}] answer: Creating plan with steps: 1. Analyze requirements for Customer Portal 2. Create technical design 3. Allocate budget of $150,000 from engineering 4. Assign team members name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool name: analyze_requirements arguments: {"project_description":"Customer Portal for engineering department"} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool response: {"requirements":[...],"complexity":"Medium","estimated_hours":240} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool name: create_design arguments: {"project_name":"Customer Portal","requirements":[...]} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool response: {"design_id":"DESIGN-1234","architecture":"Microservices",...} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool name: allocate_budget arguments: {"project_name":"Customer Portal","amount":150000,"department":"engineering"} ======================================== APPROVAL REQUIRED ======================================== tool 'allocate_budget' interrupted with arguments '{"project_name":"Customer Portal","amount":150000,"department":"engineering"}' Approve this budget allocation? (Y/N): Y ======================================== Resuming execution... ======================================== name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool response: {"allocation_id":"BUDGET-eng-5678","amount":150000,"status":"approved"} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool name: assign_team arguments: {"project_name":"Customer Portal","team_members":["Alice","Bob","Charlie"],"start_date":"2025-02-01"} name: Executor path: [{project_manager} {project_execution_agent} {Executor}] tool response: {"assignment_id":"TEAM-9012","status":"confirmed"} name: project_manager path: [{project_manager}] answer: Project "Customer Portal" has been successfully set up... ``` 此跟踪记录展示了: - **层级委托**:主管 → Plan-Execute-Replan 智能体 - **深度嵌套**:中断发生在智能体层级的第3层深处(主管 → PlanExecute → 执行器 → 工具) - **计划执行**:多个步骤按顺序执行 - **预算批准**:敏感操作触发中断 - **无缝恢复**:批准后,执行从中断处继续 ## 如何配置环境变量 在运行示例之前,您需要设置 LLM API 所需的环境变量。您有两个选项: ### 选项 1: OpenAI 兼容配置 ```bash export OPENAI_API_KEY="{your api key}" export OPENAI_BASE_URL="{your model base url}" # 仅在使用 Azure 类 LLM 提供商时配置此项 export OPENAI_BY_AZURE=true # 'gpt-4o' 只是一个示例,请配置您的 LLM 提供商提供的实际模型名称 export OPENAI_MODEL="gpt-4o-2024-05-13" ``` ### 选项 2: ARK 配置 ```bash export MODEL_TYPE="ark" export ARK_API_KEY="{your ark api key}" export ARK_MODEL="{your ark model name}" ``` 或者,您可以在项目根目录创建一个 `.env` 文件来设置这些变量。 ## 如何运行 确保您已设置好环境变量(例如,LLM API 密钥)。然后,在 `eino-examples` 仓库的根目录下运行以下命令: ```sh go run ./adk/human-in-the-loop/8_supervisor-plan-execute ``` 您将看到项目经理协调项目设置,当尝试进行预算分配时,系统会提示您批准或拒绝该财务操作。 ## 工作流程图 ```mermaid graph TD A[用户请求] --> B{项目经理主管}; B --> C[委托给 project_execution_agent]; C --> D[规划器:创建计划]; D --> E[执行器:步骤1 - 分析需求]; E --> F[执行器:步骤2 - 创建设计]; F --> G{执行器:步骤3 - allocate_budget}; G --> H[中断:需要批准]; H --> I{用户输入}; I -- "Y (批准)" --> J[恢复:已批准]; J --> K[预算已分配]; K --> L[执行器:步骤4 - 分配团队]; L --> M[团队已分配]; M --> N[返回主管]; N --> O[最终汇总]; I -- "N (拒绝)" --> P[恢复:已拒绝]; P --> Q[重规划器调整]; Q --> E; ``` ## 演示的关键概念 | 概念 | 描述 | |------|------| | **嵌套多智能体** | 主管包含 Plan-Execute-Replan 作为子智能体 | | **深度中断** | 中断在智能体层级的第3层深处触发 | | **状态保持** | 检查点存储在所有嵌套智能体中维护状态 | | **无缝恢复** | 执行从中断的确切位置继续 | | **Plan-Execute-Replan** | 复杂任务分解为步骤,具有重规划能力 |