.NET AI从0开始入门 SemanticKernel 从基础到实践

发布于:2025-07-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

.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,可以按照以下步骤进行:

  1. 安装SDK:根据所选编程语言安装相应的SemanticKernel SDK。
  2. 配置AI模型:连接到OpenAI、Azure OpenAI等LLM服务。
  3. 创建插件:定义语义函数和原生函数。
  4. 构建工作流:将函数组合成解决特定问题的工作流。
  5. 集成到应用:将SemanticKernel集成到应用程序中。

二、SemanticKernel入门实践

1. 快速开始第一个示例

获取OpenAI在线API

由于国内访问限制,我们可以使用https://api.token-ai.cn。在该网站注册账号并创建令牌,此令牌将用于代替OpenAI的原有令牌。

创建项目
  1. 打开Visual Studio 2022,创建名为TokenAI的控制台项目。
  2. 右键项目,点击管理 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());  
};  

这里我们使用KernelCreateBuilder创建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基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程


网站公告

今日签到

点亮在社区的每一天
去签到