在人工智能快速发展的今天,如何将AI技术与实际应用场景无缝融合,已成为开发者的热门话题。本文将详细介绍如何使用 Microsoft Semantic Kernel 构建一个智能、高效的天气查询应用,让开发者了解如何利用 AI 赋能传统应用。
Semantic Kernel(语义内核)是微软推出的一个开源 SDK,它允许开发者轻松地将大语言模型(LLM)与传统编程方法结合。通过插件机制,开发者可以让 AI 调用 .NET 代码中的方法,实现更智能的交互。
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)
{
// 实现多日天气预报逻辑
// ...
}
}
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");
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;
}
}

通过 [KernelFunction] 和 [Description] 特性,我们可以:
Microsoft Semantic Kernel 为开发者提供了一个强大的平台,让 AI 与传统应用的集成变得前所未有的简单。通过本文的实践,相信读者能够快速掌握 AI 赋能应用的关键技术。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!