我們已經學會了如何打造一位獨當一面的頂級廚師(Kernel)和多才多藝的廚房助手(Plugins)。但如果今天客人點了一道需要多個步驟才能完成的複雜料理,例如一份從研究、撰寫到校對的企劃案,只靠一個廚師單打獨鬥效率會很差。這時候,我們需要一個廚房協調中心來分配任務,讓不同專業的廚師依序完成工作。
這就是我們今天要探討的兩種協作模式:Sequential Orchestration (循序模式) 和 Handoff Orchestration (交接模式)。
想像一下一個汽車製造廠的流水線:第一站的工人負責安裝引擎,完成後將車體推到第二站,第二站的工人負責安裝車門,以此類推,直到最後組裝完成。
在 AI 世界中,「循序模式」正是這種概念。我們建立一個工作流 (Workflow),將一個複雜的任務拆解成多個簡單的步驟,每個步驟由一個專門的 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}");
}
這段程式碼展示了一個完整的循序工作流,用餐廳分工來做比喻,非常清晰:
WaiterAgent
、負責烹飪的 ChefAgent
和負責品管的 ManagerAgent
。每個 Agent 都被賦予了獨特的指示,來模擬它們在現實世界中的角色。SequentialOrchestration
實例,將三位 Agent 依序排列。ResponseCallback
則用於將每個 Agent 的輸出都儲存到 history
中,這樣我們就能追蹤整個任務的處理過程。orchestration.InvokeAsync()
方法,並將顧客需求作為初始輸入。這個方法會自動按照順序,將輸入傳遞給 WaiterAgent
,再將 WaiterAgent
的輸出傳遞給 ChefAgent
,最後將 ChefAgent
的輸出傳遞給 ManagerAgent
。ManagerAgent
的輸出會被儲存在 result
中,並印出最終的精緻菜單。同時,我們也會將 history
裡的對話記錄印出,讓整個處理過程一目瞭然。透過這種模式,我們成功地將一個複雜的「菜單設計」任務,拆解成可管理的步驟,並由不同的專業 Agent 依序完成,這就是 Sequential Orchestration 的強大之處。
今天的文章為我們打開了 Agent 團隊合作的大門。從單打獨鬥到分工合作,Semantic Kernel 提供了靈活的框架來實現各種複雜的 AI 工作流。
明天,我們將深入探討更複雜、更智慧的協作模式——Magentic Orchestration。這是一種能夠讓 Agent 像真正的團隊一樣,進行「腦力激盪」和「協調溝通」的高階協作模式。敬請期待!