在一個 Semantic Kernel plugin 中可以創建兩種類型的 function,分別是 native function 與 prompt function(之前叫 semantic function)。
下面這款 plugin 中給 C# method 添加了 [KernelFunction]
attribute,就是 native function
public class LightPlugin
{
public bool IsOn { get; set; } = false;
[KernelFunction]
[Description("幫看一下燈是開是關")]
public string GetState() => IsOn ? "on" : "off";
}
今天學習的是另一款 plugin, 是基於 prompt function 實現的。
寫個簡單的示例 plugin 體驗一下,其中的提示詞來自博文 Intro to Semantic Kernel – Part One
創建控制檯項目
dotnet new consoele
dotnet add package Microsoft.SemanticKernel
創建 Plugin
plugin 名稱爲 DevOps
,prompt function 名稱爲 GenerateKubernetesYaml
,創建對應的文件夾,文件夾名稱分別對應 plugin name 與 function name
mkdir -p Plugins/DevOps/GenerateKubernetesYaml
在文件夾中分別添加 skprompt.txt 與 config.json 文件
提示詞配置文件 skprompt.txt
,需要輸入的變量是 input
INSTRUCTIONS:
Generate YAML files to create a kubernetes deployment according to the given description.
RULES:
- All YAML files must be complete
- YAML files must be listed one by one
- Every file is indicated with "FILE:" followed by its path
- Every file content must begin and end with #----#
DESCRIPTION:{{$input}}
請求大模型 api 的配置文件 config.json
{
"schema": 1,
"description": "Create kubernetes YAML files for given devops task",
"type": "completion",
"completion": {
"max_tokens": 1000,
"temperature": 0.5,
"top_p": 1,
"presence_penalty": 0,
"frequency_penalty": 0
},
"input": {
"parameters": [
{
"name": "input",
"description": "The description of the deployment to be be created",
"defaultValue": "keycloak with postgres backend and prod mode activated. nginx-ingress is used to forward calls to keycloak. ingress uses tls termination."
}
]
}
}
1個文件夾,2個文件,plugin 就創建好了,就這麼簡單,提示詞 + 請求參數。
添加 Plugin
Program 中調用 AddFromPromptDirectory
方法添加 plugin,注意參數中的路徑是 plugin 的路徑,不是 prompt function 的路徑
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-3.5-turbo", apiKey);
builder.Plugins.AddFromPromptDirectory("Plugins/DevOps");
var kernel = builder.Build();
控制檯輸出 plugin 信息,看看插件是否已成功添加
foreach (var plugin in kernel.Plugins)
{
Console.WriteLine("plugin: " + plugin.Name);
foreach (var function in plugin)
{
Console.WriteLine(" - prompt function: " + function.Name);
}
}
輸出如下
plugin: DevOps
- prompt function: GenerateKubernetesYaml
插件添加成功。
運行 Plugin
調用 Kernel.InvokeAsync
方法運行插件,需要傳3個參數:
- plugin name
- function name
- prompt 中用到的變量值
代碼如下
var input = """
Deploy keycloak (quarkus variant) that uses mysql as its backend.
Keycloak runs in prod mode and is TLS secured with a self-signed certificate.
Use images from bitnami.
""";
var result = await kernel.InvokeAsync(
pluginName: "DevOps",
functionName: "GenerateKubernetesYaml",
arguments: new() {
{ "input", input}
});
Console.WriteLine(result);
Plugin 運行成功,輸出結果很長,詳見 https://www.cnblogs.com/dudu/articles/18030965
#----#
FILE: keycloak-mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: keycloak-mysql-deployment
...
筆記完成,學習完成。