iT邦幫忙

2024 iThome 鐵人賽

DAY 19
1
生成式 AI

Semantic Kernel 的魔力-用.NET探索生成式應用系列 第 19

AI Agent:基於 Workflow 的國際新聞摘要與翻譯 Multi AI Agent 應用

  • 分享至 

  • xImage
  •  

「每天都有大量的國際新聞湧現,如何有效率獲取得並理解這些資訊成為挑戰。過去,透過 APP 或網站瀏覽新聞,整理相關資訊往往費時且不便。而如果有一個代理人能幫你收集國際新聞,然後另一個代理人將其翻譯並生成摘要,供你隨時查閱,肯定會節省不少時間。這篇文章將介紹如何基於 Semantic Kernel 開發這樣的 AI Agent 應用,以實現這種自動化的新聞整理與翻譯流程。」
https://ithelp.ithome.com.tw/upload/images/20241002/20126569sXmYxCnQKy.png

AI Agent 的功能概述

這個 AI Agent 場景的主要能力有:

  • 每日國際新聞摘要:抓取國際新聞,提取關鍵內容,生成簡潔易懂的摘要。
  • 自動翻譯:將新聞摘要翻譯成中文,提供給需要中文內容的使用者。

AI Agent 的工作流程包括2個過程,並且這個工作流程是依順序進行,一旦反著就無法完成目標任務:

  1. 透過RSS方式收集國際新聞資料,並解析RSS資料
  2. 接著根據RSS資料,產生中文摘要內容

一個Agent或二個Agent

事實上這個場景的應用,用1個Agent或2個Agent都可以達成,至於要採取哪一個做法,可以從彈性化的角度去思考,把 Agent 細小化後,透過組合的方式可以產生更多的應用場景,就像應用系統設計一樣,走向 Micro Service,Agent 也可以從類似的角度去思考設計(but 這沒有絕對)。我採取的是用2個Agent來實現這個場景。

程式碼解說

  • 建立 Plugins
    LLM 模型無法取得即時新聞資訊,因此必須有個 Plugins 可以實現 function calling,取得即時新聞資訊。這裡我選擇使用 BBC 的 NEWS RSS,並且從中擷取titledescription節點內容。
public class NewsPlugin
{

    [KernelFunction, Description("Get Today's top news")]
    public string GetTopsNews()
    {
        string url = "http://feeds.bbci.co.uk/news/world/rss.xml";

        try
        {
            var rssString = string.Empty;

            using (var client = new HttpClient())
            {
                rssString = client.GetStringAsync(url).GetAwaiter().GetResult();
            }

            List<NewsItem> newsItems = new List<NewsItem>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(rssString);

            XmlNodeList itemNodes = xmlDoc.SelectNodes("//item");

            if (itemNodes != null)
            {
                foreach (XmlNode item in itemNodes)
                {
                    string title = item.SelectSingleNode("title")?.InnerText ?? "No Title";
                    string description = item.SelectSingleNode("description")?.InnerText ?? "No Description";

                    newsItems.Add(new NewsItem
                    {
                        Title = title,
                        Description = description
                    });
                }
            }
            return JsonConvert.SerializeObject(newsItems, Newtonsoft.Json.Formatting.Indented);
        }
        catch (Exception ex)
        {
            return $"An error occurred: {ex.Message}";
        }
    }
}
  • 建立 kernel 物件
    我選擇使用Azure OpenAI,當然你也可以換成 OpenAI,重點是模型要選聰明點的。
var builder = Kernel.CreateBuilder()
            .AddAzureOpenAIChatCompletion(
                endpoint: Config.aoai_endpoint,
                deploymentName: Config.aoai_deployment,
                apiKey: Config.aoai_apiKey);
var kernel = builder.Build();
  • 建立 News Agent
    透過 Instructions 定義 Agent 的用途及功能,並且需要有能力取得即時新聞資料,因此裝上了 NewsPlugin,並設定 AutoInvokeKernelFunctions。
string newsAgentName = "NewsAgent";
string newsAgentNameInstructions =
"""
You are a news agent, specializing in handling news-related tasks.
Your goal is to provide news summaries.
You will focus solely on these tasks and will not perform any unrelated tasks.
""";

