AI與.NET技術實操系列(四):使用 Semantic Kernel 和 DeepSeek 構建AI應用
引言
在人工智能技術飛速發展的今天,大型語言模型(Large Language Models, LLMs)已成為智能應用開發的核心驅動力。從智能客服到自動化內容生成,LLMs的應用正在深刻改變我們的工作和生活方式。
對于.NET開發者而言,掌握如何將LLMs集成到應用程序中,不僅是一項技術挑戰,更是抓住未來趨勢的關鍵。微軟推出的Semantic Kernel(SK)為此提供了一個強大的工具,它使開發者能夠在.NET環境中輕松構建基于LLMs的智能應用,大幅降低了開發門檻。
Semantic Kernel是一個開源項目,旨在為開發者提供一套靈活且功能豐富的API,以簡化LLMs的集成和使用。通過SK,開發者可以快速實現智能對話、內容生成、知識檢索等功能,而無需深入研究LLMs的底層實現。SK采用“插件化”和“模塊化”的設計理念,允許開發者根據需求自由組合和擴展功能,打造高度定制化的AI應用。這種設計不僅提高了開發效率,還為創新提供了廣闊的空間。
然而,SK的強大功能也伴隨著一定的復雜性。開發者需要理解其核心概念(如“內核”、“技能”和“插件”),并掌握模型選擇、性能優化和資源管理等技術細節。這些都需要一定的AI和.NET開發經驗。
本文將通過一個具體的實踐任務——構建一個智能助手,展示如何使用Semantic Kernel在.NET中開發AI應用。這個任務貼近實際業務需求,能夠幫助讀者深入理解SK的使用方法和設計哲學。我們將從SK的基礎知識入手,逐步介紹其安裝、配置和基本用法,并通過詳細的代碼示例,引導讀者完成一個功能完備的智能助手應用。
希望本文能激發你的興趣,幫助你在.NET中開啟Semantic Kernel的探索之旅。隨著AI技術的不斷進步,SK將為開發者帶來更多創新機會,讓我們共同迎接智能應用的新時代!
Semantic Kernel簡介
在深入探討Semantic Kernel(SK)之前,我們先來了解它是什么以及它在AI應用開發中的作用。Semantic Kernel是微軟開發的一個開源項目,旨在幫助開發者構建基于大型語言模型的智能應用程序。它提供了一套工具和API,使開發者能夠輕松地將LLMs集成到.NET應用中,實現智能對話、內容生成和知識檢索等功能。
什么是Semantic Kernel?
Semantic Kernel(SK)是一個輕量級的軟件開發工具包(SDK),允許開發者通過.NET平臺與LLMs進行交互。它的核心設計理念是“插件化”和“模塊化”,使開發者能夠根據需求靈活組合和擴展功能。SK通過以下關鍵組件實現其功能:
-
內核(Kernel):SK的核心組件,負責管理LLMs的調用、內存管理和技能的注冊。它如同一個指揮中心,協調所有操作。 -
技能(Skills):一組預定義的功能模塊,可以是原生的.NET代碼,也可以是基于LLMs的提示(prompt)。技能是SK功能的具體實現單元。 -
插件(Plugins):技能的集合,可以作為一個整體注冊到內核中,便于管理和復用。
通過這種設計,SK提供了一個靈活且可擴展的框架,使開發者能夠快速構建復雜的AI應用。無論是簡單的文本生成還是復雜的多輪對話系統,SK都能提供支持。
Semantic Kernel的優勢
與直接調用LLMs的API相比,SK具有以下顯著優勢:
-
簡化的API:SK封裝了LLMs的復雜性,提供直觀易用的接口,降低了開發難度。 -
插件化架構:開發者可以輕松添加、移除和組合技能,構建高度定制化的應用。 -
內存管理:SK內置了對上下文的管理功能,支持在對話中維護歷史信息,提升交互的連貫性。 -
多模型支持:SK不僅兼容OpenAI的模型,還支持Azure OpenAI、Hugging Face等其他LLMs提供商的模型,具有良好的擴展性。
這些優勢使SK成為.NET開發者構建AI應用的理想選擇。無論你是初學者還是經驗豐富的開發者,SK都能幫助你快速上手并實現創意。
設置和使用Semantic Kernel
在開始使用Semantic Kernel之前,我們需要進行一些準備工作,包括安裝SK的NuGet包和配置開發環境。
安裝Semantic Kernel
SK可以通過NuGet包管理器安裝。以下是安裝SK核心包的命令:
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.ChatCompletion
如果需要使用OpenAI的模型,還需安裝相關的連接器包:
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
這些包提供了SK的核心功能和與特定LLMs提供商交互的能力。
配置開發環境
SK支持.NET 6.0及以上版本,建議使用Visual Studio 2022或Visual Studio Code進行開發。以下是配置開發環境的步驟:
-
打開Visual Studio,創建一個新的.NET 控制臺應用程序。 -
在解決方案資源管理器中,右鍵點擊項目,選擇“管理NuGet包”。 -
搜索“Microsoft.SemanticKernel”,安裝最新版本。 -
在代碼文件中添加必要的using指令:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
完成這些步驟后,你的開發環境就已準備好,可以開始使用SK進行AI應用開發。
基本用法
在使用SK之前,我們需要初始化內核并配置LLMs的連接。以下是一個基本的配置示例:
var modelId = "";
var apiKey = "";
// Create a kernel with OpenAI chat completion
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, apiKey);
// Build the kernel
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
在這個示例中,如果使用的是OpenAI的GPT系列模型,你需要將"your-api-key"替換為你的OpenAI API密鑰。如果使用其他模型(如Azure OpenAI),只需調整配置參數即可。
配置好內核后,我們可以通過SK調用LLMs生成文本。以下是一個簡單的文本生成示例:
// Create a history store the conversation
var history = new ChatHistory();
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
在這個示例中,我們直接將history傳遞給內核,SK會自動處理與LLMs的通信并返回生成的內容。這是最基本的用法,展示了SK的簡潔性和易用性。
構建一個基于LLMs的智能應用
為了更好地理解Semantic Kernel的實際應用,我們將通過一個實踐任務——構建一個智能助手,展示如何使用SK開發AI應用。這個智能助手能夠回答用戶的問題,并通過對話歷史維護上下文,提供連貫的交互體驗。
設計智能助手
在設計智能助手時,我們需要考慮以下幾個方面:
-
用戶輸入:從控制臺獲取用戶的問題或指令。 -
LLMs響應:使用SK調用LLMs生成回答。 -
對話管理:維護對話歷史,確保回答與上下文相關。 -
技能擴展:為助手添加自定義功能,如查詢天氣或獲取外部數據。
在這個示例中,我們將實現一個基礎版的智能助手,隨后展示如何通過技能擴展其功能。
實現智能助手
由于我的ChatGpt訂閱已經過期,所以接下來應用所接入的大模型換成了DeepSeek,由于DeepSeek API 與 OpenAI 的ChatCompletion的 API 格式兼容,因此我們將復用 OpenAI 連接器,里面的代碼只是做了一些微調。
-
不用設置OpenAPI的模型和API Key -
IChatCompletionService的獲取方式發生了變化,不再從DI Container中獲取,而是直接創建對象,有興趣的朋友,可以把基于DeepSeek的IChatCompletionService對象注入到DI Container中,這樣也顯得專業,但這里就不做擴展了。
this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat", new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");
以下是智能助手的完整代碼實現:
class SmartAssistant
{
private readonly IChatCompletionService _chatCompletionService;
private readonly List<string> _conversationHistory = [];
private readonly Kernel _kernel;
public SmartAssistant()
{
// Create a kernel with OpenAI chat completion
IKernelBuilder builder = Kernel.CreateBuilder();
this._kernel = builder.Build();
this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat", new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");
}
public async Task RunAsync()
{
Console.WriteLine("歡迎使用智能助手!輸入 'exit' 退出。");
// Add a plugin (the LightsPlugin class is defined below)
//使用插件可以讓你的人工智能代理能夠運行你的代碼以從外部來源檢索信息或執行操作
this._kernel.Plugins.AddFromType<LightsPlugin>("Lights");
// Enable planning
OpenAIPromptExecutionSettings openAiPromptExecutionSettings = new()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
// Create a history store the conversation
ChatHistory history = [];
// Initiate a back-and-forth chat
string? userInput;
do
{
// Collect user input
Console.Write("User > ");
userInput = Console.ReadLine();
// Add user input
history.AddUserMessage(userInput);
// Get the response from the AI
ChatMessageContent result = await this._chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAiPromptExecutionSettings,
kernel: this._kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null);
}
}
//使用插件可以讓你的人工智能代理能夠運行你的代碼以從外部來源檢索信息或執行操作。
public class LightsPlugin
{
// Mock data for the lights
private readonly List<LightModel> _lights =
[
new() { Id = 1, Name = "Table Lamp", IsOn = false },
new() { Id = 2, Name = "Porch light", IsOn = false },
new() { Id = 3, Name = "Chandelier", IsOn = true }
];
[KernelFunction("get_lights")]
[Description("Gets a list of lights and their current state")]
public async Task<List<LightModel>> GetLightsAsync()
{
return this._lights;
}
[KernelFunction("change_state")]
[Description("Changes the state of the light")]
public async Task<LightModel?> ChangeStateAsync(int id, bool isOn)
{
LightModel? light = this._lights.FirstOrDefault(light => light.Id == id);
if (light == null)
{
return null;
}
// Update the light with the new state
light.IsOn = isOn;
return light;
}
}
public class LightModel
{
[JsonPropertyName("id")] public int Id { get; set; }
[JsonPropertyName("name")] public string Name { get; set; }
[JsonPropertyName("is_on")] public bool? IsOn { get; set; }
}
//運行
var assistant = new SmartAssistant();
await assistant.RunAsync();
代碼解析:
-
SmartAssistant類:封裝智能助手的邏輯,使用 ChatHistory存儲對話歷史。 -
構造方法:初始化SK內核,創建DeepSeek的IChatCompletionService對象。 -
RunAsync方法:主方法,負責接收用戶輸入、構造提示、調用LLMs并輸出回答。 -
ChatHistory和OpenAiPromptExecutionSettings構造:將對話歷史拼接為完整的提示,確保上下文傳遞給LLMs。 -
內核調用:通過 DeepSeek的IChatCompletionService.GetChatMessageContentAsync調用LLMs,獲取生成的回答。
運行這段代碼后,用戶可以與智能助手進行多輪對話。例如:

這個智能助手展示了SK在對話管理方面的能力,開發者可以基于此進一步擴展功能。
Semantic Kernel在實際應用中的意義和挑戰
Semantic Kernel為開發者提供了強大的工具,使他們能夠快速構建基于LLMs的智能應用。然而,其應用價值和潛在挑戰同樣值得關注。
意義
-
加速開發:SK簡化了LLMs的集成過程,使開發者能夠專注于應用邏輯而非底層細節。 -
靈活性:插件化架構支持功能的自由擴展,適應多樣化的業務需求。 -
提升體驗:基于LLMs的智能應用能提供自然流暢的交互,顯著改善用戶體驗。
例如,一個基于SK的智能客服系統可以在幾小時內搭建完成,并根據企業需求快速調整功能,這種效率在傳統開發中難以想象。
挑戰
-
模型選擇:不同的LLMs在性能、成本和適用場景上存在差異。開發者需要權衡這些因素,選擇合適的模型。 -
性能優化:LLMs的調用涉及網絡延遲和計算資源消耗,尤其在高并發場景下,需要優化架構以確保響應速度。 -
審查機制:LLMs可能生成不準確、有偏見甚至有害的內容,開發者必須實施審查機制,確保應用的安全性和公平性。
這些挑戰要求開發者在技術實現之外,具備系統設計和倫理意識,才能充分發揮SK的潛力。
技術倫理
Semantic Kernel的出現不僅帶來了技術上的便利,更引發了對AI應用深層次問題的思考。
-
技術與責任的平衡:隨著AI能力的增強,開發者在享受技術紅利時,也需承擔確保應用安全、公正的責任。如何避免AI濫用,是一個值得探討的話題。 -
隱私與數據安全:智能應用可能涉及用戶數據的收集和處理,尤其在多輪對話中,開發者必須遵守隱私法規,保護用戶權益。 -
社會的長期影響:AI技術的普及可能改變就業結構、決策方式甚至人際交往,開發者作為技術推動者,需思考如何讓AI為社會帶來正向價值。
這些問題沒有簡單的答案,但它們提醒我們:技術的發展不應只追求效率,更應關注其對人類和社會的影響。
結語
本文通過介紹Semantic Kernel的基礎知識、設置和使用方法,以及構建智能助手的實踐案例,為.NET開發者提供了一個全面而深入的指南。作為微軟的開源項目,SK以其簡潔的API、靈活的架構和強大的功能,為開發者打開了AI應用開發的大門。從基本的文本生成到復雜的技能擴展,SK的設計理念和特性為創新提供了無限可能。
通過本文的示例代碼和討論,希望你能感受到SK的實用性,并從中獲得靈感,嘗試在自己的項目中應用這一技術。隨著AI技術的不斷進步,Semantic Kernel將繼續進化,為開發者帶來更多機遇。讓我們共同探索這一領域,在智能應用的浪潮中創造屬于自己的價值!
參考鏈接:https://learn.microsoft.com/en-us/semantic-kernel/get-started/quick-start-guide?pivots=programming-language-csharp
本文來自博客園,作者:AI·NET極客圈,轉載請注明原文鏈接:http://www.rzrgm.cn/code-daily/p/18757511
歡迎關注我們的公眾號,作為.NET工程師,我們聚焦人工智能技術,探討 AI 的前沿應用與發展趨勢,為你立體呈現人工智能的無限可能,讓我們共同攜手共同進步。

浙公網安備 33010602011771號