AI Agents 入門課程 · 第 7 課 / 共 18 課

規劃設計模式 (Planning Design)

原文:Microsoft AI Agents for Beginners · MIT 授權

一句話:規劃設計模式讓 AI Agent 不再是「一步到位」的回答機,而是能拆解複雜任務、產生結構化計畫、分配給子 Agent 執行,並根據結果動態調整的策略腦。

課程簡介

本課將涵蓋三項核心能力:

學習目標

學完本課後,你將能夠:

定義總體目標與任務分解

大多數真實世界任務太複雜,無法一步完成。AI Agent 需要一個精確的目標來引導它的規劃與行動。

範例目標

"為一個家庭規劃 3 天旅行行程。"

雖然聽起來簡單,但仍需要細化。目標越清晰,Agent(以及人類協作者)就越能專注於正確的結果——例如包含航班選項、飯店推薦和活動建議的完整行程。

任務分解 (Task Decomposition)

大型或複雜的任務在拆分為較小、目標導向的子任務後,會變得更容易管理。

以前面旅行行程為例,你可以將目標分解為:

子任務說明
機票預訂搜尋最佳航班優惠
飯店預訂尋找適合家庭的住宿
租車服務安排適合四人家庭的車輛
個人化根據偏好客製化行程

每個子任務可以由專屬的 Agent 或程序處理。一個 Agent 專門搜尋最佳航班、另一個專注飯店預訂,然後由一個協調者 Agent 將結果彙整成一份連貫的行程交給使用者。

核心概念:這種方法允許漸進式增強。例如,你可以隨時新增「美食推薦」或「當地活動建議」的專屬 Agent,逐步豐富行程品質。

結構化輸出 (Structured Output)

大型語言模型(LLM)可以生成結構化輸出(如 JSON),讓下游 Agent 或服務更容易解析與處理。這在多 Agent 場景中尤其重要——收到規劃輸出後,可以直接根據結構化資料將任務發派給對應的 Agent。

程式碼範例:規劃 Agent + 結構化輸出

from pydantic import BaseModel
from enum import Enum
from typing import List, Optional
import json, os
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. Decide which agents to run..."

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))

預期輸出(結構化 JSON)

{
    "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."
        },
        {
            "assigned_agent": "activities_booking",
            "task_details": "List family-friendly activities in Melbourne."
        },
        {
            "assigned_agent": "destination_info",
            "task_details": "Provide information about Melbourne as a destination."
        }
    ]
}

關鍵概念:有了這個結構化 JSON,協調者 Agent 就可以根據 assigned_agent 欄位,將每個子任務路由到對應的專屬 Agent,然後彙整結果給使用者。

多 Agent 編排中的規劃者角色

在一個多 Agent 系統中,規劃者 Agent (Planner Agent) 扮演核心的協調角色:

步驟說明
1. 接收請求收到使用者請求,例如「我需要一個旅行飯店計畫」
2. 產生結構化計畫根據系統提示(含可用 Agent 清單),規劃者生成結構化的旅行計畫
3. 路由任務根據子任務數量:單一任務直接發派給專屬 Agent;多任務則透過群組聊天管理器(Group Chat Manager)協調多 Agent 協作
4. 彙總結果規劃者將結果彙整成清晰易懂的最終輸出

注意

以上程式碼範例使用 Microsoft Agent Framework 的 FoundryChatClient,需要 Azure AI Foundry 環境。完整的 Jupyter Notebook 範例可於 課程程式碼目錄 取得。

迭代式規劃 (Iterative Planning)

有些任務需要來回調整或重新規劃——一個子任務的結果可能影響下一個子任務。例如,Agent 在預訂航班時發現非預期的資料格式,就需要調整策略才能繼續處理飯店預訂。

此外,使用者回饋(例如旅客決定想要更早的航班)也可以觸發局部重新規劃。這種動態、迭代的方法確保最終方案符合真實世界限制與不斷變化的使用者偏好。

迭代規劃程式碼概念

# 將先前的計畫和使用者歷史傳入 context
response = client.create_response(
    input=user_message,
    instructions=system_prompt,
    context=f"Previous travel plan - {TravelPlan}",
)
# ... 根據新資訊重新規劃,並將任務發派給對應 Agent

更進階的規劃:Microsoft Research 的 Magentic One 是一個通用型多 Agent 系統,專門解決複雜任務,在多個具挑戰性的 Agent 基準測試中取得了亮眼成績。在這個實作中,協調者不僅建立任務特定計畫並委派給可用 Agent,還使用追蹤機制監控任務進度,必要時進行重新規劃。

課程結論

本課我們看到如何建立一個能動態選擇可用 Agent 的規劃者。規劃者的輸出會分解任務並指派 Agent,假設這些 Agent 已具備執行任務所需的函式/工具。除了 Agent 本身,你還可以加入其他模式——如反思(reflection)、摘要(summarizer)、輪詢聊天(round robin chat)——進一步客製化你的系統。

本課重點回顧

  1. 任務分解是核心:大型任務拆成子任務,分配給專屬 Agent,模組化讓系統更容易擴展與維護
  2. 結構化輸出是黏合劑:用 JSON/Pydantic 定義輸出格式,讓 Agent 之間的溝通可靠且可程式化處理
  3. 規劃者 Agent 是編排中樞:接收請求、產生計畫、路由任務、彙總結果,四步驟完成多 Agent 協作
  4. 迭代式規劃因應變化:子任務結果影響下一步?使用者改變心意?傳入 context 觸發重新規劃,保持彈性
  5. Magentic One 是進階參考:Microsoft Research 的通用多 Agent 系統,內建追蹤機制與動態重新規劃能力

原始資源