多Agent協作入門:順(shun)序編排模(mo)式
大家好,我是Edison。
上一篇我們學習了Semantic Kernel中的并發編排模式,它非常適合并行分(fen)析(xi)、獨立(li)子任務(wu)并集成決策的任務(wu)場景。今天,我們(men)學習新(xin)的模(mo)式:順序編排。
順序編排模式簡介
在順序編排模式中,各個Agent被組成一個流程,每個Agent都會處理任務,并將執行結果輸出傳遞給下一個待執行的Agent。可以看出,對于每個基于上一步驟構建的工作流(Workflow)來說,這是比較(jiao)適合的模式。
目前,像文(wen)檔審閱、工(gong)作流、數據處(chu)理管道、多階段推理等,是比較常見的應用場景。
下圖展示了一個(ge)文檔翻(fan)譯(yi)(yi)的(de)用(yong)例,文檔先通過(guo)Agent1生成摘要,然后通過(guo)Agent2執行(xing)翻(fan)譯(yi)(yi),最(zui)后通過(guo)Agent3進行(xing)審(shen)閱和(he)質量保(bao)證,最(zui)終(zhong)生成最(zui)后的(de)翻(fan)譯(yi)(yi)結(jie)果(guo)(guo)。可以看到,每個(ge)Agent都(dou)在(zai)基于上一個(ge)步驟的(de)處理結(jie)果(guo)(guo)進行(xing)構建,這就是一個(ge)典(dian)型的(de)順序(xu)編排用(yong)例。

