Semantic Kernel 學習筆記:體驗基於 prompt function 實現的 Plugin

在一個 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
...

筆記完成,學習完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章