「每天都有大量的國際新聞湧現,如何有效率獲取得並理解這些資訊成為挑戰。過去,透過 APP 或網站瀏覽新聞,整理相關資訊往往費時且不便。而如果有一個代理人能幫你收集國際新聞,然後另一個代理人將其翻譯並生成摘要,供你隨時查閱,肯定會節省不少時間。這篇文章將介紹如何基於 Semantic Kernel 開發這樣的 AI Agent 應用,以實現這種自動化的新聞整理與翻譯流程。」
這個 AI Agent 場景的主要能力有:
AI Agent 的工作流程包括2個過程,並且這個工作流程是依順序進行,一旦反著就無法完成目標任務:
事實上這個場景的應用,用1個Agent或2個Agent都可以達成,至於要採取哪一個做法,可以從彈性化的角度去思考,把 Agent 細小化後,透過組合的方式可以產生更多的應用場景,就像應用系統設計一樣,走向 Micro Service,Agent 也可以從類似的角度去思考設計(but 這沒有絕對)。我採取的是用2個Agent來實現這個場景。
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}";
}
}
}
var builder = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(
endpoint: Config.aoai_endpoint,
deploymentName: Config.aoai_deployment,
apiKey: Config.aoai_apiKey);
var kernel = builder.Build();
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);
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 chat = new(newsAgent, translateAgent);
當二個 Agent 的順序是相反時,就會發現它無法提供即時的國際新聞,整個工作流程就無法往下進行
AgentGroupChat chat = new(translateAgent, newsAgent);
/*
今日國際上有哪些重要的事?
抱歉,我無法提供即時的國際新聞情報。你可以查閱新聞網站或應用程序以獲取最新訊息。
*/
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 的協同合作,人類是不是輕鬆很多。