Semantic Kernel入門系列:利用YAML定義prompts functions

董瑞鹏發表於2024-05-22

引言

在上一章節我們熟悉了prompts functions(提示函式)的建立,我們瞭解了PromptTemplateConfig中各個屬性的簡單使用。Semantic Kernel允許我們利用多種方式去建立prompts包括native functions,prompts functions或者也叫Semantic functions,和Yaml 檔案等。

本章的我們將學習利用Yaml的格式來定義prompts functionsYAML 是一種結構化資料格式,透過使用它,我們可以將提示的不同部分集中在一個地方,更好地組織和管理程式碼。這種方法可以提高程式碼的可讀性和維護性,使得對提示模板的修改和更新變得更加簡單和高效。

實戰

還是跟之前的章節一樣,我們透過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 檔案

建立檔案

image

接下來 滑鼠點選joke.yaml檔案右鍵 點選屬性,設定檔案輸出目錄

image

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());

輸出

image

大功告成!

最後

本章簡單的熟悉了一下用Yaml檔案來建立prompts functions,用 YAML提示不僅簡化了開發過程,還提高了應用程式的可維護性,為以後定義更加複雜的prompts內嵌函式,工作流等又進了一步 😃。

參考文獻

yaml-prompts-with-semantic-kernel

本文原始碼

😄歡迎關注筆者公眾號一起學習交流,獲取更多有用的知識~
image

相關文章