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 console
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
...

笔记完成,学习完成。

参考资料:

posted @ 2024-02-24 12:59  dudu  阅读(61)  评论(0编辑  收藏  举报