Bài này trình bày cách một agent lập kế hoạch: đặt mục tiêu rõ ràng, chia tác vụ phức tạp thành tác vụ con, dùng đầu ra có cấu trúc để giao việc cho các agent khác và lập lại kế hoạch khi cần.
Video của bài: Planning Design Pattern.
Giới thiệu
Bài này đề cập:
- Xác định một mục tiêu tổng thể rõ ràng và chia tác vụ phức tạp thành các tác vụ dễ quản lý.
- Tận dụng đầu ra có cấu trúc (structured output) để có phản hồi đáng tin cậy hơn và máy đọc được.
- Áp dụng cách tiếp cận hướng sự kiện để xử lý các tác vụ thay đổi linh hoạt và đầu vào bất ngờ.
Mục tiêu học tập
Sau bài này, bạn sẽ hiểu cách:
- Xác định và đặt mục tiêu tổng thể cho một AI agent, đảm bảo nó biết rõ cần đạt được gì.
- Phân rã một tác vụ phức tạp thành các tác vụ con dễ quản lý và sắp xếp chúng theo trình tự logic.
- Trang bị cho agent đúng tool (ví dụ tool tìm kiếm hoặc tool phân tích dữ liệu), quyết định khi nào và dùng chúng ra sao, và xử lý các tình huống bất ngờ phát sinh.
- Đánh giá kết quả của tác vụ con, đo hiệu năng và lặp lại các hành động để cải thiện đầu ra cuối cùng.
Xác định mục tiêu tổng thể và chia nhỏ tác vụ

