iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0

我們已經學會了如何打造一位獨當一面的頂級廚師(Kernel)和多才多藝的廚房助手(Plugins)。但如果今天客人點了一道需要多個步驟才能完成的複雜料理,例如一份從研究、撰寫到校對的企劃案,只靠一個廚師單打獨鬥效率會很差。這時候,我們需要一個廚房協調中心來分配任務,讓不同專業的廚師依序完成工作。

這就是我們今天要探討的兩種協作模式:Sequential Orchestration (循序模式)Handoff Orchestration (交接模式)


Sequential Orchestration:流水線上的完美協作

想像一下一個汽車製造廠的流水線:第一站的工人負責安裝引擎,完成後將車體推到第二站,第二站的工人負責安裝車門,以此類推,直到最後組裝完成。

在 AI 世界中,「循序模式」正是這種概念。我們建立一個工作流 (Workflow),將一個複雜的任務拆解成多個簡單的步驟,每個步驟由一個專門的 Agent 來負責。上一個 Agent 的輸出,會自動成為下一個 Agent 的輸入,形成一個無縫接軌的處理鏈。

這特別適合處理那些有明確先後順序的任務,例如:

  • 資料處理: 爬蟲 Agent 抓取資料 -> 分析 Agent 整理數據 -> 報告 Agent 生成摘要。
  • 內容創作: 企劃 Agent 產出大綱 -> 文案 Agent 撰寫初稿 -> 編輯 Agent 校對潤飾。

Handoff Orchestration:動態的專家交接

如果說循序模式是固定的流水線,那麼「交接模式」就像是一位聰明的餐廳領班。當客人提出一個模糊的需求,例如「幫我安排一個完美的週末」,領班會先聽取需求,然後判斷這個任務需要哪些專家來處理。

  • "完美的週末" -> "需要美食推薦和旅遊規劃。"
  • 領班將任務交接給「美食專家 Agent」和「旅遊規劃 Agent」。
  • 如果客人後續又問到「那天氣如何?」,領班會動態地將控制權轉交給「天氣預報 Agent」。

這種模式的精髓在於動態決策。Agent 不再是固定鏈結,而是根據對話情境,智慧地將任務轉交給最適合處理的「專家 Agent」,這賦予了應用更大的彈性。


程式碼實戰:餐飲服務三部曲

為了讓大家更具體地理解,我們來打造一個餐飲服務流程。這個流程包含三位專業的 AI 員工:

  • WaiterAgent:負責閱讀顧客需求,並提煉出用餐場合、飲食偏好、預算等關鍵資訊,供主廚參考。
  • ChefAgent:根據服務生提供的重點,設計一份三道式套餐,並提供飲品搭配建議。
  • ManagerAgent:對主廚的菜單進行校對,確保符合顧客的所有限制與風格要求,並輸出最終的精緻版菜單。

我們將使用 ChatHistory 作為上下文傳遞的載體,讓每一位 Agent 都能讀到前一位 Agent 的工作成果。

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Orchestration;
using Microsoft.SemanticKernel.Agents.Orchestration.Sequential;
using Microsoft.SemanticKernel.Agents.Runtime.InProcess;
using Microsoft.SemanticKernel.ChatCompletion;

// 步驟 1: 初始化 Kernel 並設定 AI 服務
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();
var builder = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
        modelId: "gpt-4o-mini",
        apiKey: config["OpenAI:ApiKey"]!);

var kernel = builder.Build();

// 步驟 2: 定義三位餐飲情境的專家 Agent
var waiterAgent = new ChatCompletionAgent
{
    Kernel = kernel,
    Instructions = "你是一位餐廳資深服務生/點餐顧問。請閱讀顧客需求,整理限制(飲食禁忌、過敏、預算、人數、口味偏好)、場合與期望風格,條列出 3-5 個關鍵重點供主廚參考。",
    Name = "WaiterAgent",
    Description = "An expert in dining service and requirement gathering.",
};

