.NET AI从0开始入门SemanticKernel:从基础到实践
在当今AI技术飞速发展的时代,如何将强大的AI模型集成到现有的编程项目中,成为了许多开发者关注的焦点。SemanticKernel作为一款轻型开源开发工具包,为我们提供了一个便捷的解决方案。本文将带领大家从0开始,深入了解SemanticKernel,并通过实际示例展示其在C#项目中的应用。
一、SemanticKernel简介
1. 工具包概述
SemanticKernel是一个能够帮助开发者轻松生成AI代理,并将最新AI模型集成到C#、Python或Java代码库中的工具包。它就像一座桥梁,连接了AI模型和传统编程,让我们能够快速交付企业级解决方案。
2. 核心理念
插件(Plugins)架构
SemanticKernel的插件系统是其一大亮点,主要包括语义函数和原生函数。语义函数通过自然语言指令(提示词)定义,由AI模型执行;原生函数则使用传统编程语言编写。这种双重架构使开发者能够根据需求灵活选择,在需要精确控制时使用传统代码,需要创造性和灵活性时借助AI能力。
Memory与Planner
SemanticKernel提供了先进的Memory和Planner组件。SemanticKernelMemory可以让应用存储和检索信息,实现类似长期记忆的功能;Planner则能自动将复杂任务分解为小步骤,并安排执行顺序。
可组合性
SemanticKernel鼓励组件的重用和组合,开发者可以将简单功能组合成复杂工作流,创建可复用的插件库,构建模块化且可扩展的AI应用架构。
3. 实际应用案例
SemanticKernel在多个场景中都有出色的表现,如内容创作助手、个人知识管理、客户服务自动化、数据分析辅助和流程自动化等。这些应用充分展示了其强大的实用价值。
4. 技术优势
与其他AI开发框架相比,SemanticKernel具有语言灵活性(支持C#、Python、Java)、开放生态(与多种LLM提供商兼容)、企业级支持(微软项目)、社区活跃和低入门门槛等优势。
5. 入门指南
要开始使用SemanticKernel,可以按照以下步骤进行:
- 安装SDK:根据所选编程语言安装相应的SemanticKernel SDK。
- 配置AI模型:连接到OpenAI、Azure OpenAI等LLM服务。
- 创建插件:定义语义函数和原生函数。
- 构建工作流:将函数组合成解决特定问题的工作流。
- 集成到应用:将SemanticKernel集成到应用程序中。
二、SemanticKernel入门实践
1. 快速开始第一个示例
获取OpenAI在线API
由于国内访问限制,我们可以使用https://api.token-ai.cn。在该网站注册账号并创建令牌,此令牌将用于代替OpenAI的原有令牌。
创建项目
- 打开
Visual Studio 2022
,创建名为TokenAI
的控制台项目。 - 右键项目,点击
管理 NuGet 程序包
,搜索Semantic Kernel
,选择包括预览版并安装Microsoft.SemanticKernel
。
实现Stream式对话输出
打开Program.cs
,输入以下代码:
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4.1-mini", new Uri("https://api.token-ai.cn/v1"),
"您的密钥")
.Build();
await foreach (var item in kernel.InvokePromptStreamingAsync("您好,我是TokenAI"))
{
Console.Write(item.ToString());
};
这里我们使用Kernel
的CreateBuilder
创建Kernel
对象,通过InvokePromptStreamingAsync
方法实现OpenAI的Stream对话接口,并使用AddOpenAIChatCompletion
添加自定义模型和代理网站的key地址。
2. 使用聊天完成对话示例
首先给控制台项目安装SK包:
dotnet add package Microsoft.SemanticKernel
然后构建一个简单的Kernel和ChatCompletion:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
#pragma warning disable SKEXP0010
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", new Uri("https://api.token-ai.cn/v1"),
"您的密钥")
.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");
// 使用同步对话
var response = await chatCompletionService.GetChatMessageContentAsync(
history,
kernel: kernel
);
Console.WriteLine(response.Content);
// 使用异步对话
await foreach (var item in chatCompletionService.GetStreamingChatMessageContentsAsync(
history,
kernel: kernel
))
{
Console.Write(item.Content);
}
同步对话会一次性返回结果,适合对响应速度要求较高的场景;异步对话会逐步返回结果,适用于复杂业务,避免请求超时。
3. 开始使用Plugins
创建项目及代码实现
首先安装SK包:
dotnet add package Microsoft.SemanticKernel
然后编写以下代码:
using System.ComponentModel;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
#pragma warning disable SKEXP0010
var kernelBuilder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4.1-mini", new Uri("https://api.token-ai.cn/v1"),
"您的密钥");
kernelBuilder.Plugins.AddFromType<TimeInformation>();
var kernel = kernelBuilder.Build();
// 用提示符调用SK,要求AI提供它无法提供的信息,并可能产生幻觉
Console.WriteLine(await kernel.InvokePromptAsync("离圣诞节还有几天?"));
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
// 用提示符调用内核,并允许AI自动调用函数
Console.WriteLine(await kernel.InvokePromptAsync("离圣诞节还有几天?解释你的想法", new(settings)));
class TimeInformation
{
[KernelFunction]
[Description("获取当前时间帮助用户解决时区不准确。")]
public string GetCurrentUtcTime() => DateTime.UtcNow.ToString("R");
}
结论
未执行函数时,AI生成的回答可能不准确;执行函数后,AI能够准确获取当前时间并提供相应的计算结果。这充分体现了Plugins在提升AI回答准确性方面的重要作用。
4. 创建Yaml格式的提示词模板
安装依赖包
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Yaml
创建Yaml文件
在Resources
目录下创建GenerateStory.yaml
文件,内容如下:
name: GenerateStory
template:|
将一个关于 {{$topic}} 的故事生成一个长度为 {{$length}} 的故事。
template_format:semantic-kernel
description:生成关于某个主题的故事的函数。
input_variables:
- name: topic
description:故事的主题。
is_required: true
- name: length
description:故事中的句子数。
is_required: true
output_variable:
description:生成的故事。
execution_settings:
default:
temperature: 0.6
配置嵌入资源
将以下配置复制到项目中:
<ItemGroup>
<None Remove="Resources\GenerateStory.yaml" />
<EmbeddedResource Include="Resources\GenerateStory.yaml" />
</ItemGroup>
创建读取嵌入资源的方法
创建EmbeddedResource.cs
文件,内容如下:
// <summary>
// 提供从程序集中读取嵌入资源的功能。
// 此类设计用于访问嵌入在同一程序集中的基于文本的资源。
// 它根据名称检索指定资源文件的内容,并将其作为字符串返回。
// </summary>
public static class EmbeddedResource
{
private static readonly string? s_namespace = typeof(EmbeddedResource).Namespace;
internal static string Read(string fileName)
{
// Get the current assembly. Note: this class is in the same assembly where the embedded resources are stored.
Assembly assembly =
typeof(EmbeddedResource).GetTypeInfo().Assembly ??
throw new InvalidOperationException($"[{s_namespace}] {fileName} assembly not found");
// Resources are mapped like types, using the namespace and appending "." (dot) and the file name
var resourceName = $"{s_namespace}." + fileName;
using Stream resource =
assembly.GetManifestResourceStream(resourceName) ??
throw new InvalidOperationException($"{resourceName} resource not found");
// Return the resource content, in text format.
using var reader = new StreamReader(resource);
return reader.ReadToEnd();
}
}
调用函数
在Program.cs
中编写以下代码:
using Microsoft.SemanticKernel;
using Samples4;
#pragma warning disable SKEXP0010
var kernelBuilder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4.1-mini", new Uri("https://api.token-ai.cn/v1"),
"您的密钥");
var kernel = kernelBuilder.Build();
var generateStoryYaml = EmbeddedResource.Read("Resources.GenerateStory.yaml");
var function = kernel.CreateFunctionFromPromptYaml(generateStoryYaml);
Console.WriteLine(await kernel.InvokeAsync(function, arguments: new()
{
{ "topic", "Dog" },
{ "length", "3" },
}));
结论
通过定义Yaml格式的提示词模板,我们可以更结构化和可维护地管理提示词,方便在SemanticKernel中创建和调用函数。
总结
本文详细介绍了SemanticKernel的基础知识和核心概念,并通过四个实际示例展示了如何在C#中使用SemanticKernel。从实现流式对话输出到使用聊天完成功能,从使用Plugins扩展AI能力到创建Yaml格式提示词模板,相信大家已经对SemanticKernel的基本用法有了一定的了解。现在,你可以开始尝试构建自己的AI增强应用程序了。在实际应用中,不断探索和实践,相信你会发现SemanticKernel更多的强大功能和潜力。 ======================================================================
前些天发现了一个比较好玩的人工智能学习网站,通俗易懂,风趣幽默,可以了解了解AI基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程