在之前的章节中我们或多或少的已经接触到了
Semantic Kernel
的
Plugins
,本章我们将详细介绍如何使用插件。
Semantic Kernel
的一大特点是拥有强大的插件,通过结合
自定义/预定义的插件
解决智能业务的问题。让传统的代码和智能插件一起工作,灵活地接入应用场景,简化传统应用向智能化转型的过程。
什么是
Plugins
?
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的插件功能