Hầu hết tác vụ thực tế quá phức tạp để xử lý trong một bước. AI agent cần một mục tiêu ngắn gọn để định hướng việc lập kế hoạch và hành động. Ví dụ, xét mục tiêu:
"Generate a 3-day travel itinerary."
(Tạo lịch trình du lịch 3 ngày.) Dù phát biểu đơn giản, mục tiêu này vẫn cần làm rõ thêm. Mục tiêu càng rõ, agent (và mọi cộng sự con người) càng tập trung tốt hơn vào việc đạt đúng kết quả, như tạo một lịch trình đầy đủ gồm lựa chọn chuyến bay, gợi ý khách sạn và đề xuất hoạt động.
Phân rã tác vụ
Các tác vụ lớn hoặc phức tạp trở nên dễ quản lý hơn khi được chia thành các tác vụ con nhỏ hơn, hướng tới mục tiêu. Với ví dụ lịch trình du lịch, bạn có thể phân rã mục tiêu thành:
- Đặt vé máy bay
- Đặt khách sạn
- Thuê xe
- Cá nhân hoá
Sau đó mỗi tác vụ con có thể do một agent hoặc tiến trình chuyên trách xử lý. Một agent có thể chuyên tìm vé máy bay giá tốt nhất, một agent khác tập trung đặt khách sạn, v.v. Một agent điều phối hay agent "phía sau" (downstream) sau đó có thể tổng hợp các kết quả này thành một lịch trình mạch lạc cho người dùng cuối.
Cách tiếp cận mô-đun này cũng cho phép cải tiến dần dần. Ví dụ, bạn có thể thêm các agent chuyên biệt cho gợi ý ẩm thực hoặc gợi ý hoạt động tại địa phương và tinh chỉnh lịch trình theo thời gian.
Đầu ra có cấu trúc
Large Language Model (LLM) có thể sinh đầu ra có cấu trúc (ví dụ JSON), giúp các agent hoặc dịch vụ phía sau dễ phân tích và xử lý hơn. Điều này đặc biệt hữu ích trong bối cảnh đa agent, nơi chúng ta có thể thực thi các tác vụ sau khi nhận được đầu ra lập kế hoạch.
Đoạn Python sau minh hoạ một agent lập kế hoạch đơn giản phân rã mục tiêu thành các tác vụ con và sinh một kế hoạch có cấu trúc:
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"
# 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
provider = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
# Define the user message
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))
Agent lập kế hoạch với điều phối đa agent
Trong ví dụ này, một Semantic Router Agent nhận yêu cầu của người dùng (ví dụ "I need a hotel plan for my trip.", tức "Tôi cần kế hoạch khách sạn cho chuyến đi").
Sau đó agent lập kế hoạch:
- Nhận yêu cầu kế hoạch khách sạn: agent lập kế hoạch lấy tin nhắn của người dùng và, dựa trên system prompt (gồm thông tin các agent có sẵn), sinh một kế hoạch du lịch có cấu trúc.
- Liệt kê các agent và tool của chúng: registry agent giữ danh sách các agent (ví dụ cho chuyến bay, khách sạn, thuê xe và hoạt động) cùng các hàm hoặc tool mà chúng cung cấp.
- Định tuyến kế hoạch tới các agent tương ứng: tuỳ số lượng tác vụ con, agent lập kế hoạch hoặc gửi tin nhắn trực tiếp tới một agent chuyên trách (với kịch bản một tác vụ), hoặc điều phối qua một group chat manager cho việc cộng tác đa agent.
- Tóm tắt kết quả: cuối cùng, agent lập kế hoạch tóm tắt kế hoạch đã sinh cho rõ ràng.
Code Python sau minh hoạ các bước này:
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 agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
# Create the client
provider = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
from pprint import pprint
# Define the user message
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
# Print the response content after loading it as JSON
pprint(json.loads(response_content))
Dưới đây là đầu ra của code trên. Bạn có thể dùng đầu ra có cấu trúc này để định tuyến tới assigned_agent và tóm tắt kế hoạch du lịch cho người dùng cuối.
{
"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."
}
]
}
Notebook ví dụ với đoạn code trên có tại đây.
Lập kế hoạch lặp
Một số tác vụ cần trao đổi qua lại hoặc lập lại kế hoạch, khi kết quả của tác vụ con này ảnh hưởng tới tác vụ con tiếp theo. Ví dụ, nếu agent phát hiện một định dạng dữ liệu bất ngờ khi đặt vé máy bay, nó có thể cần điều chỉnh chiến lược trước khi chuyển sang đặt khách sạn.
Ngoài ra, phản hồi của người dùng (ví dụ một người quyết định thích chuyến bay sớm hơn) có thể kích hoạt việc lập lại một phần kế hoạch. Cách tiếp cận lặp, linh hoạt này đảm bảo giải pháp cuối cùng phù hợp với ràng buộc thực tế và sở thích đang thay đổi của người dùng.
Ví dụ code:
import os
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
#.. same as previous code and pass on the user history, current plan
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}",
)
# .. re-plan and send the tasks to respective agents
Để lập kế hoạch toàn diện hơn cho các tác vụ phức tạp, hãy xem bài blog về Magnetic One.
Tóm tắt
Trong bài này, chúng ta đã xem ví dụ cách tạo một agent lập kế hoạch có thể chọn linh hoạt các agent đã định nghĩa. Đầu ra của agent lập kế hoạch phân rã tác vụ và giao cho các agent để chúng thực thi. Giả định là các agent có quyền truy cập các hàm/tool cần thiết để làm tác vụ. Ngoài các agent, bạn có thể đưa vào các mẫu khác như reflection (phản tư), summarizer (tóm tắt) và round robin chat (trò chuyện xoay vòng) để tuỳ biến thêm.
Tài liệu bổ sung
Magentic One là một hệ đa agent tổng quát để giải quyết tác vụ phức tạp và đã đạt kết quả ấn tượng trên nhiều benchmark agentic khó. Tham khảo: Magentic One. Trong cách cài đặt này, bộ điều phối (orchestrator) tạo kế hoạch riêng cho từng tác vụ và giao các tác vụ đó cho các agent có sẵn. Ngoài lập kế hoạch, bộ điều phối còn dùng cơ chế theo dõi để giám sát tiến độ của tác vụ và lập lại kế hoạch khi cần.
Còn câu hỏi về mẫu thiết kế Planning?
Tham gia Microsoft Foundry Discord để gặp gỡ những người cùng học, dự các buổi office hours và được giải đáp thắc mắc về AI agent.
Nguồn
- Dịch và biên tập từ microsoft/ai-agents-for-beginners · 07-planning-design/README.md, giấy phép MIT.