(Нажмите на изображение выше, чтобы посмотреть видео этого урока)
В этом уроке будет рассмотрено
После завершения этого урока вы будете понимать:

Большинство реальных задач слишком сложны, чтобы решать их за один шаг. Для ИИ-агента нужна чёткая цель, которая направляет его планирование и действия. Например, рассмотрим цель:
"Создать маршрут путешествия на 3 дня."
Хотя это просто заявление, его всё же нужно уточнить. Чем яснее цель, тем лучше агент (и любые участвующие люди) смогут сосредоточиться на достижении правильного результата, например создание комплексного маршрута с вариантами перелётов, рекомендациями отелей и предложениями активностей.
Большие или сложные задачи становятся более управляемыми, когда их разбивают на меньшие, ориентированные на цель подзадачи. Для примера маршрута путешествия можно разложить цель на:
Затем каждая подзадача может обрабатываться выделенными агентами или процессами. Один агент может специализироваться на поиске лучших авиарейсов, другой — на бронировании отелей и т.д. Координирующий или «следующий» агент может затем собрать эти результаты в единый связный маршрут для конечного пользователя.
Такой модульный подход также позволяет поэтапно улучшать систему. Например, можно добавить специализированных агентов для рекомендаций по еде или местным развлечениям и со временем улучшать маршрут.
Большие языковые модели (LLM) могут генерировать структурированный вывод (например, JSON), который легче парсить и обрабатывать следующим агентам или сервисам. Это особенно полезно в контексте мультиагентной системы, где можно выполнять задачи после получения плана.
Следующий фрагмент Python демонстрирует простого агента планирования, который разлагает цель на подзадачи и генерирует структурированный план:
from pydantic import BaseModel
from enum import Enum
from typing import List, Optional, Union
import json
import os
from typing import Optional
from pprint import pprint
from agent_framework.foundry import FoundryChatClient
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 = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
# Определить сообщение пользователя
system_prompt = """You are a planner agent.
Your job is to decide which agents to run based on the user's request.
Provide your response in JSON format with the following structure:
{'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.'}
Below are the available agents specialised in different tasks:
- FlightBooking: For booking flights and providing flight information
- HotelBooking: For booking hotels and providing hotel information
- CarRental: For booking cars and providing car rental information
- ActivitiesBooking: For booking activities and providing activity information
- DestinationInfo: For providing information about destinations
- DefaultAgent: For handling general requests"""
user_message = "Create a travel plan for a family of 2 kids from Singapore to Melbourne"
response = client.create_response(input=user_message, instructions=system_prompt)
response_content = response.output_text
pprint(json.loads(response_content))
В этом примере Semantiс Router Agent получает запрос от пользователя (например, «Мне нужен план отеля для моей поездки.»).
Планировщик затем:
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"
# Модель подзадачи путешествия
class TravelSubTask(BaseModel):
task_details: str
assigned_agent: AgentEnum # мы хотим назначить задачу агенту
class TravelPlan(BaseModel):
main_task: str
subtasks: List[TravelSubTask]
is_greeting: bool
import json
import os
from typing import Optional
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
# Создать клиента
provider = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
from pprint import pprint
# Определить сообщение пользователя
system_prompt = """You are a planner agent.
Your job is to decide which agents to run based on the user's request.
Below are the available agents specialized in different tasks:
- FlightBooking: For booking flights and providing flight information
- HotelBooking: For booking hotels and providing hotel information
- CarRental: For booking cars and providing car rental information
- ActivitiesBooking: For booking activities and providing activity information
- DestinationInfo: For providing information about destinations
- DefaultAgent: For handling general requests"""
user_message = "Create a travel plan for a family of 2 kids from Singapore to Melbourne"
response = client.create_response(input=user_message, instructions=system_prompt)
response_content = response.output_text
# Вывести содержимое ответа после загрузки его как 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."
}
]
}
Пример ноутбука с предыдущим кодом доступен здесь.
Некоторые задачи требуют взаимодействия или перепланирования, когда результат одной подзадачи влияет на следующую. Например, если агент обнаруживает неожиданный формат данных при бронировании авиабилетов, ему может понадобиться адаптировать стратегию перед тем, как продолжить с бронированием отеля.
Кроме того, обратная связь пользователя (например, если человек решает, что предпочитает более ранний рейс) может вызвать частичное перепланирование. Такой динамичный итеративный подход гарантирует, что итоговое решение соответствует реальным ограничениям и изменяющимся предпочтениям пользователя.
например, исходный код
import os
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
#.. то же, что и в предыдущем коде, и передать историю пользователя, текущий план
system_prompt = """You are a planner agent to optimize the
Your job is to decide which agents to run based on the user's request.
Below are the available agents specialized in different tasks:
- FlightBooking: For booking flights and providing flight information
- HotelBooking: For booking hotels and providing hotel information
- CarRental: For booking cars and providing car rental information
- ActivitiesBooking: For booking activities and providing activity information
- DestinationInfo: For providing information about destinations
- DefaultAgent: For handling general requests"""
user_message = "Create a travel plan for a family of 2 kids from Singapore to Melbourne"
response = client.create_response(
input=user_message,
instructions=system_prompt,
context=f"Previous travel plan - {TravelPlan}",
)
# .. перепланировать и отправить задачи соответствующим агентам
Для более комплексного планирования ознакомьтесь с Magnetic One Blogpost для решения сложных задач.
В этой статье мы рассмотрели пример, как можно создать планировщика, который динамически выбирает доступных агентов. Вывод планировщика разбивает задачи и назначает агентов для их выполнения. Предполагается, что агенты имеют доступ к необходимым функциям/инструментам для выполнения задачи. Дополнительно можно использовать другие паттерны, такие как рефлексия, суммаризатор и круговой чат, для дальнейшей настройки.
Magnetic One — универсальная мультиагентная система для решения сложных задач, которая достигла впечатляющих результатов на нескольких сложных агентных тестах. Ссылка: Magnetic One. В этой реализации оркестратор создаёт специфичные для задач планы и делегирует их доступным агентам. Помимо планирования оркестратор использует механизм отслеживания прогресса задачи и перепланирует по мере необходимости.
Присоединяйтесь к Microsoft Foundry Discord, чтобы встретиться с другими обучающимися, посетить часы работы и получить ответы на вопросы по ИИ-агентам.
Паттерн проектирования мультиагентов
Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.