规划设计
介绍
本课内容包括:
- 明确整体目标,将复杂任务拆解为可管理的小任务。
- 利用结构化输出,提升响应的可靠性和机器可读性。
- 采用事件驱动方法,处理动态任务和意外输入。
学习目标
完成本课后,您将掌握:
- 如何为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项目,详情见官方博客。
总结
本文展示了如何创建一个规划代理,动态选择并分配可用代理执行任务。规划输出将任务拆解并分配给相应代理,假设代理拥有执行任务所需的功能和工具。除了代理,还可结合反思、总结和轮询聊天等模式,进一步定制系统。



