当前位置:   article > 正文

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

sematic kernel

outside_default.png

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

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

outside_default.png

有了一堆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;

  1. using Microsoft.SemanticKernel;
  2. var kernel = Kernel.Builder.Build();
  1. 然后配置基础模型,基础模型目前有四个:

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

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

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

  • TextCompletion,最常用的GPT-3的模型,常用于文本生成

  • ChatCompetion,GPT3.5模型,也就是所谓的ChatGPT的模型,基本就用于聊天功能

  • EmbeddingGeneration,嵌入模型,这个将用于Memory的生成和搜索,在后期能力扩展时将会有极大的用途

  • ImageGeneration,图形模型,也就是DALL-E模型,用于图片的生成

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

Semantic Function

  1. 注册一个Semantic Function

  1. using Microsoft.SemanticKernel.SemanticFunctions;
  2. // ⚠️ Semantic Function的核心就是prompt⚠️
  3. // 这里偷懒,使用Semantic Kernel官方样例库里面的的Summary Skill
  4. var prompt =
  5. """
  6. [SUMMARIZATION RULES]
  7. DONT WASTE WORDS
  8. USE SHORT, CLEAR, COMPLETE SENTENCES.
  9. DO NOT USE BULLET POINTS OR DASHES.
  10. USE ACTIVE VOICE.
  11. MAXIMIZE DETAIL, MEANING
  12. FOCUS ON THE CONTENT
  13. [BANNED PHRASES]
  14. This article
  15. This document
  16. This page
  17. This material
  18. [END LIST]
  19. Summarize:
  20. Hello how are you?
  21. +++++
  22. Hello
  23. Summarize this
  24. {{$input}}
  25. +++++
  26. """;
  27. // 使用扩展方法在Kernel上注册一个SemanticFunction
  28. // prompt 是Semantic Function的核心,如何设计一个好的prompt是成功构建Semantic Function的关键所在,也是未来LLM AI 应用中的重要内容
  29. // PromptTemplateConfig 用于配置prompt 模板的相关参数
  30. // functionName 是自定义的功能名称[可选]
  31. // skillName 是自定义的技能名称[可选]
  32. var summaryFunction = kernel.CreateSemanticFunction(prompt,new PromptTemplateConfig());

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

  1. 执行Function

  1. // 定义需要处理的输入
  2. 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. ";
  3. // 通过 Kernel 运行 function
  4. var resultContext = await kernel.RunAsync(input,summaryFunction);
  5. // 输出结果
  6. resultContext.Result.Dump();
  7. // output
  8. // 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

  1. using Microsoft.SemanticKernel.SkillDefinition;
  2. // 这里偷懒,使用Semantic Kernel CoreSkills中的 TextSkill
  3. public class TextSkill {
  4. [SKFunction("Convert a string to uppercase.")]
  5. public string Uppercase(string text)
  6. {
  7. return text.ToUpper(System.Globalization.CultureInfo.CurrentCulture);
  8. }
  9. }

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

  1. 注册Native Skill

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

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

  1. 执行Function

  1. // 注册Native Function 如何没有指定 SKFunctionName的话,都会是用方法声明的名称,使用nameof这种偷懒方法可以方便得从Skill集合中获取对应的Function
  2. var uppercaseFunction = textSkill[nameof(TextSkill.Uppercase)];
  3. // 通过 Kernel 运行 function
  4. var nativeResultContext = await kernel.RunAsync(input,uppercaseFunction);
  5. // 输出结果
  6. nativeResultContext.Result.Dump();
  7. // output:
  8. // 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串联起来使用了,就像是命令行中的管道,函数式编程中的管道一样。

  1. // kernel.RunAsync 本身就支持多个Function参数,并按照顺序依次执行
  2. var upperSummeryContext = await kernel.RunAsync(input, summaryFunction,uppercaseFunction);
  3. // 输出结果
  4. upperSummeryContext.Result.Dump();
  5. // output:
  6. // 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: https://learn.microsoft.com/en-us/semantic-kernel/concepts-sk/

  2. Kernel in Semantic Kernel | Microsoft Learn:https://learn.microsoft.com/en-us/semantic-kernel/concepts-sk/kernel

  3. Skills in Semantic Kernel | Microsoft Learn:https://learn.microsoft.com/en-us/semantic-kernel/concepts-sk/skills

  4. How to write semantic skills in Semantic Kernel | Microsoft Learn: https://learn.microsoft.com/en-us/semantic-kernel/howto/semanticfunctions

  5. How to write native skills in Semantic Kernel | Microsoft Learn: https://learn.microsoft.com/en-us/semantic-kernel/howto/nativefunctions

  6. SK-Recipes:https://github.com/johnmaeda/SK-Recipes

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/300631
推荐阅读
相关标签
  

闽ICP备14008679号