引言
在上一章節我們熟悉了prompts functions
(提示函式)的建立,我們瞭解了PromptTemplateConfig
中各個屬性的簡單使用。Semantic Kernel
允許我們利用多種方式去建立prompts
包括native functions
,prompts functions
或者也叫Semantic functions
,和Yaml 檔案
等。
本章的我們將學習利用Yaml
的格式來定義prompts functions
。YAML
是一種結構化資料格式,透過使用它,我們可以將提示的不同部分集中在一個地方,更好地組織和管理程式碼。這種方法可以提高程式碼的可讀性和維護性,使得對提示模板的修改和更新變得更加簡單和高效。
實戰
還是跟之前的章節一樣,我們透過OneApi+星火訊飛v3.5
進行我們的Semantic Kernel
的學習,具體配置可以翻翻我前幾章內容。
建立專案
VS 建立控制檯應用程式,右鍵管理使用者機密,新增我們大模型的應用配置
{
"OneApiSpark": {
"Endpoint": "http://localhost:3000",
"ModelId": "SparkDesk-v3.5",
"ApiKey": "sk-LAYzQaWssCYYEVHP1d6a3fFa111745249e94F0364a0cF37c"
}
}
安裝 Nuget 依賴
PM> NuGet\Install-Package Microsoft.SemanticKernel -Version 1.13.0
PM> NuGet\Install-Package Microsoft.SemanticKernel.Yaml -Version 1.13.0
建立 Yaml 檔案
建立檔案
接下來 滑鼠點選joke.yaml
檔案右鍵 點選屬性,設定檔案輸出目錄
Yaml 檔案編寫
我們將編寫一個簡單的提示函式,目的是生成笑話。
yaml
檔案的內容其實就是我們上一篇講解的PromptTemplateConfig
函式的 yaml
的表達形式。找到我們上一章節的PromptTemplateConfig
的建立加深理解
var kernelFunctions = kernel.CreateFunctionFromPrompt(new PromptTemplateConfig()
{
Name = "intent",
Description = "use assistant to understand user input intent.",
TemplateFormat = PromptTemplateConfig.SemanticKernelTemplateFormat,//此處可以省略預設就是"semantic-kernel"
Template = "What is the intent of this request? {{$request}}",
InputVariables = [new() { Name = "request", Description = "The user's request.", IsRequired = true }],
ExecutionSettings = new Dictionary<string, PromptExecutionSettings>() {
{
OpenAIPromptExecutionSettings.DefaultServiceId ,//"default"
new OpenAIPromptExecutionSettings()
{
MaxTokens = 1024,
Temperature = 0
}
},
}
});
那開始編寫我們的 yaml
name: GenerateJoke
template: |
Tell me a joke about {{$topic}} that is {{$length}} sentences long.
template_format: semantic-kernel
description: A function that generates a joke about a topic.
input_variables:
- name: topic
description: The topic of the joke.
is_required: true
- name: length
description: The number of sentences in the joke.
is_required: true
output_variable:
description: The generated joke.
execution_settings:
default:
temperature: 0.9
max_token: 1024
透過PromptTemplateConfig
物件來理解就可以事半功倍了,寫 yaml 完全沒壓力,裡面的每一個屬性細節在上一章節都有介紹,不熟悉的可以去上一章閱讀一下。
SK 建立 prompts functions
//定義kernel 物件
var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: config.ModelId,
apiKey: config.ApiKey,
httpClient: client).Build();
//讀取yaml檔案地址
var yamlDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins", "Yaml", "joke.yaml");
var promptYaml = await File.ReadAllTextAsync(yamlDirectory);
KernelFunction jokeFunc = kernel.CreateFunctionFromPromptYaml(promptYaml);
KernelArguments kernelArgs = new KernelArguments()
{
{"topic","apple"},
{"length","5"},
};
// 用核心呼叫函式並提供kernelArguments
FunctionResult results = await jokeFunc.InvokeAsync(kernel, kernelArgs);
Console.WriteLine(results.ToString());
輸出
大功告成!
最後
本章簡單的熟悉了一下用Yaml
檔案來建立prompts functions
,用 YAML
提示不僅簡化了開發過程,還提高了應用程式的可維護性,為以後定義更加複雜的prompts
內嵌函式,工作流等又進了一步 😃。
參考文獻
yaml-prompts-with-semantic-kernel
本文原始碼
😄歡迎關注筆者公眾號一起學習交流,獲取更多有用的知識~