Semantic Kernel 快速入门
文章目录
- Semantic Kernel 快速入门
- 一、什么是 Semantic Kernel?
- 1.1 核心特性
- 二、安装和配置
- 2.1 安装 .NET SDK
- 2.2 创建新的 .NET 项目
- 2.3 安装 Semantic Kernel
- 三、快速入门
- 3.1 导入依赖包
- 3.2 添加 AI 服务
- 3.3 添加企业服务
- 3.4 生成内核并检索服务
- 3.5 添加插件
- 创建本机插件
- 3.6 将插件添加到内核
- 3.7 规划
- 3.8 调用
- 3.9 完整代码如下
- 四、运行示例
- 五、总结
Semantic Kernel 快速入门
Semantic Kernel 是微软推出的一款强大的 AI 开发工具,旨在简化人工智能在应用中的集成和管理。本技术博客将基于微软官方文档,为你详细解读如何使用 Semantic Kernel,并通过 C# 语言进行快速入门。
一、什么是 Semantic Kernel?
Semantic Kernel 是一款开放源代码工具,允许开发人员在应用程序中无缝集成和管理人工智能。它提供了一种统一的方式来处理各种 AI 模型,无论是大型语言模型、图像生成器还是其他类型的人工智能。
1.1 核心特性
- 多模型支持:Semantic Kernel 支持多种 AI 模型,包括大型语言模型(LLM)、图像生成器等。
- 统一接口:提供统一的 API 接口,简化了不同模型的调用和管理。
- 上下文管理:支持上下文的持久化和共享,使得 AI 模型能够更好地理解和处理用户请求。
- 扩展性:允许开发人员自定义和扩展功能,以满足特定需求。
二、安装和配置
在开始使用 Semantic Kernel 之前,需要确保已经安装了必要的依赖项并正确配置了开发环境。
2.1 安装 .NET SDK
Semantic Kernel 是基于 .NET 构建的,因此需要先安装 .NET SDK。你可以从 .NET 官方网站 下载并安装最新版本的 .NET SDK。
2.2 创建新的 .NET 项目
使用以下命令创建一个新的 .NET 控制台应用程序:
dotnet new console -o semantic-kernel-demo
cd semantic-kernel-demo
2.3 安装 Semantic Kernel
在项目目录中,使用以下命令安装 Semantic Kernel 和 OpenAI 库:
dotnet add package Microsoft.SemanticKernel
dotnet add package OpenAI
三、快速入门
以下是一个简单的示例,展示了如何使用 Semantic Kernel 调用 智谱AI 的 glm4-flash(可免费调用) 模型来回答问题。我们将通过演练步骤 1、2、3、4、6、9 和 10 来演示快速入门示例。 构建由 AI 服务提供支持且可以运行代码的简单代理所需的一切。
- 导入依赖包
- 添加 AI 服务
- 企业组件
- 生成内核
- 添加内存(本次演示跳过)
- 添加插件
- 创建内核参数(本次演示跳过)
- 创建提示(本次演示跳过)
- 规划
- Invoke
3.1 导入依赖包
对于此示例,我们首先导入以下包:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
3.2 添加 AI 服务
向内核生成器添加了 OpenAI 聊天完成服务。
var modelId = "glm-4-flash";
var endpoint = "https://open.bigmodel.cn/api/paas/v4";
var apiKey = "YOUR_API_KEY";
// 注:https://bigmodel.cn/dev/howuse/glm-4 访问智谱官网进行apikey创建
// 创建一个OpenAI聊天完成的内核
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, new Uri(endpoint),apiKey);
3.3 添加企业服务
使用语义内核的主要优点之一是它支持企业级服务。 在此示例中,我们已将日志记录服务添加到内核,以帮助调试 AI 代理。
builder.Services.AddLogging(services => services.AddConsole().SetMinimumLevel(LogLevel.Trace));
3.4 生成内核并检索服务
添加服务后,我们生成内核并检索聊天完成服务供以后使用。
Kernel kernel = builder.Build();// 创建检索聊天完成服务
var chatCompletionService = kernel.Services.GetRequiredService<IChatCompletionService>();
3.5 添加插件
添加服务后,我们生成内核并检索聊天完成服务供以后使用。借助插件,AI 代理可以运行代码,从外部源检索信息或执行操作。 在示例中,我们添加了一个插件,允许 AI 代理与灯泡交互。 下面,我们将演示如何创建此插件。
创建本机插件
下面可以看到,创建本机插件与创建新类一样简单。
在此示例中,我们创建了一个可以操作灯泡的插件。 虽然这是一个简单的示例,但此插件快速演示了如何支持这两者…
- 通过向 AI 代理提供灯泡的状态来检索扩充生成(RAG)
- 通过 允许 AI 代理打开或关闭灯泡,任务自动化 。
在自己的代码中,可以创建与任何外部服务或 API 交互的插件,以实现类似的结果。
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.SemanticKernel;public class LightsPlugin
{// Mock data for the lightsprivate readonly List<LightModel> lights = new(){new LightModel { Id = 1, Name = "Table Lamp", IsOn = false },new LightModel { Id = 2, Name = "Porch light", IsOn = false },new LightModel { 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 lights;}[KernelFunction("change_state")][Description("Changes the state of the light")]public async Task<LightModel?> ChangeStateAsync(int id, bool isOn){var light = lights.FirstOrDefault(light => light.Id == id);if (light == null){return null;}// Update the light with the new statelight.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; }
}
3.6 将插件添加到内核
创建插件后,可以将其添加到内核,以便 AI 代理可以访问它。 在本示例中,我们已将 LightsPlugin 类添加到内核。
// 将插件添加到内核
kernel.Plugins.AddFromType<LightsPlugin>("Lights");
3.7 规划
语义内核利用 函数调用(大多数 LLM能力)来提供 规划。 使用函数调用,LLM 可以请求(或调用)特定函数以满足用户的请求。 然后,语义内核将请求封送至代码库中的相应函数,并将结果返回给 LLM,以便 AI 代理可以生成最终响应。
若要启用自动函数调用,首先需要创建适当的执行设置,以便语义内核知道在 AI 代理请求函数时自动调用内核中的函数。
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
3.8 调用
最后,通过使用插件调用 AI 代理。 示例代码演示如何生成非流式处理响应,但也可以使用该方法生成流式处理响应GetStreamingChatMessageContentAsync。
3.9 完整代码如下
/// <summary>/// 快速入门/// </summary>public class QuickStart{/// <summary>// 执行完成服务/// </summary>public async Task Start(){var modelConfig = Global.CurModelContext("glm-4-flash");// 1. 填充OpenAI格式LLM调用参数值var modelId = modelConfig.Model;var endpoint = modelConfig.EndpointKey;var apiKey = modelConfig.ApiKey;// 2. 创建一个OpenAI聊天完成的内核var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, new Uri(endpoint),apiKey);// 3.添加企业组件builder.Services.AddLogging(services => services.AddConsole().SetMinimumLevel(LogLevel.Trace));// 4.构建内核Kernel kernel = builder.Build();var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();// 5.添加一个插件(LightsPlugin类定义如下)kernel.Plugins.AddFromType<LightsPlugin>("Lights");// 6.开启规划OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new(){FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()};// 7.创建一个历史记录存储对话var history = new ChatHistory();// 8.发起一次多轮对话聊天服务string? userInput;do{// 9.收集用户输入Console.Write("User > ");userInput = Console.ReadLine();// 10.添加用户输入history.AddUserMessage(userInput);// 11.获得AI的响应var result = await chatCompletionService.GetChatMessageContentAsync(history,executionSettings: openAIPromptExecutionSettings,kernel: kernel);// 12.输出结果Console.WriteLine("Assistant > " + result);// 13.将消息添加到聊天记录history.AddMessage(result.Role, result.Content ?? string.Empty);} while (userInput is not null);}}/// <summary>/// 定义灯泡插件/// </summary>public class LightsPlugin{// Mock data for the lightsprivate readonly List<LightModel> lights = new()
{new LightModel { Id = 1, Name = "Table Lamp", IsOn = false },new LightModel { Id = 2, Name = "Porch light", IsOn = false },new LightModel { 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 lights;}[KernelFunction("change_state")][Description("Changes the state of the light")]public async Task<LightModel?> ChangeStateAsync(int id, bool isOn){var light = lights.FirstOrDefault(light => light.Id == id);if (light == null){return null;}// Update the light with the new statelight.IsOn = isOn;return light;}}/// <summary>/// 定义灯泡模型/// </summary>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; }}
四、运行示例
- 将
YOUR_API_KEY
替换为你实际的 API 密钥。 - 在项目目录中运行以下命令:
QuickStart quickStart = new QuickStart();
await quickStart.Start();
如下:可使用原生模型能力和调用对应灯泡插件
五、总结
Semantic Kernel 是一款强大的工具,它简化了 AI 在应用中的集成和管理。通过本指南,你已经了解了如何安装和配置 Semantic Kernel,以及如何使用它来调用 AI 模型。希望这些内容对你有所帮助!