ChatCompletionAgent newsAgent = new()
{
    Name = newsAgentName,
    Instructions = newsAgentNameInstructions,
    Kernel = kernel,
    Arguments = new KernelArguments(new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions })
};

KernelPlugin newsPlugin = KernelPluginFactory.CreateFromType<NewsPlugin>();
newsAgent.Kernel.Plugins.Add(newsPlugin);
  • 建立 Translate Agent
    負責進行翻譯的 Agent,語言翻譯是 LLM 模型本身擅長的能力,因此並不需要 Plugin 的支援。
string translateAgentName = "TranslateAgent";
string translateAgentInstructions =
"""
You are a translation agent, specializing in translating text between en-us and zh-tw languages.
Your goal is to provide accurate translations .
You will focus solely on these tasks and will not perform any unrelated tasks.
""";
ChatCompletionAgent translateAgent = new()
{
    Name = translateAgentName,
    Instructions = translateAgentInstructions,
    Kernel = kernel,
};
  • 建立 AgentGroupChat 物件,並將前面二個 Agent 加入
    AgentGroupChat 可以設定 ExecutionSettings參數,其中有一個 SelectionStrategy 參數,該參數允許自定義參與對話的 AI Agent 的選擇策略。預設情況下,它使用 SequentialSelectionStrategy,即按照順序讓 Agent 參與對話。因此,在我們的情境中,這兩個 Agent 必須按照特定順序參與,首先是 newsAgent 提供新聞內容,接著是 translateAgent 進行翻譯。
AgentGroupChat chat = new(newsAgent, translateAgent);

當二個 Agent 的順序是相反時,就會發現它無法提供即時的國際新聞,整個工作流程就無法往下進行

AgentGroupChat chat = new(translateAgent, newsAgent);

/*
今日國際上有哪些重要的事?
抱歉,我無法提供即時的國際新聞情報。你可以查閱新聞網站或應用程序以獲取最新訊息。
*/
  • agent 執行結果
ChatMessageContent message = new(AuthorRole.User, "今日國際上有哪些重要的事?");
chat.AddChatMessage(message);
Console.WriteLine(message);

await foreach (ChatMessageContent responese in chat.InvokeAsync())
{
    Console.WriteLine(responese);
}

/*
今日國際上有哪些重要的事?
今日國際上的重要新聞包括:

1. **以色列對哈馬斯的空襲**:以色列在南加沙的空襲造成51人死亡,此次行動發生在以色列對黎巴嫩的介入及面臨來自伊朗的導彈攻擊後。

2. **伊朗的導彈攻擊**:伊朗發射了超過180枚彈道導彈襲擊以色列,以色列對此表示可能會有後果。

3. **墨西哥誕生首位女性總統**:新的總統在就職演說中承諾將專注於改善健康和教育。

4. **印尼和中國的經濟關注**:習近平擔心經濟狀況的同時,民眾對未來的看法有了新的研究和調查。

5. **美國東南部颶風海倫造成的傷亡**:颶風造成超過160人死亡,拜登總統和哈里斯副總統計劃在星期三訪問受災州。

6. **蘇丹軍隊堅持戰鬥**:在外部和平努力的背景下,蘇丹軍隊已表明他們將繼續戰鬥。

7. **北韓的叛逃者事件**:一名叛逃者試圖駕駛被偷的巴士返回北韓,已被南韓警方拘留。

8. **至少61人在吉布地遇難**:兩艘船在吉布地海岸附近沉沒,造成多條人命喪失。

這些事件顯示了當前國際局勢的緊張與不穩定。

*/

結語

透過使用 Semantic Kernel,展現 Multi AI Agent 的應用,想像一下你有個目標要完成,然後有多個 AI Agent 可以共同合作幫你把這件事情給做完,如果這樣的 AI Agent 的實現愈來愈多,也就形成了一種人與 AI 的協同合作,人類是不是輕鬆很多。


上一篇
AI Agent:基於 Semantic Kernel 的辦公室 AI Agent 應用
下一篇
AI Agent:多次輪回的 AI Agents 協同合作
系列文
Semantic Kernel 的魔力-用.NET探索生成式應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言