首页 > 其他分享 >Semantic Kernel 学习笔记:体验基于 prompt function 实现的 Plugin

Semantic Kernel 学习笔记:体验基于 prompt function 实现的 Plugin

时间:2024-02-24 13:00:11浏览次数:23  
标签:function Kernel prompt name plugin input Semantic

在一个 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

调用 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
...

笔记完成,学习完成。

标签:function,Kernel,prompt,name,plugin,input,Semantic
From: https://www.cnblogs.com/dudu/p/18030425

相关文章

  • [Rust] Implicitly returning values from functions
    Codehaserror:fnmain(){letanswer=square(3);println!("Thesquareof3is{}",answer);}fnsquare(num:i32)->i32{num*num;}Error:⚠️Compilingofexercises/functions/functions5.rsfailed!Pleasetryagain.Here&#......
  • let、const、var、function所谓的”变量提升“、暂时性死区到底是什么
    今天看了大佬一个文章我用了两个月的时间才理解let-知乎(zhihu.com),文章中其实说得很清楚,还有大佬解决这个问题的整个心路历程。我这里做一个总结记录,专注于“变量提升”、暂时性死区这两个点做一个讨论。现象讨论下面这两段代码,我们都知道这段代码在控制台会打印undefined......
  • Machine Learning - The Sigmoid Function
    CalculateNodeOutput.TaskYouaregiventhevaluesforw1,w2,b,x1andx2andyoumustcomputetheoutputforthenode.Usethesigmoidastheactivationfunction.InputFormatw1,w2,b,x1andx2ononelineseparatedbyspacesOutputFormatFloatrounded......
  • 【Azure Function】示例运行 python durable function(model V2)
    问题描述参考官方文档(使用Python创建你的第一个持久函数:https://learn.microsoft.com/zh-cn/azure/azure-functions/durable/quickstart-python-vscode),部署后,却出现“Failedtoloadfunction”错误。在结合以上参考文档后,可以通过如下的步骤创建并运行PythonDurableFu......
  • 一文搞懂Flink Window机制 Windows和 Function 和 Process组合处理事件
    一文搞懂FlinkWindow机制和Function和Process组合处理事件Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算。Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算。窗口化的Flink程......
  • Flink 增量窗口聚合函数 ReduceFunction(归约函数)和AggregateFunction(聚合函数)
    Flink增量窗口聚合函数定义了窗口分配器,只是知道了数据属于哪个窗口,可以将数据收集起来了;至于收集起来到底要做什么,其实还完全没有头绪。所以在窗口分配器之后,必须再接上一个定义窗口如何进行计算的操作,这就是所谓的“窗口函数”(windowfunctions)。经窗口分配器处理之后,数据可......
  • 绕过disable_functions的限制
    https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functionshttps://wiki.luoyunhao.com/web/Bypassdisable_function绕过disable_functions的限制disable_functions是php.ini中的一个设置选项,可以用来设置PHP环境禁止使用某些函数,通常是网站......
  • 【Azure Function App】在VS Code中,创建好Function App后部署到Azure中,无法选择Subscr
    问题描述在VSCode中,创建好FunctionApp后部署到Azure中,无法选择Subscriptions问题解答对于无法使用VSCode 部署FunctionApp 到Azure,最近有一个更新,导致了AzureResource 插件的 v0.8.0 版本不支持中国区登录目前的解决办法是:通过手动安装的方式把VSCode中的Azu......
  • 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件
    前天尝试通过one-api+dashscope(阿里云灵积)+qwen(通义千问)运行SemanticKernel插件(Plugin),结果尝试失败,详见前天的博文。今天换一种方式尝试,选择了一个旁门左道走走看,看能不能在不使用大模型的情况下让SemanticKernel插件运行起来,这个旁门左道就是从StephenToub那......
  • Java版Flink(十二)底层函数 API(process function)
    一、概述之前的转化算子是无法访问事件的时间戳信息和水位线watermark,但是,在某些情况下,显得很重要。Flink提供了DataStreamAPI的Low-Level转化算子。比如说可以访问事件时间戳、watermark、以及注册定时器,还可以输出一些特定的事件,比如超时事件等。ProcessFunction用......