简介
本文将涵盖以下内容:
- 定义清晰的总体目标,并将复杂的任务分解为可管理的子任务。
- 利用结构化输出获得更可靠且机器可读的响应。
- 应用事件驱动的方法来处理动态任务和意外输入。
学习目标
在完成本文后,你将对以下内容有所了解:
- 为 AI Agent 识别并设定总体目标,确保其清楚地知道需要实现什么。
- 将复杂的任务分解为可管理的子任务,并将它们组织成一个逻辑序列。
- 为 Agent 配备正确的工具 (例如,搜索工具或数据分析工具),决定何时以及如何使用它们,并处理出现的意外情况。
- 评估子任务结果,衡量性能,并迭代操作以改进最终输出。
定义总体目标和分解任务
大多数现实世界的任务都过于复杂,无法一步完成。AI Agent 需要一个简洁的目标来指导其规划和行动。例如,考虑以下目标:
“生成一个 3 天的旅行行程。”
虽然陈述很简单,但仍需改进。目标越清晰,Agent (以及任何人类协作者) 就能更好地专注于实现正确的结果,例如创建一个包含航班选项、酒店推荐和活动建议的全面行程。
任务分解
当大型或复杂的任务被分解为更小的、面向目标的子任务时,它们会变得更易于管理。对于旅行行程示例,可以将目标分解为:
- 航班预订
- 酒店预订
- 租车
- 个性化
然后,每个子任务都可以由专门的 Agent 或流程来处理。一个 Agent 可能专门搜索最佳航班优惠,另一个专注于酒店预订,依此类推。然后,协调 Agent 或“下游” Agent 可以将这些结果编译成一个有凝聚力的行程,呈现给最终用户。
这种模块化方法也允许增量增强。例如,可以添加专门的 Agent 来提供餐饮推荐或当地活动建议,并随着时间的推移不断完善行程。
结构化输出
大语言模型 (LLMs) 可以生成结构化输出 (例如 JSON),这使得下游 Agent 或服务更容易解析和处理。这在多 Agent 环境中特别有用,我们可以在收到规划输出后执行这些任务。请参阅此博客文章以获取快速概述。
以下 Python 代码片段演示了一个简单的规划 Agent,它将目标分解为子任务并生成结构化计划:
具有多 Agent 编排的规划 Agent
在此示例中,语义路由 Agent 接收用户请求 (例如,“我需要一个旅行的酒店计划。”)。
然后,规划器:
- 接收酒店计划:规划器接收用户的消息,并根据系统提示 (包括可用的 Agent 详细信息),生成结构化的旅行计划。
- 列出 Agent 及其工具:Agent 注册表包含一个 Agent 列表 (例如,用于航班、酒店、租车和活动) 以及它们提供的功能或工具。
- 将计划路由到相应的 Agent:根据子任务的数量,规划器要么将消息直接发送到专用 Agent (对于单任务场景),要么通过群聊管理器进行协调以进行多 Agent 协作。
- 总结结果:最后,规划器总结生成的计划以使其清晰。以下 Python 代码示例说明了这些步骤:
from pydantic import BaseModel
from enum import Enum
from typing import List, Optional, Union
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"
# Travel SubTask Model
class TravelSubTask(BaseModel):
task_details: str
assigned_agent: AgentEnum # we want to assign the task to the agent
class TravelPlan(BaseModel):
main_task: str
subtasks: List[TravelSubTask]
is_greeting: bool
import json
import os
from typing import Optional
from autogen_core.models import UserMessage, SystemMessage, AssistantMessage
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
# Create the client with type-checked environment variables
client = AzureOpenAIChatCompletionClient(
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
model=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)
from pprint import pprint
# Define the user message
messages = [
SystemMessage(content="""你是一个规划 Agent。
你的工作是根据用户的请求决定运行哪些 Agent。
以下是专门负责不同任务的可用 Agent:
- FlightBooking: 用于预订航班和提供航班信息
- HotelBooking: 用于预订酒店和提供酒店信息
- CarRental: 用于预订汽车和提供汽车租赁信息
- ActivitiesBooking: 用于预订活动和提供活动信息
- DestinationInfo: 用于提供有关目的地的信息
- DefaultAgent: 用于处理一般请求""", source="system"),
UserMessage(content="为一个有两个孩子的家庭创建一个从新加坡到墨尔本的旅行计划", source="user"),
]
response = await client.create(messages=messages, extra_create_args={"response_format": TravelPlan})
# Ensure the response content is a valid JSON string before loading it
response_content: Optional[str] = response.content if isinstance(response.content, str) else None
if response_content is None:
raise ValueError("Response content is not a valid JSON string")
# Print the response content after loading it as JSON
pprint(json.loads(response_content))
以下是前面代码的输出,然后可以使用此结构化输出路由到 assigned_agent
并将旅行计划总结给最终用户。
{
"is_greeting": "False",
"main_task": "Plan a family trip from Singapore to Melbourne.",
"subtasks": [
{
"assigned_agent": "flight_booking",
"task_details": "Book round-trip flights from Singapore to Melbourne."
},
{
"assigned_agent": "hotel_booking",
"task_details": "Find family-friendly hotels in Melbourne."
},
{
"assigned_agent": "car_rental",
"task_details": "Arrange a car rental suitable for a family of four in Melbourne."
},
{
"assigned_agent": "activities_booking",
"task_details": "List family-friendly activities in Melbourne."
},
{
"assigned_agent": "destination_info",
"task_details": "Provide information about Melbourne as a travel destination."
}
]
}
包含前面代码示例的示例笔记本可在此处找到。
迭代规划
有些任务需要反复或重新规划,其中一个子任务的结果会影响下一个子任务。例如,如果 Agent 在预订航班时发现意外的数据格式,它可能需要在继续预订酒店之前调整其策略。
此外,用户反馈 (例如,用户决定他们更喜欢早一点的航班) 可以触发部分重新计划。这种动态的、迭代的方法确保最终解决方案与现实世界的约束和不断变化的用户偏好保持一致。
例如,示例代码
```python
from autogen_core.models import UserMessage, SystemMessage, AssistantMessage
#.. same as previous code and pass on the user history, current plan
messages = [
SystemMessage(content="""你是一个规划 Agent,负责优化旅行计划。
你的工作是根据用户的请求决定运行哪些 Agent。
以下是专门负责不同任务的可用 Agent:
- FlightBooking: 用于预订航班和提供航班信息
- HotelBooking: 用于预订酒店和提供酒店信息
- CarRental: 用于预订汽车和提供汽车租赁信息
- ActivitiesBooking: 用于预订活动和提供活动信息
- DestinationInfo: 用于提供有关目的地的信息
- DefaultAgent: 用于处理一般请求""", source="system"),
UserMessage(content="为一个有两个孩子的家庭创建一个从新加坡到墨尔本的旅行计划", source="user"),
AssistantMessage(content=f"先前的旅行计划 - {TravelPlan}", source="assistant")
]
# .. re-plan and send the tasks to respective agents
要获得更全面的规划,请查看 Magnetic One [博客文章](https://www.microsoft.com/research/articles/magentic-one-a-generalist-multi-agent-system-for-solving-complex-tasks),了解如何解决复杂任务。
## 总结
[](https://github.com/microsoft/ai-agents-for-beginners/blob/main/07-planning-design/README.md#summary)
在本文中,我们研究了一个示例,说明了如何创建一个规划器,该规划器可以动态选择定义的可用 Agent。规划器的输出分解任务并分配 Agent,以便执行它们。假设 Agent 可以访问执行任务所需的功能/工具。除了 Agent 之外,你还可以包括其他模式,如反思、摘要器和循环聊天以进行进一步定制。
## 其他资源
[](https://github.com/microsoft/ai-agents-for-beginners/blob/main/07-planning-design/README.md#additional-resources)
* AutoGen Magentic One - 一个通用的多 Agent 系统,用于解决复杂的任务,并在多个具有挑战性的 Agent 基准测试中取得了令人印象深刻的结果。参考:[autogen-magentic-one](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-magentic-one)。在此实现中,编排器创建特定于任务的计划并将这些任务委派给可用的 Agent。除了规划之外,编排器还采用跟踪机制来监控任务的进度并根据需要重新规划。