var chefAgent = new ChatCompletionAgent
{
    Kernel = kernel,
    Instructions = "你是一位餐廳主廚。根據服務生提供的重點,設計一份三道式套餐(前菜、主菜、甜點),每道需包含:菜名、20-40 字描述、主要食材,並標註是否含堅果/辣/含酒精;另提供 1-2 項飲品搭配建議。總字數約 200-250 字。",
    Name = "ChefAgent",
    Description = "An expert chef crafting course menus and pairings.",
};

var managerAgent = new ChatCompletionAgent
{
    Kernel = kernel,
    Instructions = "你是一位餐廳經理/品管。請校對主廚的草稿,確保語句通順、專業一致,並嚴格符合限制(例如不含牛、避免花生、預算與風格)。如有違規請以同等級、同風格的選項替換。最後輸出精緻版菜單,不要加入額外解說。",
    Name = "ManagerAgent",
    Description = "An expert in menu QA, editing, and consistency.",
};

// 步驟 3: 設定工作流的初始文件(餐飲場景)
ChatHistory history = [];
var initialDocument = "顧客 2 人,預算新台幣 1200 元左右,偏好海鮮與義大利麵,不吃牛,口味偏清淡。其中一人對花生過敏。今晚約會用餐,想要三道式套餐與飲品搭配建議。";
SequentialOrchestration orchestration =
            new(waiterAgent, chefAgent, managerAgent)
            {
                ResponseCallback = (response) =>
                {
                    history.Add(response);
                    return ValueTask.CompletedTask;
                }
            };
InProcessRuntime runtime = new();
await runtime.StartAsync();
// 步驟 4: 執行循序工作流
Console.WriteLine($"\n# INPUT: {initialDocument}\n");
OrchestrationResult<string> result = await orchestration.InvokeAsync(initialDocument, runtime);
string text = await result.GetValueAsync(TimeSpan.FromSeconds(180));
Console.WriteLine($"\n# RESULT: {text}");

foreach (ChatMessageContent message in history)
{
    Console.WriteLine($"{message.Role} {message.AuthorName}: {message.Content}");
}

這段程式碼展示了一個完整的循序工作流,用餐廳分工來做比喻,非常清晰:

  1. 初始化 Kernel 與 Agent:首先,我們設定好 AI 服務,並定義了三位專業的 Agent,分別是負責點餐的 WaiterAgent、負責烹飪的 ChefAgent 和負責品管的 ManagerAgent。每個 Agent 都被賦予了獨特的指示,來模擬它們在現實世界中的角色。
  2. 設定工作流與初始輸入:我們創建了一個 SequentialOrchestration 實例,將三位 Agent 依序排列。ResponseCallback 則用於將每個 Agent 的輸出都儲存到 history 中,這樣我們就能追蹤整個任務的處理過程。
  3. 執行工作流:我們呼叫 orchestration.InvokeAsync() 方法,並將顧客需求作為初始輸入。這個方法會自動按照順序,將輸入傳遞給 WaiterAgent,再將 WaiterAgent 的輸出傳遞給 ChefAgent,最後將 ChefAgent 的輸出傳遞給 ManagerAgent
  4. 輸出結果:最終,ManagerAgent 的輸出會被儲存在 result 中,並印出最終的精緻菜單。同時,我們也會將 history 裡的對話記錄印出,讓整個處理過程一目瞭然。

透過這種模式,我們成功地將一個複雜的「菜單設計」任務,拆解成可管理的步驟,並由不同的專業 Agent 依序完成,這就是 Sequential Orchestration 的強大之處。


系列總結與預告

今天的文章為我們打開了 Agent 團隊合作的大門。從單打獨鬥到分工合作,Semantic Kernel 提供了靈活的框架來實現各種複雜的 AI 工作流。

明天,我們將深入探討更複雜、更智慧的協作模式——Magentic Orchestration。這是一種能夠讓 Agent 像真正的團隊一樣,進行「腦力激盪」和「協調溝通」的高階協作模式。敬請期待!


完整程式碼範例


上一篇
Day 20: 腦力激盪:Concurrent & Group Chat Orchestration
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言