规划设计模式

 

规划设计

介绍

本课内容包括:

  • 明确整体目标,将复杂任务拆解为可管理的小任务。
  • 利用结构化输出,提升响应的可靠性和机器可读性。
  • 采用事件驱动方法,处理动态任务和意外输入。

学习目标

完成本课后,您将掌握:

  • 如何为AI代理设定清晰的整体目标,确保其明确任务方向。
  • 将复杂任务拆分为有序的子任务,便于逐步执行。
  • 配备合适工具(如搜索工具、数据分析工具),合理安排使用时机,并应对突发情况。
  • 评估子任务结果,衡量性能,并通过迭代优化最终输出。

明确整体目标与任务拆解

明确目标与任务拆解

现实中的任务往往复杂,难以一步完成。AI代理需要一个简明的目标来指导规划和行动。例如,目标是“生成一个三天的旅行行程”。

虽然目标简单,但仍需细化。目标越明确,代理及协作人员越能专注于实现正确的结果,比如包含航班、酒店和活动建议的完整行程。

任务拆解

将大型或复杂任务拆分为更小的、目标明确的子任务,更易管理。

以旅行行程为例,可拆解为:

  • 机票预订
  • 酒店预订
  • 租车服务
  • 个性化定制

每个子任务可由专门的代理或流程处理。比如一个代理专注于寻找机票优惠,另一个负责酒店预订。最终由协调代理整合结果,形成完整行程。

这种模块化方法便于逐步改进,例如增加美食推荐或本地活动建议的专门代理,持续优化行程。

结构化输出

大型语言模型(LLM)能生成结构化输出(如JSON),方便后续代理或服务解析处理,尤其适合多代理场景。

以下Python示例展示了一个规划代理如何拆解目标并生成结构化计划:

from pydantic import BaseModel
from enum import Enum
from typing import List
import json
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

class AgentEnum(str, Enum):
    FlightBooking = "flight_booking"
    HotelBooking = "hotel_booking"
    CarRental = "car_rental"
    ActivitiesBooking = "activities_booking"
    DestinationInfo = "destination_info"
    DefaultAgent = "default_agent"
    GroupChatManager = "group_chat_manager"

class TravelSubTask(BaseModel):
    task_details: str
    assigned_agent: AgentEnum

class TravelPlan(BaseModel):
    main_task: str
    subtasks: List[TravelSubTask]
    is_greeting: bool

provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

system_prompt = """你是规划代理。
你的任务是根据用户请求决定调用哪些代理。
请以JSON格式返回,结构如下:
{'main_task': '规划一场从新加坡到墨尔本的家庭旅行',
 'subtasks': [{'assigned_agent': 'flight_booking',
               'task_details': '预订新加坡到墨尔本的往返机票'}]
以下是可用的专门代理:
- FlightBooking:负责机票预订和信息
- HotelBooking:负责酒店预订和信息
- CarRental:负责租车服务
- ActivitiesBooking:负责活动预订
- DestinationInfo:提供目的地信息
- DefaultAgent:处理一般请求"""

user_message = "为有两个孩子的家庭制定从新加坡到墨尔本的旅行计划"

response = client.create_response(input=user_message, instructions=system_prompt)

print(json.loads(response.output_text))

多代理编排的规划代理

在此示例中,语义路由代理接收用户请求(如“我需要旅行的酒店计划”)。

规划代理的工作流程:

  • 接收酒店计划请求,根据系统提示和可用代理信息生成结构化旅行计划。
  • 代理注册表列出各代理及其功能。
  • 根据子任务数量,将消息直接发送给单一代理,或通过群聊管理器协调多代理协作。
  • 汇总并总结最终计划。

以下Python代码演示上述步骤:

from pydantic import BaseModel
from enum import Enum
from typing import List
import json
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

class AgentEnum(str, Enum):
    FlightBooking = "flight_booking"
    HotelBooking = "hotel_booking"
    CarRental = "car_rental"
    ActivitiesBooking = "activities_booking"
    DestinationInfo = "destination_info"
    DefaultAgent = "default_agent"
    GroupChatManager = "group_chat_manager"

class TravelSubTask(BaseModel):
    task_details: str
    assigned_agent: AgentEnum

class TravelPlan(BaseModel):
    main_task: str
    subtasks: List[TravelSubTask]
    is_greeting: bool

provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

system_prompt = """你是规划代理。
你的任务是根据用户请求决定调用哪些代理。
以下是可用的专门代理:
- FlightBooking:负责机票预订和信息
- HotelBooking:负责酒店预订和信息
- CarRental:负责租车服务
- ActivitiesBooking:负责活动预订
- DestinationInfo:提供目的地信息
- DefaultAgent:处理一般请求"""

user_message = "为有两个孩子的家庭制定从新加坡到墨尔本的旅行计划"

response = client.create_response(input=user_message, instructions=system_prompt)

print(json.loads(response.output_text))

示例输出:

{
  "is_greeting": "False",
  "main_task": "规划一场从新加坡到墨尔本的家庭旅行。",
  "subtasks": [
    {"assigned_agent": "flight_booking", "task_details": "预订新加坡到墨尔本的往返机票。"},
    {"assigned_agent": "hotel_booking", "task_details": "寻找适合家庭的墨尔本酒店。"},
    {"assigned_agent": "car_rental", "task_details": "安排适合四口之家的租车服务。"},
    {"assigned_agent": "activities_booking", "task_details": "列出适合家庭的墨尔本活动。"},
    {"assigned_agent": "destination_info", "task_details": "提供墨尔本旅游信息。"}
  ]
}

示例笔记本可在此处查看。

迭代规划

某些任务需要反复调整,子任务结果会影响后续步骤。例如,预订机票时遇到意外数据格式,代理需调整策略再继续酒店预订。

用户反馈(如偏好更早航班)也可能触发部分重新规划。动态迭代确保最终方案符合实际限制和用户需求。

示例代码:

from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

system_prompt = """你是规划代理,负责优化任务。
你的任务是根据用户请求决定调用哪些代理。
以下是可用的专门代理:
- FlightBooking:负责机票预订和信息
- HotelBooking:负责酒店预订和信息
- CarRental:负责租车服务
- ActivitiesBooking:负责活动预订
- DestinationInfo:提供目的地信息
- DefaultAgent:处理一般请求"""

user_message = "为有两个孩子的家庭制定从新加坡到墨尔本的旅行计划"

response = client.create_response(
    input=user_message,
    instructions=system_prompt,
    context=f"之前的旅行计划 - {TravelPlan}",
)
# 重新规划并分配任务给相应代理

更多复杂规划可参考Magnetic One项目,详情见官方博客

总结

本文展示了如何创建一个规划代理,动态选择并分配可用代理执行任务。规划输出将任务拆解并分配给相应代理,假设代理拥有执行任务所需的功能和工具。除了代理,还可结合反思、总结和轮询聊天等模式,进一步定制系统。