Semantic Kernel 學習筆記:Prompt Filter 與 Handlebars Prompt Template

學習材料

準備 .NET Console 項目

dotnet new consoele
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.PromptTemplate.Handlebars

體驗 Handlebars Prompt Template

通過 {{input}} 添加模板變量,通過 CreateFunctionFromPrompt 基於模板創建 function,示例代碼:

var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-3.5-turbo", apiKey);
var kernel = builder.Build();

var input = "博客園";
var template = "{{input}}是什麼網站";

var getIntent = kernel.CreateFunctionFromPrompt(
    new() { Template = template, TemplateFormat = "handlebars" },
    new HandlebarsPromptTemplateFactory());

var result = await kernel.InvokeAsync(
    getIntent,
    arguments: new() { { nameof(input), input } });

Console.WriteLine(result);

體驗 Prompt Filter

實現 IPromptFilter 接口

#pragma warning disable SKEXP0004 
internal class PromptFilter : IPromptFilter
{
    public void OnPromptRendering(PromptRenderingContext context)
    {
        var argument = context.Arguments.First();
        Console.WriteLine($"Rendering argument: ({argument.Key}: {argument.Value})");
    }

    public void OnPromptRendered(PromptRenderedContext context)
    {
        var prompt = context.RenderedPrompt;
        Console.WriteLine($"Rendered prompt: {prompt}");
    }
}
#pragma warning restore SKEXP0004

註冊 prompt filter

#pragma warning disable SKEXP0004
kernel.PromptFilters.Add(new PromptFilter());
#pragma warning restore SKEXP0004

運行程序,PromptFilter 輸出如下:

Rendering argument: (input: 博客園)
Rendered prompt: 博客園是什麼網站

手動渲染 Handlebars Prompt Template

安裝 nuget 包

dotnet add package Microsoft.SemanticKernel.Yaml

創建 yaml 格式的 prompt 模板

var yaml = """
    name: about-website
    description: Ask about a gevin website
    template_format: handlebars
    template: | 
      <message role="user">{{website}}是一個什麼網站</message>
    input_variables:
      - name: website
        description: user input website name
        is_required: true
    """;
var website = "博客園";

通過 KernelFunctionYaml.ToPromptTemplateConfig 將 yaml 配置內容轉換爲 PromptTemplateConfig,然後調用 IPromptTemplate.RenderAsync 方法渲染模板

var promptTemplateConfig = KernelFunctionYaml.ToPromptTemplateConfig(yaml);
var factory = new HandlebarsPromptTemplateFactory();
if (factory.TryCreate(promptTemplateConfig, out var promptTemplate))
{
    var prompt = await promptTemplate.RenderAsync(
        kernel,
        arguments: new() { { nameof(website), website } });
    Console.WriteLine(prompt);
}

運行程序,輸出如下:

<message role="user">博客園是一個什麼網站</message>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章