實(shi)現順(shun)序(xu)編排模式(shi)
這里(li)我(wo)們來實現一(yi)個DEMO,我(wo)們定義(yi)3個Agent:分析師(Analyst)、廣告(gao)文案寫手(CopyWriter) 和 編輯(ji)/審稿人(Editor),假設他們是一(yi)個小Team,在承接廣告(gao)文案的創(chuang)作。
那么(me)我們(men)這個DEMO的(de)目標(biao),就(jiu)是可以讓他們(men)可以來接客,只(zhi)要客戶分(fen)(fen)配(pei)一個廣(guang)告文(wen)案(an)創作(zuo)的(de)任務(wu),它們(men)就(jiu)可以配(pei)合來生(sheng)成最(zui)終的(de)文(wen)案(an):首先由分(fen)(fen)析(xi)師分(fen)(fen)析(xi)要介(jie)紹(shao)產品的(de)亮點和宣傳思路,再由寫手生(sheng)成一個文(wen)案(an)草稿(gao),最(zui)后由審稿(gao)人進行評估給出最(zui)終文(wen)案(an),這就(jiu)是一個典型(xing)的(de)工作(zuo)流處理。
為(wei)了簡單地實現(xian)這(zhe)個功能,我們(men)創建一個.NET控制臺(tai)項目,然后(hou)安裝以下包(bao):
Microsoft.SemanticKernel.Agents.Core
Microsoft.SemanticKernel.Agents.OpenAI (Preview版(ban)(ban)本(ben))
Microsoft.SemanticKernel.Agents.Orchestration (Preview版(ban)(ban)本(ben))
Microsoft.SemanticKernel.Agents.Runtime.InProcess (Preview版(ban)(ban)本(ben))
需要注意的(de)是(shi),由于(yu)Semantic Kernel的(de)較多(duo)功能目前還處于(yu)實驗預覽階段,所(suo)以建議(yi)在該項目的(de)csproj文件中加入(ru)以下配置,統(tong)一(yi)取(qu)消警告:
<PropertyGroup> <NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn> </PropertyGroup>
創建一個appsettings.json配(pei)置文件,填入以下關于LLM API的(de)配(pei)置,其(qi)中(zhong)API_KEY請輸入你(ni)自(zi)己的(de):
{
"LLM": {
"BASE_URL": "//api.siliconflow.cn",
"API_KEY": "******************************",
"MODEL_ID": "Qwen/Qwen2.5-32B-Instruct"
}
}
這里我們使用SiliconCloud提供的 Qwen2.5-32B-Instruct 模型,你(ni)可(ke)以通過這個URL注冊賬號: 獲取大量免費的Token來進行本(ben)次實驗。
有了LLM API,我(wo)們可以創建一個Kernel供(gong)后續使用(yong),這也是老面孔(kong)了:
Console.WriteLine("Now loading the configuration..."); var config = new ConfigurationBuilder() .AddJsonFile($"appsettings.json", optional: false, reloadOnChange: true) .Build(); Console.WriteLine("Now loading the chat client..."); var chattingApiConfiguration = new OpenAiConfiguration( config.GetSection("LLM:MODEL_ID").Value, config.GetSection("LLM:BASE_URL").Value, config.GetSection("LLM:API_KEY").Value); var openAiChattingClient = new HttpClient(new OpenAiHttpHandler(chattingApiConfiguration.EndPoint)); var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion(chattingApiConfiguration.ModelId, chattingApiConfiguration.ApiKey, httpClient: openAiChattingClient) .Build();
接下來,我(wo)們就一步(bu)一步(bu)地來看看核心(xin)的代碼。
定義3個Agent
這里我們來定(ding)義3個Agent:Analyst,Writer,Editor
(1)Analyst 分析師
var analystAgent = new ChatCompletionAgent() { Name = "Analyst", Instructions = """ You are a marketing analyst. Given a product description, identify: - Key features - Target audience - Unique selling points """, Description = "A agent that extracts key concepts from a product description.", Kernel = kernel };
(2)Writer 文案寫手
var writerAgent = new ChatCompletionAgent() { Name = "CopyWriter", Instructions = """ You are a marketing copywriter. Given a block of text describing features, audience, and USPs, compose a compelling marketing copy (like a newsletter section) that highlights these points. Output should be short (around 150 words), output just the copy as a single text block. """, Description = "An agent that writes a marketing copy based on the extracted concepts.", Kernel = kernel };
(3)Editor 編輯/審稿人
var editorAgent = new ChatCompletionAgent() { Name = "Editor", Instructions = """ You are an editor. Given the draft copy, correct grammar, improve clarity, ensure consistent tone, give format and make it polished. Output the final improved copy as a single text block. """, Description = "An agent that formats and proofreads the marketing copy.", Kernel = kernel };
選擇編排模式
這里我們選擇的是順序編排模式:SequentialOrchestration,將(jiang)需要(yao)編排的(de)3個Agent作為參(can)數(shu)傳遞(di)給(gei)它。
需要注意的是:這里為了能夠顯示每個Agent的執行結果,我們定一個了一個自定義的回調方法 responseCallback,幫助顯示每個Agent的輸出記錄供參考。
// Set up the Sequential Orchestration ChatHistory history = []; ValueTask responseCallback(ChatMessageContent response) { history.Add(response); return ValueTask.CompletedTask; } var orchestration = new SequentialOrchestration(analystAgent, writerAgent, editorAgent) { ResponseCallback = responseCallback };
啟動運行(xing)時(shi)
在(zai)Semantic Kernel中,需(xu)要運行(xing)時(Runtime)才(cai)能管理Agent的執行(xing),因此這里我們需(xu)要在(zai)正式開始前使用InProcessRuntime并啟動(dong)起來。
// Start the Runtime var runtime = new InProcessRuntime(); await runtime.StartAsync();
調用(yong)編(bian)排 并(bing) 收集結果
準備工作差不多了(le),現在(zai)我們可以開始(shi)調用編排了(le)。這(zhe)也是老(lao)面孔代碼了,不過(guo)多解釋。
// Start the Chat Console.WriteLine("----------Agents are Ready. Let's Start Working!----------"); while (true) { Console.WriteLine("User> "); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) continue; input = input.Trim(); if (input.Equals("EXIT", StringComparison.OrdinalIgnoreCase)) { // Stop the Runtime await runtime.RunUntilIdleAsync(); break; } try { // Invoke the Orchestration var result = await orchestration.InvokeAsync(input, runtime); // Collect Results from multi Agents var output = await result.GetValueAsync(TimeSpan.FromSeconds(10 * 2)); // Print the Results Console.WriteLine($"{Environment.NewLine}# RESULT: {output}"); Console.WriteLine($"{Environment.NewLine}ORCHESTRATION HISTORY"); foreach (var message in history) { Console.WriteLine($"#{message.Role} - {message.AuthorName}:"); Console.WriteLine($"{message.Content.Replace("---", string.Empty)}{Environment.NewLine}"); } } catch (HttpOperationException ex) { Console.WriteLine($"Exception: {ex.Message}"); } finally { Console.ResetColor(); Console.WriteLine(); } }
需要注意的是:上面的代碼示例中我主動輸出了編排過程中每個Agent的生成結果歷史記錄,便于我們一會兒查看。
效果展示(shi)
用戶(hu)輸入問題:"Please help to introduce our new product: An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours."
假設(she)客戶公司有(you)一(yi)個新(xin)產品(pin):一(yi)個環保(bao)(bao)的不銹(xiu)鋼水瓶,可以讓飲料保(bao)(bao)持24小(xiao)時的低溫,需要幫忙創作一(yi)個廣(guang)告(gao)文(wen)案。
最終(zhong)經過3個Agent的(de)順序合作,結果(guo)顯示如下:

