• Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能


    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
  • 相关阅读:
    虚假内容检测,谣言检测,不实信息检测,事实核查;纯文本,多模态,多语言;数据集整理
    清理电脑存储的五种方法
    如何在小程序内实现界面快速置顶功能?
    微信 小程序应用,页面,组件的生命周期
    JavaScript处理点击事件
    华为鸿蒙3.0的野望:技术、应用、生态
    3.16 总线与信号分支线之间应该如何进行连接?OrCAD中使用Bus总线有哪些注意事项?
    【基于Netty实现Http通信、实现UDP单播和广播通信、代码案例实战学习】
    从零实现 promise 的 class 和 function 版本
    Python进行时间序列平稳性检验(ADF Test)
  • 原文地址:https://www.cnblogs.com/xbotter/p/semantic_kernel_introducation_kernel_and_skills.html