學習材料
- Microsoft Semantic Kernel – Some Tips & Tricks To Get Rendered Prompts
- Templatizing your prompts
- Semantic Kernel 源碼中的示例 Example76_Filters
準備 .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>