2025-11-20
C#
00

目录

什么是 Semantic Kernel?
项目架构与关键技术
技术选型
核心特性
代码实战:天气查询应用
天气服务插件设计
Semantic Kernel 配置
AI 交互逻辑
完整代码
关键技术解析
函数调用(Function Calling)
结语

在人工智能快速发展的今天,如何将AI技术与实际应用场景无缝融合,已成为开发者的热门话题。本文将详细介绍如何使用 Microsoft Semantic Kernel 构建一个智能、高效的天气查询应用,让开发者了解如何利用 AI 赋能传统应用。

什么是 Semantic Kernel?

Semantic Kernel(语义内核)是微软推出的一个开源 SDK,它允许开发者轻松地将大语言模型(LLM)与传统编程方法结合。通过插件机制,开发者可以让 AI 调用 .NET 代码中的方法,实现更智能的交互。

项目架构与关键技术

技术选型

  • 编程语言:C# 10+
  • 框架:.NET 6/7/8
  • AI 服务:DeepSeek API
  • 核心库:Microsoft.SemanticKernel

核心特性

  1. 函数调用(Function Calling)
  2. 聊天历史管理
  3. 可插拔的服务插件
  4. 灵活的 AI 交互模式

代码实战:天气查询应用

天气服务插件设计

C#
public class WeatherService { [KernelFunction] [Description("获取指定城市的当前天气信息")] public string GetWeather([Description("城市名称")] string city) { // 模拟天气数据存储 var weatherData = new Dictionary<string, string> { { "北京", "晴天,26°C" }, { "上海", "多云,24°C" }, // 更多城市天气数据 }; return weatherData.TryGetValue(city, out var weather) ? $"{city}的当前天气:{weather}" : $"抱歉,没有找到{city}的天气信息"; } [KernelFunction] [Description("获取指定城市未来几天的天气预报")] public string GetWeatherForecast( [Description("城市名称")] string city, [Description("预报天数,1-7之间")] int days = 3) { // 实现多日天气预报逻辑 // ... } }

Semantic Kernel 配置

C#
var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY"), endpoint: new Uri("https://api.deepseek.com/v1") ); var kernel = kernelBuilder.Build(); var weatherService = new WeatherService(); kernel.ImportPluginFromObject(weatherService, "WeatherPlugin");

AI 交互逻辑

C#
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("你是一个专业的天气助手"); var settings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(), MaxTokens = 2048, Temperature = 0.7 }; // 用户查询天气 string userQuery = "请告诉我北京的天气情况"; chatHistory.AddUserMessage(userQuery); var response = await chatCompletionService.GetChatMessageContentAsync( chatHistory, settings, kernel );

完整代码

C#
#pragma warning disable SKEXP0010 using System.ComponentModel; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; namespace AppFunction { class Program { static async Task Main(string[] args) { // 创建安全的Semantic Kernel配置 var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY") ?? "sk-xxxx", endpoint: new Uri("https://api.deepseek.com/v1") ); // 构建内核 var kernel = kernelBuilder.Build(); // 注册天气服务 var weatherService = new WeatherService(); kernel.ImportPluginFromObject(weatherService, "WeatherPlugin"); // 获取聊天完成服务 var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); // 创建聊天历史 var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("你是一个专业的天气助手,擅长解答用户的天气相关问题。"); // 设置函数调用设置 var settings = new OpenAIPromptExecutionSettings { // 只保留一种函数调用行为 FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(), MaxTokens = 2048, Temperature = 0.7 }; // 示例1:直接调用GetWeather方法获取某个城市的当前天气 Console.WriteLine("直接调用GetWeather方法:"); string cityName = "北京"; var currentWeather = weatherService.GetWeather(cityName); Console.WriteLine(currentWeather); // 示例2:通过聊天方式询问天气 Console.WriteLine("\n通过聊天方式询问天气:"); string userQuery = $"请告诉我{cityName}的天气情况"; chatHistory.AddUserMessage(userQuery); // Create kernel arguments var arguments = new KernelArguments(settings) { ["subject"] = userQuery }; // Invoke method with correct parameters var response = await chatCompletionService.GetChatMessageContentAsync( chatHistory, settings, kernel ); Console.WriteLine(response.Content); // 示例3:获取未来天气预报 Console.WriteLine("\n获取未来天气预报:"); int forecastDays = 5; string weatherForecast = weatherService.GetWeatherForecast(cityName, forecastDays); Console.WriteLine(weatherForecast); // 示例4:通过聊天方式询问天气预报 Console.WriteLine("\n通过聊天方式询问天气预报:"); string forecastQuery = $"请告诉我{cityName}未来{forecastDays}天的天气预报"; chatHistory.AddUserMessage(forecastQuery); arguments = new KernelArguments(settings) { ["subject"] = cityName, }; response = await chatCompletionService.GetChatMessageContentAsync( chatHistory, settings, kernel ); Console.WriteLine(response.Content); Console.ReadKey(); } } } // 天气服务类保持不变 public class WeatherService { [KernelFunction] [Description("获取指定城市的当前天气信息")] public string GetWeather([Description("城市名称")] string city) { // 模拟天气数据 var weatherData = new Dictionary<string, string> { { "北京", "晴天,26°C" }, { "上海", "多云,24°C" }, { "广州", "小雨,28°C" }, { "深圳", "晴天,30°C" }, { "杭州", "阴天,22°C" } }; return weatherData.TryGetValue(city, out var weather) ? $"{city}的当前天气:{weather}" : $"抱歉,没有找到{city}的天气信息"; } [KernelFunction] [Description("获取指定城市未来几天的天气预报")] public string GetWeatherForecast( [Description("城市名称")] string city, [Description("预报天数,1-7之间")] int days = 3) { if (days < 1 || days > 7) return "预报天数必须在1-7之间"; // 模拟天气预报数据 var result = $"{city}未来{days}天天气预报:\n"; var random = new Random(); string[] conditions = { "晴天", "多云", "阴天", "小雨", "中雨" }; for (int i = 1; i <= days; i++) { int temp = random.Next(15, 35); string condition = conditions[random.Next(conditions.Length)]; result += $"第{i}天: {condition}{temp}°C\n"; } return result; } }

image.png

关键技术解析

函数调用(Function Calling)

通过 [KernelFunction][Description] 特性,我们可以:

  • 向 AI 模型描述函数的作用
  • 自动生成函数调用文档
  • 实现函数的智能选择和执行

结语

Microsoft Semantic Kernel 为开发者提供了一个强大的平台,让 AI 与传统应用的集成变得前所未有的简单。通过本文的实践,相信读者能够快速掌握 AI 赋能应用的关键技术。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!