用. NET 驅動 AI Agent 到 MCP 實踐
本次工作坊以 Semantic Kernel 實作AI Agent以及MCP,程式語言採用 C#,工作坊專案:https://github.com/iangithub/hwdhol2025
認識 Semantic Kernel
Semantic Kernel(簡稱 SK)是微軟開源的一套 AI 原生應用開發框架,發展目的在於協助開發者將大型語言模型(LLM)與既有的軟體系統、業務流程、外部服務整合起來,建構出「可落地」的 LLM 智慧應用。
這個框架的誕生源於一個重要的技術需求:當企業想要利用 AI 的強大能力時,往往面臨如何將 AI 模型與既有的商業邏輯、資料庫、API 服務等傳統程式碼銜接整合的挑戰。因此 Semantic Kernel 提供了一個標準化的架構,讓 AI 模型能夠像呼叫函式一樣被程式呼叫,同時也能讓 AI 主動呼叫外部的函式和工具,實現真正的「AI 協調編排」(AI Orchestration)。目前支援C#、Python、Java,並且包含 LLM 應用所需要的記憶體管理、Tools系統、提示詞等功能,讓開發者不需要從零開始建構這些基礎設施。
簡單來說,Semantic Kernel 的發展目的就是成為連接「AI 大腦」與「應用程式世界」的橋樑,讓企業能夠快速將 AI 能力融入日常的軟體系統中,加速 AI 應用的落地實踐。
Semantic Kernel 核心組件
想像一下,你在組裝一台電腦。有主機板、CPU、記憶體、硬碟等零件,每個都有自己的功能,但只有當它們正確組合在一起時,才能變成一台能用的電腦。Semantic Kernel 也是這樣,它由幾個核心元件組成,每個都扮演著不可或缺的角色。
🧠Kernel(大腦中樞)
Kernel
是整個 Semantic Kernel 的「大腦中樞」,負責協調所有元件的運作。可以把它想像成一個「智慧調度中心」,管理要連接哪個 LLM Model、要呼叫哪些Plugins、要註冊哪些服務,所有的 AI 互動都會經過 Kernel 來處理和分配。🧰 Plugins(Function Calling)
Plugins
是 Semantic Kernel 用來擴充 LLM 功能的關鍵機制,對應到 OpenAI Function Calling 的概念,開發者可以把任意的 C# 或 Python 函式包裝成 Plugin,註冊進 Kernel,讓 LLM 能夠「自行決定何時呼叫這些函式」,達成指令式自動化的效果,例如,當使用者問「今天天氣如何?」,AI 可以自動呼叫天氣查詢插件來取得即時資料。🔌 LLM Model Connector(模型連接器) Semantic Kernel 支援連接多種 LLM 服務包含雲端平台以及地端部署,因此它設計了抽象的 Model Connector 介面,讓開發者能夠自由接上不同來源的模型,例如:OpenAI / Azure OpenAI、Ollama、Hugging Face、Google Gemini…
📝 Memory(記憶模組)
Memory
是 Semantic Kernel 讓 AI 具備「記憶」能力,包含可以儲存和檢索對話歷史、上下文資訊、知識庫內容等,並且支援向量資料庫(Vector Database)來實現語意搜尋,能夠根據語意相似度而非關鍵字來找相關資訊。
初體驗 Semantic Kernel
建立一個連接 LLM 的生成式應用,並掛載 Plugin
,模擬天氣資訊回應助手。目標熟識 SK 基本元素使用方式。
前置作業,安裝必要套件
dotnet add package "Microsoft.SemanticKernel
dotnet add package "Microsoft.SemanticKernel.Agents.Core
dotnet add package Microsoft.SemanticKernel.Connectors.Google --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Ollama --prerelease
建立
Kernel
,並設定自動調用 function calling
// ============ use OpenAI ===========
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
apiKey: Config.OpenAI_ApiKey,
modelId: Config.ModelId)
.Build();
// Configure the execution settings to enable automatic function calling
OpenAIPromptExecutionSettings executionSettings =
new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
// ======== use Google AI Gemini ========
Kernel kernel = Kernel.CreateBuilder()
.AddGoogleAIGeminiChatCompletion(
apiKey: Config.GoogleAI_ApiKey,
modelId: Config.GoogleAI_ModelId)
.Build();
// Configure the execution settings to enable automatic function calling
GeminiPromptExecutionSettings executionSettings =
new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
建立
Plugin
WeatherServicePlugin,模擬取得天氣資訊
public class WeatherServicePlugin
{
private static readonly Dictionary<string, string> CityWeatherInfo = new Dictionary<string, string>
{
{ "Taipei", "溫度 28°C,多雲,濕度 75%,風速 15 km/h" },
{ "Kaohsiung", "溫度 31°C,晴天,濕度 70%,風速 12 km/h" },
{ "Taichung", "溫度 27°C,陰天,濕度 80%,風速 10 km/h" },
{ "Tainan", "溫度 30°C,晴時多雲,濕度 68%,風速 18 km/h" },
{ "Hsinchu", "溫度 26°C,多雲時陰,濕度 78%,風速 22 km/h" },
{ "Chiayi", "溫度 29°C,晴天,濕度 72%,風速 14 km/h" },
{ "Pingtung", "溫度 32°C,晴天,濕度 65%,風速 16 km/h" },
{ "Taitung", "溫度 30°C,晴時多雲,濕度 73%,風速 20 km/h" },
{ "Nantou", "溫度 25°C,陰天,濕度 85%,風速 8 km/h" },
{ "Changhua", "溫度 28°C,多雲,濕度 76%,風速 13 km/h" },
{ "Penghu", "溫度 27°C,多雲時晴,濕度 82%,風速 25 km/h" },
{ "Taoyuan", "溫度 27°C,多雲,濕度 77%,風速 14 km/h" },
{ "NewTaipei", "溫度 28°C,多雲時陰,濕度 74%,風速 16 km/h" }
};
[KernelFunction]
[Description("Retrieves the today weather information of the city.")]
public async Task<string> Get_Today_Temperature(
[Description("The name of the city to get the temperature for.The city names in the weather data are in English")]
string city)
{
// 模擬非同步操作,例如從 API 獲取天氣資料
await Task.Delay(500); // 模擬 500ms 的網路延遲
if (CityWeatherInfo.TryGetValue(city, out string? weatherInfo))
{
return weatherInfo;
}
// 模擬未知城市的天氣
return "查不到資料";
}
}
Kernel
掛載Plugin
WeatherServicePlugin
// add weather plugin
kernel.Plugins.AddFromType<WeatherServicePlugin>();
建立短期記憶對話記錄,並呼叫
AddSystemMessage
加入 System Prompt
var chatHistory = new ChatHistory();
chatHistory.AddSystemMessage(
"""
你是一個專業的天氣服務助手。你可以:
1. 查詢台灣各城市的當日溫度
2. 提供天氣相關的建議
3. 回答天氣相關問題
請使用可用的工具來獲取準確的天氣資訊。
嚴禁虛構的天氣數據。
"""
);
從
Kernel
取得聊天完成ChatCompletionService
服務
// Get the chat completion service
var chatCompletion = kernel.GetRequiredService<IChatCompletionService>();
以串流方式
Streaming
獲取 AI 回應方式開始對話
Console.WriteLine("=== 天氣服務助手 ===");
Console.WriteLine("您好!我是您的天氣助手,可以幫您查詢台灣各城市的天氣資訊。");
Console.WriteLine("輸入 'exit' 結束對話。");
Console.WriteLine();
// 開始聊天對話
Console.Write("您 > ");
string? userInput;
while ((userInput = Console.ReadLine()) is not null)
{
if (string.IsNullOrWhiteSpace(userInput) || userInput.Equals("exit", StringComparison.OrdinalIgnoreCase))
break;
// 加入使用者訊息到對話歷史
chatHistory.AddUserMessage(userInput);
// 以串流方式獲取 AI 回應
var result = chatCompletion.GetStreamingChatMessageContentsAsync(
chatHistory,
executionSettings,
kernel);
// Stream the results
string fullMessage = "";
var first = true;
await foreach (var content in result)
{
if (content.Role.HasValue && first)
{
Console.Write("天氣助手 > ");
first = false;
}
Console.Write(content.Content);
fullMessage += content.Content;
}
Console.WriteLine();
// 加入 AI 回應到對話歷史
chatHistory.AddAssistantMessage(fullMessage);
// Get user input again
Console.Write("您 > ");
}
Console.WriteLine("\n謝謝您的使用,祝您有個美好的一天!");
}
Sequential Agent
Sequential Agent,也稱為 Sequential Orchestration(順序編排),是 Semantic Kernel 中一種 AI 工作流程編排模式。運作模式就是讓多個 Agent 依照「既定的順序」依序執行,就像生產線一樣,前一個 Agent 的輸出會成為下一個 Agent 的輸入,每個 Sub Agent 都專注於一個明確的任務,像模組化的工人,最終產出完整結果。
實際應用場景
文章生成流程: Agent 1:根據主題生成大綱 Agent 2:根據大綱撰寫內容 Agent 3:檢查文法和潤飾 Agent 4:生成摘要和關鍵字
客戶服務處理: Agent 1:分析客戶問題類型 Agent 2:查詢相關知識庫 Agent 3:生成回覆內容 Agent 4:檢查回覆的專業性和禮貌性
輿情分析系統: Agent 1:透過 RSS 抓取當天的文章資料 Agent 2:移除雜訊、清理 HTML、正規化文字 Agent 3:分析關鍵字與同義詞,統整熱門討論主題 Agent 4:整理結果並輸出成每日排行榜報告
Sequential Agent Lab
Lab場景:多代理人協同審查文件內容,確保符合人資政策、資訊安全與合規要求,原始碼請參考 github(Agents/SequentialOrchestrationAgent.cs)。
前置作業,安裝必要套件
dotnet add package Microsoft.SemanticKernel.Agents.Orchestration --prerelease
dotnet add package Microsoft.SemanticKernel.Agents.Runtime.InProcess --prerelease
專案檔加入忽略警告訊息設定
<NoWarn>$(NoWarn);CS8618,IDE0009,IDE1006,CA1051,CA1050,CA1707,CA1054,CA2007,VSTHRD111,CS1591,RCS1110,RCS1243,CA5394,SKEXP0001,SKEXP0010,SKEXP0020,SKEXP0040,SKEXP0050,SKEXP0060,SKEXP0070,SKEXP0101,SKEXP0110,OPENAI001,CA1724,IDE1006,IDE0009,MEVD9000</NoWarn>
Handoff Agent
Handoff Orchestration(移交式協作),顧名思義就是多個 Agent 之間透過「主導權的轉移(Handoff)」來完成一個任務,與 Sequential 不同的是,Handoff 並不是一開始就設定好固定順序,而是讓 Agent 之間在對話或任務執行過程中,根據「情境判斷」來決定下一步該由哪個 Agent 接手。
實際應用場景
企業內部多部門諮詢系統: HR Agent:負責人事相關諮詢(例如請假、福利、考勤) IT Agent:負責系統登入、VPN、設備問題 Finance Agent:負責費用報支、帳款、薪資等
Handoff Agent Lab
Lab場景:企業內部辦公室助理,對使用者的提問進行分類的企業 Support Agent,任務是判斷使用者問題屬於哪一類:人資(HR)、IT、或合規(Compliance),原始碼請參考 github(Agents/HandoffOrchestrationAgent.cs)。
Concurrent Agent
Concurrent Orchestration(並行協作) 是指在一個任務中,讓多個 Agent 同時(並行)工作,並在最後再把它們的結果整合起來,而不是像 Sequential 那樣一個接一個執行,對於縮短總處理時間的場景非常有用,但前題是這幾個並行工作的 sub-agent 彼此間並沒有關聯性。
實際應用場景
多語言內容生成,同時完成:一次性生成所有語言版本 Agent 1:翻譯成英文 Agent 2:翻譯成日文 Agent 3:翻譯成西班牙文 Agent 4:翻譯成法文
Concurrent Agent Lab
Lab場景:產品說明書多語言版本生成,原始碼請參考 github(Agents/ConcurrentOrchestrationAgent.cs)。
認識 MCP
Model Context Protocol(模型上下文協議)是 Anthropic 於 2024 年推出的開放標準協議,其發展目的是為了解決一個關鍵問題:如何讓 AI 模型安全、標準化的連接到各種資料源、工具和服務。 在 MCP 出現之前,每個 AI 應用都需要為不同的資料源(如資料庫、API、檔案系統)客製化整合方案,增加重複開發工作和維護成本。MCP 的誕生就是為了建立一個統一的通訊標準,讓 AI 模型能夠透過標準化的方式存取外部資源,簡單來說就是AI系統間的 WEB API。
三大核心組件
MCP Host(主機) AI 應用程式本身,如 Claude Desktop、IDE、你的LLM應用,負責初始化連接和協調整體流程
MCP Client(客戶端) Client 是 MCP 架構的「消費端」,在 Host 中運行,維護與 MCP Server 的連接,處理協議層的通訊細節
MCP Server(伺服器) Server 是 MCP 架構的「供應端」,負責**暴露工具(Tools / Capabilities)與上下文(Context)**給其他 Agent 或用戶端使用,每個 Server 可以暴露多種能力。
兩大通訊方式
stdio(標準輸入輸出) Standard Input/Output,這種方式透過程序的標準輸入和輸出串流來傳遞訊息,MCP Client 會啟動一個 MCP Server 程序,然後透過 stdin(標準輸入)發送請求,並從 stdout(標準輸出)接收回應。簡單來說,,就是在Client本機跑一個 MCP Server 的程序。
Streamable HTTP(取代了 SSE) 透過單一 HTTP 連接實現雙向訊息傳遞,這種方式是基於Http的通訊方式,支援雙向互動,所以會需要有一個連接的端點。
Lab 前置作業
安裝MCP官方.NET套件,Client及Server都需要
dotnet add package ModelContextProtocol --prerelease
Agent 連接基於 stdio 的 MCP Server
Lab情境會建立一個主控台應用,採用Self-Host運行在本機,接著在AI Agent的應用使用 stdio 方式來連接 MCP Server,取得工具給 AI Agent 使用。原始碼請參考 github(Agents/AgentWithStdioMcp.cs),MCP Server原始碼請參考 github(McpServer/mymcpserver 專案)。
Agent 連接基於 Streamable HTTP 的MCP Server
Lab情境會建立一個 Web 應用,採用 Streamable HTTP 運行Web應用並暴露連接端點,接著在AI Agent的應用使用 HTTP 方式來連接 MCP Server,取得工具給 AI Agent 使用。原始碼請參考 github(Agents/AgentWithHttpMcp.cs),MCP Server原始碼請參考 github(McpServer/McpWebOrderServer 專案)。測試時必須同時啟用 McpWebOrderServer 以實現遠端MCP Server連結。
Last updated