# 人机协同:Plan-Execute-Replan 模式与审阅编辑 本示例演示了 **Plan-Execute-Replan** 多智能体模式与 **审阅编辑** 人机协同模式的结合。 它展示了如何构建一个规划智能体系统,用户可以在关键操作(如机票和酒店预订)执行前审阅并修改预订参数。 ## 工作原理 1. **Plan-Execute-Replan 架构**:系统由三个专业化智能体组成: - **Planner(规划器)**:根据用户需求创建初始计划 - **Executor(执行器)**:使用可用工具执行计划的每个步骤 - **Replanner(重规划器)**:根据执行结果调整计划 2. **审阅编辑工具**:`book_flight` 和 `book_hotel` 工具被 `InvokableReviewEditTool` 包装。这允许用户: - 按原样批准预订 - 修改预订参数(例如,更改日期、房间类型) - 完全拒绝预订 3. **工作流程**: - 用户请求旅行计划(例如,"规划一次东京3日游") - 规划器创建多步骤计划 - 执行器尝试预订机票 → **中断以供审阅** - 用户审阅/编辑预订详情 → 恢复 - 执行器尝试预订酒店 → **中断以供审阅** - 用户审阅/编辑 → 恢复 - 计划完成,所有预订已确认 4. **迭代执行**:Plan-Execute-Replan 模式支持多次迭代,允许重规划器根据执行结果或用户修改来调整计划。 ## 实际示例 以下是审阅编辑流程的示例: ``` ======================================== User Query: Plan a 3-day trip to Tokyo starting from New York on 2025-10-15. I need to book flights and a hotel. Also recommend some must-see attractions. ======================================== name: Planner path: [{PlanExecuteAgent} {Planner}] answer: Creating travel plan... name: Executor path: [{PlanExecuteAgent} {Executor}] tool name: book_flight arguments: {"from":"New York","to":"Tokyo","date":"2025-10-15","passengers":1,"preferred_time":"morning"} ======================================== REVIEW REQUIRED ======================================== Tool: book_flight Arguments: {"from":"New York","to":"Tokyo","date":"2025-10-15","passengers":1,"preferred_time":"morning"} ---------------------------------------- Options: - Type 'ok' to approve as-is - Type 'n' to reject - Or enter modified JSON arguments ---------------------------------------- Your choice: ok ======================================== Resuming execution... ======================================== name: Executor path: [{PlanExecuteAgent} {Executor}] tool response: {"booking_id":"FL-2025-10-15-12345","airline":"Japan Airlines",...} name: Executor path: [{PlanExecuteAgent} {Executor}] tool name: book_hotel arguments: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"standard"} ======================================== REVIEW REQUIRED ======================================== Tool: book_hotel Arguments: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"standard"} ---------------------------------------- Your choice: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"deluxe"} ======================================== Resuming execution... ======================================== name: Executor path: [{PlanExecuteAgent} {Executor}] tool response: {"booking_id":"HT-2025-10-15-67890","hotel_name":"Tokyo Grand Hyatt","room_type":"deluxe",...} ``` 此跟踪记录展示了: - **规划阶段**:规划器创建结构化的旅行计划 - **机票预订审阅**:用户按原样批准机票预订 - **酒店预订编辑**:用户将房间类型从 "standard" 修改为 "deluxe" - **灵活输入**:用户可以批准、拒绝或提供修改后的 JSON ## 如何配置环境变量 在运行示例之前,您需要设置 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/6_plan-execute-replan ``` 您将看到规划器创建旅行计划,当尝试进行预订时,系统会提示您审阅并可选择编辑预订参数。 ## 工作流程图 ```mermaid graph TD A[用户请求] --> B[规划器智能体]; B --> C[创建计划]; C --> D[执行器智能体]; D --> E{book_flight 工具}; E --> F[中断:需要审阅]; F --> G{用户审阅}; G -- "ok" --> H[恢复:原始参数]; G -- "编辑" --> I[恢复:修改后的参数]; G -- "n" --> J[恢复:已拒绝]; H --> K[机票已预订]; I --> K; J --> L[重规划器调整]; K --> M{book_hotel 工具}; M --> N[中断:需要审阅]; N --> O{用户审阅}; O -- "ok/编辑/n" --> P[处理响应]; P --> Q[酒店已预订或重新规划]; Q --> R[最终响应]; L --> D; ```