详解Semantic Kernel的插件功能

在之前的章节中我们或多或少的已经接触到了

Semantic Kernel



Plugins

,本章我们将详细介绍如何使用插件。


Semantic Kernel

的一大特点是拥有强大的插件,通过结合

自定义/预定义的插件

解决智能业务的问题。让传统的代码和智能插件一起工作,灵活地接入应用场景,简化传统应用向智能化转型的过程。

什么是

Plugins


我们知道

LLMs

(大模型)的训练数据和我们使用之间存在时间差,

LLMs

对企业内的知识认知有缺陷。

OpenAI

通过插件将

ChatGPT

和第三方应用程序连接起来,这些插件使

ChatGPT

能够与开发人员定义的

API

进行交互,从而增强

ChatGPT

的功能并允许有更广泛的操作,例如:


  • 检索实时信息

    ,例如,体育赛事比分、股票价格、最新新闻等。

  • 检索知识库信息

    ,例如,公司文档、个人笔记等。

  • 协助用户进行相关操作

    ,例如,预订航班、公司内预定会议、订餐等。


Semantic Kernel

遵循

OpenAI

的插件规范,可以很方便地接入和导出插件(如基于

Bing, Microsoft 365

,

OpenAI

的插件),这样可以让开发人员很简单地调用不同的插件服务。除了兼容

OpenAI

的插件外,

Semantic Kernel

内也有属于自己插件定义的方式。不仅可以在规定

模板格式上定义Plugins

,更可以在

函数内定义Plugins

从高层次上理解插件是一组可以公开给

AI

应用程序和服务的功能。

定义插件


在 Semantic Kernel 中定义 Plugins 插件有两种方式,第一种是通过模版定义插件也叫

Semantic Plugins

,第二种是通过函数创建插件也叫

Native Plugins

Sermantic Plugins


通过模版定义插件


我们知道可以通过

Prompts

(提示词工程)可以和

LLMs

进行对话,我们在处理一系列特定业务过程中,可能不止一个

Prompts

,可能是一组

Prompts

的集合。我们可以把这些针对业务能力的

Prompts

集合放到

Semantic Kernel

的插件集合内。

模版格式



Semantic Kernel

模版定义格式有固定的格式,

Prompts

(提示词)都放在

skprompt.txt

文件内,而相关参数设置都放在

config.json

文件内,文件结构参考如下图

const string ConfigFile = "config.json";
const string PromptFile = "skprompt.txt";

这些都是在

SK

写死的配置,所以插件内的命名一定要遵循这个规则!

|-plugins
  |-Prompts
      |-Translator
          |-skprompt.txt
          |-config.json
  |-WriterPlugins
      |-Joke
          |-skprompt.txt
          |-config.json
      |-ShortPoem
          |-skprompt.txt
          |-config.json

skprompt.txt

我们先来看看

skprompt.txt

的定义,这里一般是放置和业务相关的

Prompt

,可以支持多个参数,每个参数都放置在

{{$参数名}}

内,如以下格式:

Translate {{$input}} into {{$language}}

在之前的章节我们介绍过这是

SK



TemplateFormat

的默认格式

"semantic-kernel"

config.json

这是配置相关的内容,随了设置和

LLMs

相关的参数外,你也可以设定输入的参数以及相关描述

{
"schema": 1,
"description": "Translate sentenses into a language of your choice",
"execution_settings": {
  "default": {
    "max_tokens": 2000,
    "temperature": 0.7,
    "top_p": 0.0,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0,
    "stop_sequences": ["[done]"]
  }
},
"input_variables": [
  {
    "name": "input",
    "description": "sentense to translate",
    "default": ""
  },
  {
    "name": "language",
    "description": "Language to translate to",
    "default": ""
  }
]
}

这其实就是对

PromptTemplateConfig

提示词模版配置类的

json

数据,最后在

SK

内会被反序列化到对象内。

// Load prompt configuration. Note: the configuration is optional.
var configPath = Path.Combine(functionDirectory, ConfigFile);
var promptConfig = File.Exists(configPath) ?
              PromptTemplateConfig.FromJson(File.ReadAllText(configPath)) :
              new PromptTemplateConfig();

之前我们对

PromptTemplateConfig

类进行过详细的讲解,不熟悉的可以看看深入学习 Semantic Kernel:创建和配置 prompts functions。

从解决方案的角度看一下配置的目录图

注册Semantic Plugins

要从

Semantic Kernel

中要实现

Semantic Plugins

模板化插件的注册,需要

KernelExtensions

类中的

CreatePluginFromPromptDirectory

扩展方法。

再开始之前在我们代码的解决方案

Plugins

文件夹下对每一个

skprompt.txt



config.json

进行生成设置

核心代码

var kernel = Kernel.CreateBuilder()
  .AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
  .Build();
//注册插件
string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
kernel.ImportPluginFromPromptDirectory(folder);

string[] pluginNames = ["Prompts", "WriterPlugins"];

foreach (var pluginName in pluginNames)
{
  kernel.ImportPluginFromPromptDirectory(Path.Combine(folder, pluginName));
}

//测试从插件获得funciton
var jokeKernelFunction = kernel.Plugins.GetFunction("Prompts", "Translator");
Console.WriteLine("System: 请输入要翻译的内容");
var userResuest = Console.ReadLine();
Console.WriteLine("System: 请输入要翻译的语言语种");
var language = Console.ReadLine();

var results = await jokeKernelFunction.InvokeAsync(kernel, new KernelArguments()
{
{"input", userResuest},
{"language", language}
});

Console.WriteLine($"Assistant: {results.ToString()}");

插件名称约定


ImportPluginFromPromptDirectory

这个方法在注册插件过程中如果没有指定插件名字会默认用文件夹名称

pluginName ??= new DirectoryInfo(pluginDirectory).Name;

输出

System: 请输入要翻译的内容
User: 那么近那么美周末去河北
System: 请输入要翻译的语言语种
User: 英文
Assistant: So close, so beautiful, go to Hebei for the weekend.

最后

本章我们详细介绍了如何使用

Semantic Kernel

的插件功能,包括插件的概念、定义插件的两种方式(Semantic Plugins 和 Native Plugins)、以及如何注册和调用 Semantic Plugins。通过插件,我们可以扩展

ChatGPT

的功能,使其能够与第三方应用程序进行连接,实现更广泛的操作和服务。

通过注册插件并调用相应函数,我们可以实现诸如翻译、笑话生成等功能。在下一篇中,我们将关注

Native Plugins

原生函数插件的介绍。


参考文献

  • 开启大模型的技能之门 – Plugins
  • Understanding AI plugins in Semantic Kernel


示例代码

本文源代码

未经允许不得转载:大白鲨游戏网 » 详解Semantic Kernel的插件功能