首页 > 其他分享 >Semantic Kernel 入门系列:

Semantic Kernel 入门系列:

时间:2023-04-09 22:55:15浏览次数:54  
标签:Function Kernel Semantic kernel Skills LLM Skill

image

理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢?

首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 semantic function ,代码的能力称为 native function,两者平等的称之为function(功能),一组功能构成一个技能(skill)。 SK的基本能力均是由skill构成。

image

有了一堆skill之后并不能直接执行,需要有一个配置和管理的单元,就像是MVC 需要ASP.NET框架一样,Skill也需要有一个Kernel进行组织管理。

Kernel 除了组织管理Skill,还兼顾了基础服务的配置,例如OpenAI/Azure OpenAI的授权信息,默认的LLM模型选择等等。另外当涉及到上下文的管理,技能参数的传递时,Kernel也能发挥重要的作用。

接下来我们就以开始着手上手SK应用开发的学习。

准备阶段

  1. 首先准备一个应用环境,Console 可以,ASP.NET 也可以,Notebooks 也可以。使用Notebooks的话推荐参考官方的Notebooks合集Uncle John's Semantic Kernel Recipes
  2. 应用环境准备好之后,和所有的.Net 库一样,接下来就是安装SK的nuget 包。由于是一个较新的包,所以更新变化会比较快。
dotnet add package Microsoft.SemanticKernel --prerelease
  1. 接下来进行应用内的准备工作,首先创建一个 kernel;
using Microsoft.SemanticKernel;
var kernel = Kernel.Builder.Build();
  1. 然后配置基础模型,基础模型目前有四个:

    • TextCompletion,最常用的GPT-3的模型,常用于文本生成
    • ChatCompetion,GPT3.5模型,也就是所谓的ChatGPT的模型,基本就用于聊天功能
    • EmbeddingGeneration,嵌入模型,这个将用于Memory的生成和搜索,在后期能力扩展时将会有极大的用途
    • ImageGeneration,图形模型,也就是DALL-E模型,用于图片的生成

    由于Azure OpenAI提供了和Open AI相同的能力,所以以上的模型配置可以选择OpenAI的接口,也可以选择Azure OpenAI的接口,根据自己有哪个选哪个的原则使用。

    当然以上模型也提供了基本的接口定义,如果有自己的LLM AI接口的话,也可以自行实现相关接口,然后使用。

    这里以OpenAI的接口为例,继续进行学习。

