👏

Semantic Kernelのプロンプトのテンプレート化

2023/12/20に公開

始めに

Semantic Kernelが日本時間2023/12/19に正式リリースされました。今後は破壊的変更も落ち着くと思われます。
まだ、Semantic Kernelの公式ドキュメントが日本語化されていないことからこれを機に少しずつSemantic Kernelの使用方法についてまとめていきたいと思います。

前提

Semantic Kernel 1.0.1
.NET 8

プロンプトのテンプレート化

通常、プロンプトをハードコードすると再利用が難しくなってきます。
そこで、プロンプト文字列を動的に作成することが求められてきます。
この、プロンプト文字列を動的に作成する方法がプロンプトのテンプレート化です。これを利用すると最終的に繰り返しのチャットなどを構築できるなどします。

プロンプトに変数を追加する

var chat = kernel.CreateFunctionFromPrompt(
@"{{$history}}
    User: {{$message}}
    Assistant:");

このプロンプトでは「history」と「message」の2つの変数を持っているためプロンプトを実行する時にこれらの値を含めることができます。
このプロンプトを実行する時はカーネルとチャットループを作成してAIとのやりとりを開始します。
そして、このプロンプトを呼び出す際にこの2つの変数を引数として渡すことができます。

コード全体

Kernel kernel = Kernel.CreateBuilder()
 .AddAzureOpenAIChatCompletion(
    "デプロイ名",
    "エンドポイント",
    "APIキー").Build();

var chat = kernel.CreateFunctionFromPrompt(
@"{{$history}}
    User: {{$message}}
    Assistant:");

ChatHistory history = [];
while (true)
{
    Console.Write("User: ");
    string? message = Console.ReadLine();
    if (message == "exit")
    {
        break;
    }
    else
    {
        var result = await kernel.InvokeAsync(chat, new() {
            { "message", message},
            { "history", string.Join("\n", history.Select(x => x.Role + ": " + x.Content))},
        });
        Console.WriteLine(result.ToString());
        history.AddUserMessage(message!);
        history.AddAssistantMessage(result.ToString());
    }


}

kernel.InvokeAsync()の引数に先ほど作成したプロンプトを渡し、第2引数でプロンプトの引数を渡しています。

実行結果

会話の整合性がとれているので良さそうです。

Discussion