可以看到,它們合(he)(he)作寫出了一段(duan)適合(he)(he)宣傳的廣(guang)告(gao)文案。
那么,它們到底是如何合作的(de)呢?剛(gang)剛(gang)我們主動(dong)輸(shu)出(chu)了(le)歷史記錄,可(ke)以看(kan)看(kan):

可以看到,Agent1-分(fen)析(xi)師對產品介(jie)紹生成了很多關鍵(jian)賣點和受眾群(qun)體的分(fen)析(xi)結果,Agent2-寫手(shou)便基于分(fen)析(xi)結果寫了一(yi)個(ge)文(wen)案(an)草稿,最終Agent3-編(bian)輯對文(wen)案(an)進行了審(shen)核,最終發布廣告(gao)文(wen)案(an)。
小(xiao)結
本文介(jie)紹(shao)了順(shun)序編排(pai)模(mo)式的(de)基本概念,然后通過一個(ge)案(an)例介(jie)紹(shao)了如何實現一個(ge)順(shun)序編排(pai)模(mo)式,相信通過這個(ge)案(an)例你能(neng)夠有個(ge)感性(xing)的(de)認識。
下一篇,我們將(jiang)再次學習群(qun)聊(liao)(liao)編排模(mo)式,并通過自定義(yi)(yi)群(qun)組聊(liao)(liao)天(tian)管理器(qi)(GroupChatManager)來自定義(yi)(yi)群(qun)聊(liao)(liao)流程(cheng)。
示例源碼
GitHub:
參考資料
Microsoft Learn:
推薦學習
圣杰:《.NET+AI | Semantic Kernel入門到精通》

作者:愛(ai)迪(di)生
出處:
本文版權歸作者(zhe)和博客園共有,歡迎轉載,但未(wei)經作者(zhe)同意必(bi)須保留(liu)此段聲明,且在文章(zhang)頁面(mian)明顯(xian)位置給出原文鏈接。

在順序編排模式中,各個Agent被組成一個流程,每個Agent都會處理任務,并將執行結果輸出傳遞給下一個待執行的Agent。可以看出,對于每個基于上一步驟構建的工作流(Workflow)來說,這是比較適合的模式。目前,像文檔審閱、工作流、數據處理管道、多階段推理等,是比較常見的應用場景。