当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/302329.html

相关文章:

  • 【GIS数据分享】建筑矢量数据带高度
  • 数据链路层 和 ARP协议
  • 最大连续子数组
  • Makefile if语句用法
  • 【传奇开心果系列】Flet纵向瀑布流本地图片布局排列自定义模板
  • 【硬件】LVGL
  • 15-C语言:第15天笔记
  • keepalived原理及实战部署
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • 张 LLama 多语言语义相似度计算全解析:不同语言 同义词的相似度计算
  • idea启动java应用报错
  • idea编译报错 java: 非法字符: ‘\ufeff‘ 解决方案
  • OSPF笔记
  • 实验-静态路由
  • 解决windows系统下 idea、CLion 控制台中文乱码问题
  • 应急响应处置案例(上)
  • python-并发编程
  • 移动高清盒子6PRO-河南创维E900V22D-晶晨S905L3B-4+16G-安卓9-线刷固件包
  • 提取excel中的年月日
  • uniapp_微信小程序_根据胶囊按钮计算出的导航栏高度为什么不是44px?
  • 多光谱相机助力第四次全国农业普查-农业用地调查
  • Deepseek + browser-use 轻松实现浏览器自动化
  • 关于大视频大文件诸如超过5个G或10个G的视频上传详解原理以及-5种语言实现-优雅草卓伊凡|深蓝
  • 【7.26-7.28胜算云AI日报:首个开源3D世界生成模型腾讯混元、微软预示 8 月 GPT-5 发布、Nemotron推理、商汤悟能、DM夺金】
  • UniappDay04
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • 【uniapp】---- 使用 uniapp 实现视频和图片上传且都可以预览展示
  • NVMe高速传输之摆脱XDMA设计20:PCIe请求模块设计(上)
  • 【mysql慢查询】
  • “太赫兹”