中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

多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入門到精通

 

posted @ 2025-07-17 08:30  EdisonZhou  閱讀(433)  評論(0)    收藏  舉報