入门Semantic Kernel:OneApi集成与HelloWorld
引言
从这一章节开始正式进入我们的 Semantic Kernel 的学习之旅了。
什么是Semantic Kernel?
Semantic Kernel是一个轻量级的开源框架,通过 Semantic Kernel 可以快速使用不同编程语言(C#/Python/Java)结合 LLMs(OpenAI、Azure OpenAI、Hugging Face 等模型) 构建智能应用,简化将人工智能(AI)集成到现有解决方案中的过程。
Semantic Kernel 的特点
模块化插件架构:
Semantic Kernel提供了一个模块化的插件架构,允许开发者通过结合自定义和预定义的智能插件来解决复杂的业务问题。这种架构使得传统代码能够与智能插件无缝协作,从而简化了传统应用程序向智能化转型的过程。多模型集成能力:
Semantic Kernel支持多种AI模型,包括但不限于Azure OpenAI Service、OpenAI,以及Hugging Face提供的离线模型。通过Semantic Kernel的链接器功能,开发者可以快速地将这些AI“大脑”集成到自己的智能应用中,大幅提升应用的智能化水平。多样化的链接器生态系统:除了连接
AI模型,Semantic Kernel的链接器还支持连接向量数据库、商业软件、业务中间件等多种服务。这种多样化的链接能力,使得Semantic Kernel能够适应更多的业务场景,推动业务流程的智能化转型。全面的语言兼容性:
Semantic Kernel支持主流的编程语言,包括C#、Python和Java。这种全面的语言支持,使得不同背景的开发者都能够轻松地利用Semantic Kernel来挖掘AI的潜力,并将其应用到自己的项目中。低门槛的开发体验:
Semantic Kernel设计注重用户体验,提供了简单易用的接口和文档。即使是AI领域的新手,也能够快速上手,实现零成本入门,从而降低了开发智能应用的门槛。
核心概念
Semantic Kernel基本组成

在 Semantic Kernel 中,核心概念包括:
内核(Kernel):
如果说 Semantic Kernel 是 Copilot Agent 的核心 AI 编排层,那 Kernel 对象就是 AI 编排层的核心对象。

从上图我们可以看出Kernel的核心包括:
配置: 包括
AI模型、插件、链接器等的配置信息。上下文管理:它维护应用程序的上下文信息,确保在执行任务时,可以访问到正确的数据和状态。
服务协调:
Kernel对象协调不同的AI服务和插件,确保它们能够协同工作,完成复杂的任务。执行引擎:它作为执行引擎,根据规划器生成的计划,调度和执行相应的操作。
插件(Plugins)
插件是 AI 解决方案的构建块,它们是一组可以暴露给 AI 应用程序和 AI 服务的函数,允许它们访问完成特定任务所需的数据。
Semantic Kernel 中的函数
Semantic Function 是用自然语言编写的提示(Prompt)模板,发送给 AI 服务;而 Native Function是用 C#或 Python 编写的传统函数,可以通过规划器和函数调用被 AI 服务调用。
记忆(Memories)
Memories 是用于存储数据的专用插件,它们在执行过程中为你的内核提供必要的上下文,以便你的 AI 服务能够正常运行。
规划器(Planners)
规划器可以接收用户的目标,并帮助我们动态生成一个包含实现该特定目标的执行步骤的计划。规划器使用 AI 模型根据核心中指定的函数和服务生成计划。
通过整合这些概念和组件,Semantic Kernel 可以实现智能的语义理解、任务规划和智能决策,从而为用户提供更加智能、灵活和个性化的交互体验。它可以应用于各种领域,如虚拟助手、智能客服、自然语言交互系统等,为用户和企业提供更加智能和高效的解决方案。
从下面这张图可以更好的理解各核心组件之间的关系

Sematic Kernel 对接 OneApi
通过我们上一篇文章的,我们了解到了
OneApi,是以OpenAI的格式,所以在SK中可以使用OpenAI的Connector来操作、在Semantic Kernel类库中已经默认集成。
使用 UseSecrets 存储机密信息
- 在我们的启动项右键机密信息管理

配置项 Json 文件
"OneApiSpark": {
"Endpoint": "http://localhost:3000",
"ModelId": "SparkDesk-v3.5",
"ApiKey": "sk-LAYzQaWssCYYEVHP1d6a3fFa111745249e94F0364a0cF37c"
}
从 OpenAI 到本地服务的请求转换
自定义 HttpClientHandler
用 OpenAI 或者 Azure OpenAI 的扩展,请求会发送到"api.openai.com"或者"openai.azure.com",这时候就需要我们通过自定的HttpClientHandler 重定向的模型基础 URL转发到我们的http://localhost:3000 OneApi 的服务地址。
- 核心代码
public class OpenAICustomHandler : HttpClientHandler
{
/// <summary>
/// 用于OpenAI或Azure OpenAI请求时重定向的模型基础URL。
/// </summary>
private readonly string modelUrl;
private static readonly string[] sourceArray = ["api.openai.com", "openai.azure.com"];
/// <summary>
/// 使用指定的模型URL初始化<see cref="OpenAICustomHandler"/>类的新实例。
/// </summary>
/// <param name="modelUrl">用于OpenAI或Azure OpenAI请求的基础URL。</param>
public OpenAICustomHandler(string modelUrl)
{
// 确保modelUrl不是null或空
if (string.IsNullOrWhiteSpace(modelUrl))
throw new ArgumentException("模型URL不能为空或空白。", nameof(modelUrl));
this.modelUrl = modelUrl;
}
/// <summary>
/// 异步发送HTTP请求,对于OpenAI或Azure OpenAI服务的请求,将URL重定向到指定的模型URL。
/// </summary>
/// <param name="request">要发送的HTTP请求消息。</param>
/// <param name="cancellationToken">可以用来取消操作的取消令牌。</param>
/// <returns>表示异步操作的任务对象。</returns>
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 检查请求是否针对OpenAI或Azure OpenAI服务
if (request.RequestUri != null &&
(sourceArray.Contains(request.RequestUri.Host)))
{
// 修改请求URI,以包含模型URL
request.RequestUri = new Uri(modelUrl + request.RequestUri.PathAndQuery);
}
// 调用基类方法实际发送HTTP请求
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
Semantic Kernel HelloWorld
我们先通过一个简单的示例学习一下 Kernel 对象的创建使用
- VS 创建控制台项目
SK_CreateKernel
Nuget安装Semantic Kernel的依赖
PM> NuGet\Install-Package Microsoft.SemanticKernel -Version 1.10.0
- 下面我们示例将借助
Prompt提示词用的Semantic function来推理一下用户的意图
Steps
简单的流程可以总结为:
Build Kernel ➟ Prompt Template ➟ Create Semantic function ➟ Kernel Invoke Semantic function
var config = ConfigExtensions.FromConfig<OpenAIConfig>("OneApiSpark");
//自定义HttpClientHandler
var openAICustomHandler = new OpenAICustomHandler(config.Endpoint);
using HttpClient client = new(openAICustomHandler);
//Create Kernel
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: config.ModelId,
apiKey: config.ApiKey,
httpClient: client)
.Build();
// 接收用户入参
string request = Console.ReadLine()!;
// create prompt to the chat service
string prompt = "这个请求的意图是什么? {{$request}}";
// Create a kernel arguments object and add the request
var kernelArguments = new KernelArguments
{
{ "request", request }
};
var streamingKernelContentsAsync = kernel.InvokePromptStreamingAsync(prompt, kernelArguments);
await foreach (var content in streamingKernelContentsAsync)
{
Console.WriteLine(content);
}
Console.ReadKey();
上面的代码我们通过Kernel对象用prompt创建了一个Semantic function,内容是揣测用户输入的文本意图,借助大模型的推理能力很简单的就可以做到这个功能。
Run一下

- 输入
I want to send an email to the marketing team celebrating their recent milestone
- 输出
这个
请求的意图
是发送一封
电子邮件给市场团队
,庆祝他们最近达成
的一个重要成就。
在编程或自动化的上下文中,实现这个意图可能涉及以下几个步骤:
1. 确定市场团队的联系信息,包括电子邮件地址。
2. 编写邮件内容,确保包含对最近里程碑的庆祝和肯定。
3.
使用适当的邮件发送协议(如SMTP)或邮件服务API(如SendGrid, Mailgun等)来发送邮件。
4. 确保邮件格式正确,包括主题行、正文、签名等。
5. 测试邮件发送功能以确保邮件能够成功送达。
如果你需要具体的代码示例或进一步的帮助来实现这个功能,请提供更多的上下文或技术要求。
最后
本章介绍了 Semantic Kernel 的特点、核心概念以及与 OneApi 的对接方式,算是我们SK学习的 HelloWorld,展示了如何利用 Semantic Kernel 构建智能应用并与在线大模型进行集成。
参考文献
本文示例源代码
欢迎关注笔者公众号一起学习交流,获取更多有用的知识~

入门Semantic Kernel:OneApi集成与HelloWorld的更多相关文章
- Semantic Kernel 入门系列:🛸LLM降临的时代
不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...
- Semantic Kernel 入门系列:🪄LLM的魔法
ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握. 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不 ...
- Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能
理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...
- Semantic Kernel 入门系列:💬Semantic Function
如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...
- Semantic Kernel 入门系列:💾Native Function
语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...
- Semantic Kernel 入门系列:🥑突破提示词的限制
无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...
- Semantic Kernel 入门系列:🥑Memory内存
了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...
- Semantic Kernel 入门系列:🍋Connector连接器
当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...
- Semantic Kernel 入门系列:📅 Planner 计划管理
Semantic Kernel 的一个核心能力就是实现"目标导向"的AI应用. 目标导向 "目标导向"听起来是一个比较高大的词,但是却是实际生活中我们处理问题的 ...
- Semantic Kernel 知多少 | 开启面向AI编程新篇章
引言 在ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻.当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐的开展基于ChatGPT ...
随机推荐
- KingbaseES生成动态SQL
1. 动态SQL 动态SQL在程序启动时会根据输入参数替换相应变量.使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能.动态SQL可以是代码或 ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)
一.Grid/GridItem 1.概述 网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活.简洁.易于维护.网格布局能够将页面分成多个单元格,可以在这些 ...
- Hall定理小记
前言 Hall定理:一张二分图有完美匹配(即最大匹配为 \(\min\{|X|,|Y|\}\) ) 当且仅当任意一个点集 \(X'\) 与所有能直接到达 \(X'\) 的点集 \(Y'\), 也就是 ...
- #Multi-SG#BZOJ 2940 [POI2000] 条纹
题目 有\(n\)个格子,可以选择三种长度的线段覆盖,不能重叠, 无法覆盖者为负,问先手是否必胜,\(n\leq 10^3\) 分析 考虑选择一个位置覆盖则该局面分成两个局面, 直接求出SG函数不为0 ...
- 深入剖析 Java 类属性与类方法的应用
Java 类属性 Java 类属性,也称为字段,是类中的变量.它们用于存储与类相关的数据. 创建类属性 在类定义中声明属性: public class Main { int x; // 属性 Stri ...
- Leetcode-栈的压入弹出序列
/* 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), ...
- Vue保持用户登录状态(各种token存储方式)
目录 怎么设置Cookie Cookie的缺点: LocalStorage与SessionStorage存储Token LocalStorage与SessionStorage的主要区别: Vuex存储 ...
- b站的视频进度条悬浮预览视频画面实现方式
1.探究 在看b站视频,滑到进度条的时候突发奇想,想知道这个预览图是怎么做到的 打开控制台,发现每次移动鼠标悬浮位置的时候都会发出一条网络请求,并且该请求的size显示来源于内存,当时以为每次加载视频 ...
- win11右下角快捷面板打不开的处理方法
win11右下角快捷面板打不开的处理方法 在搜索中查询计算机管理(因为没有将此电脑放出来,所以就用搜索了) 然后找到服务,找到windows推送通知系统服务,右键属性,将自动改为禁用,然后停止此服务, ...
- Oracle的主键id自增
Oracle的主键id自增 可以直接用序列加触发器的方式实现 首先表里面要有个主键,没有的话用语句或者在编译器中加一下,都可以 然后创建一个序列,一般来说最常用的有这几个参数 CREATE SEQUE ...