// 简单的技能任务使用TextCompletion即可
// 1. ServiceId 用于指定当前模型的配置,相同的模型不能有重复的ServiceId配置
// 2. modelId 指定TextCompetion所使用的LLM 模型,目前基本为 text-davinci-003
// 3. apikey OpenAI 接口调用需要使用的APIkey
kernel.Config.AddOpenAITextCompletionService("ServiceId","text-davinci-003",Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

Semantic Function

  1. 注册一个Semantic Function
using Microsoft.SemanticKernel.SemanticFunctions;

// ⚠️ Semantic Function的核心就是prompt⚠️ 
// 这里偷懒,使用Semantic Kernel官方样例库里面的的Summary Skill
var prompt = 
"""
[SUMMARIZATION RULES]
DONT WASTE WORDS
USE SHORT, CLEAR, COMPLETE SENTENCES.
DO NOT USE BULLET POINTS OR DASHES.
USE ACTIVE VOICE.
MAXIMIZE DETAIL, MEANING
FOCUS ON THE CONTENT

[BANNED PHRASES]
This article
This document
This page
This material
[END LIST]

Summarize:
Hello how are you?
+++++
Hello

Summarize this
{{$input}}
+++++
""";
// 使用扩展方法在Kernel上注册一个SemanticFunction 
// prompt 是Semantic Function的核心,如何设计一个好的prompt是成功构建Semantic Function的关键所在,也是未来LLM AI 应用中的重要内容
// PromptTemplateConfig 用于配置prompt 模板的相关参数
// functionName 是自定义的功能名称[可选]
// skillName 是自定义的技能名称[可选]
var summaryFunction = kernel.CreateSemanticFunction(prompt,new PromptTemplateConfig());

可以注意到的是在prompt中,有一个变量参数 {{$input}},这是SK的默认输入参数,用于注入需要处理的用户输入,这样的格式用于预防Prompt Injection,这就是另外一个话题了。

  1. 执行Function
// 定义需要处理的输入
var input = "Multi-modal interfaces are becoming increasingly popular for app developers. These interfaces allow users to interact with apps in a variety of ways by combining different modes of input and output, such as voice, touch, and visuals, to create a more interactive and engaging user experience. In this blog we will overview how you can use Semantic Kernel with a multi-modal example.  ";
// 通过 Kernel 运行 function 
var resultContext = await kernel.RunAsync(input,summaryFunction);
// 输出结果
resultContext.Result.Dump();
// output 
// Multi-modal interfaces are becoming increasingly popular for app developers, combining different modes of input and output such as voice, touch, and visuals to create a more interactive and engaging user experience. Semantic Kernel can be used to create a multi-modal example.

以上就完成了一个简单的Semantic Function的使用。

好的,我们继续。

Native Function

  1. 声明一个Native Skill
using Microsoft.SemanticKernel.SkillDefinition;
// 这里偷懒,使用Semantic Kernel CoreSkills中的 TextSkill
public class TextSkill {
	[SKFunction("Convert a string to uppercase.")]
	public string Uppercase(string text)
	{
		return text.ToUpper(System.Globalization.CultureInfo.CurrentCulture);
	}
}

这里只需要对方法添加一个SKFunction的注释,就可以转变为一个SK的Native Function。

  1. 注册Native Skill
// skillInstance 就是Native Skill的实例
// skillName 自定义的技能名称 [可选]
var textSkill = kernel.ImportSkill(new TextSkill(),nameof(TextSkill));

这里使用到的是一个Import,意味着导入了SkillInstance中所有的定义SKFunction。而Semantic Skill 也有一个对应的Import方法ImportSemanticSkillFromDirectory,可以从一个文件夹中导入所有技能。

  1. 执行Function
// 注册Native Function 如何没有指定 SKFunctionName的话,都会是用方法声明的名称,使用nameof这种偷懒方法可以方便得从Skill集合中获取对应的Function
var uppercaseFunction = textSkill[nameof(TextSkill.Uppercase)];
// 通过 Kernel 运行 function
var nativeResultContext = await kernel.RunAsync(input,uppercaseFunction);
// 输出结果
nativeResultContext.Result.Dump();
// output:
// MULTI-MODAL INTERFACES ARE BECOMING INCREASINGLY POPULAR FOR APP DEVELOPERS. THESE INTERFACES ALLOW USERS TO INTERACT WITH APPS IN A VARIETY OF WAYS BY COMBINING DIFFERENT MODES OF INPUT AND OUTPUT, SUCH AS VOICE, TOUCH, AND VISUALS, TO CREATE A MORE INTERACTIVE AND ENGAGING USER EXPERIENCE. IN THIS BLOG WE WILL OVERVIEW HOW YOU CAN USE SEMANTIC KERNEL WITH A MULTI-MODAL EXAMPLE.

以上就完成了一个简单的Native Function的使用。

链式调用

当完成了以上Skill和Function的准备之后,就可以想办法将多个Skill串联起来使用了,就像是命令行中的管道,函数式编程中的管道一样。

// kernel.RunAsync 本身就支持多个Function参数,并按照顺序依次执行
var upperSummeryContext = await kernel.RunAsync(input, summaryFunction,uppercaseFunction);
//  输出结果
upperSummeryContext.Result.Dump();

// output:
// MULTI-MODAL INTERFACES ARE BECOMING INCREASINGLY POPULAR FOR APP DEVELOPERS, COMBINING DIFFERENT MODES OF INPUT AND OUTPUT SUCH AS VOICE, TOUCH, AND VISUALS TO CREATE A MORE INTERACTIVE AND ENGAGING USER EXPERIENCE. SEMANTIC KERNEL CAN BE USED TO CREATE A MULTI-MODAL EXAMPLE.

至此,一个简单的结合了LLM AI能力和原生代码能力的应用就构建成功了。


参考资料:

  1. Concepts Overview for Semantic Kernel | Microsoft Learn
  2. Kernel in Semantic Kernel | Microsoft Learn
  3. Skills in Semantic Kernel | Microsoft Learn
  4. How to write semantic skills in Semantic Kernel | Microsoft Learn
  5. How to write native skills in Semantic Kernel | Microsoft Learn
  6. SK-Recipes

标签:Function,Kernel,Semantic,kernel,Skills,LLM,Skill
From: https://www.cnblogs.com/xbotter/p/semantic_kernel_introducation_kernel_and_skills.html

相关文章

  • 语义通信论文阅读(1):Beyond Transmitting Bits: Context, Semantics, and Task-Orient
    @目录引言语义信息度量知识图谱机器学习在语义通信的应用远程模型训练![在这里插入图片描述](https://img-blog.csdnimg.cn/dd937c25348649b8ac03b210baad237c.png#pic_center=360x70)《超越比特传输:上下文、语义和面向任务的通信》这是2022年10月发布在IJSAC上的一篇语义通......
  • Semantic Kernel 入门系列:
    不论你是否关心,不可否认,AGI的时代即将到来了。在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅。而在ChatGPT背后,我们不能忽视的是LLM(LargeLanguageModel)大型语言模型。一夜之间所有的大厂商都在搞LLM,虽然很难有谁能和OpenAI相匹敌,但是随着AI领域的新摩尔定律的发功,......
  • 内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
    原文:https://blog.csdn.net/yyzsyx/article/details/129576582文章目录一、篇头二、内核部分2.1源码下载2.1.1官网2.1.2镜像站点2.1.3代码下载2.2编译2.2.1设置工具链2.2.2配置2.2.3make2.2.4编译成功三、busybox部分3.1源码下载3.2编译3.2.1配置3.2.3编译3.2.4查......
  • linux kernel 编译的过程中 make defconfig、 make menuconfig、 make savedefconfig
    原文:https://www.cnblogs.com/xingboy/p/16478998.html1、 makedefconfig首先通过makexxx_defconfig,生成最开始的.config,相当于把XXX_defconfig文件复制为.config文件,其中defconfig是最小的config项,kernel编译会根据.config文件去编译驱动情况,加载过改指令后,后......
  • Semantic Kernel 知多少 | 开启面向AI编程新篇章
    引言在ChatGPT火热的当下,即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻。当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐的开展基于ChatGPT模型AI应用的落地探索。因此,可以明确预见的是,AI能力的集成将会是很多应用都将面临的第一事项,而拥有......
  • Unable to handle kernel NULL pointer dereference at virtual address 分析
    引用:https://blog.csdn.net/agave7/article/details/119875023虽然问题不一样,但是分析问题的方法是一致的。UnabletohandlekernelNULLpointerdereferenceatvirtualaddress分析现象[136.847780]br-lan:receivedpacketoneth0.1withownaddressassourceadd......
  • ubuntu kernel 更新
    参考: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel如果希望修改kernel部分的配置,如CONFIG_RT_GROUP_SCHED,打开cgroup对RT的支持,可以在debian.master/config/annotations中找到配置项,把相应平台的'n'改成‘y'  网上搜到其它文章,从kernel.org下载原始版本编译更新的......
  • kernel——内存管理
    0.背景知识0.1.硬件sram:硬件复杂,成本高,CPU通过A0-A18个地址线一次输入要访问的地址,就能获得数据,所以CPU能直接访问ddrsdram:硬件简单,成本低,但CPU需要通过a0-a10......
  • Docker Desktop 报错 WSL 2 Kernel update
    解决报错如下1、先升级WSL2下载地址可以用docker提示的地址,这里提供一个阿里云盘的地址「wsl_update_x64.msi」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP,无需......
  • 基于VS Code的Linux内核调试环境搭建及start_kernel跟踪分析
    下载Linux内核源码并编译wgethttps://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patchsudoaptinstallaxelaxel-n20https://mirr......