😺

Semantic Kernelのネイティブプラグイン使ってるけどもPrompty使いたい!

に公開

Promptyで何がうれしいの?

プロンプトや各種設定を外部化できてそれをファイルひとまとめで管理できるところ。
これまでは、プログラムの中に埋め込みされていてこれを再利用しようと思ったら一つ一つチェックしながら移植しなければならなかったので抜け漏れがないか大変だった。

ネイティブプラグインのなにがうれしいの?

LLMの判断によってネイティブコードを実行できるところ。
もちろん、C#やJava、Pythonのコードによって人の判断を挟むということも可能ですし様々なリソースにアクセスして新たな情報を収集してLLMに与えるというような可能性も広がってきます。
コードを実行できるということはその箇所においては非常に堅牢な処理になるということを示唆しています。つまり、LLMの柔軟な入力と判断に対して実行そのものは従来のソフトウェアのように堅牢な処理という組み合わせが可能になっています。

コード例

いつものお天気を問い合わせるプラグインをつかって例示します。

Nuget

Semantic KernelのPrompty対応のライブラリーは未だアルファー版です。

Visual Studioでは「Microsoft.SemanticKernel.Prompty」でプレスリリースを含めるにチェックをいれて検索してください。

呼び出し側

大事なところのエッセンスのみ。
適時補ってください。

Program.cs
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
   deploymentName,
   endpoint,
   new DefaultAzureCredential());  

builder.Services.AddSingleton<HttpClient>();
builder.Plugins.AddFromType<WeatherPlugin>();
Kernel kernel = builder.Build();  // kernel作成

#pragma warning disable SKEXP0040 // 種類は、評価の目的でのみ提供されています。将来の更新で変更または削除されることがあります。続行するには、この診断を非表示にします。
var prompty = kernel.CreateFunctionFromPromptyFile("weather.prompty");
#pragma warning restore SKEXP0040 // 種類は、評価の目的でのみ提供されています。将来の更新で変更または削除されることがあります。続行するには、この診断を非表示にします。

// プラグイン自動選択設定
PromptExecutionSettings promptExecutionSettings = new()
{
    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
}; 

while (true)
{
    Console.Write("User > ");
    string input = Console.ReadLine()!;

    if (string.IsNullOrEmpty(input))
    {
        break;
    }
    else
    {

        var result = await prompty.InvokeAsync(kernel, new KernelArguments(promptExecutionSettings)
        {
            ["question"] = input
        });  // プラグイン自動設定を引数に渡す
        Console.WriteLine($"Assistant > {result}");
    }
}

Prompty

promptyファイルは以下の通り

weather.prompty
---
name: WeatherPrompt
description: 日本の天気をわかりやすく教えてくれるプロンプト
authors:
  - Tomomitsu Kusaba
model:
  api: chat
  parameters:
    max_tokens: 3000
sample:
  question: 品川の天気を教えてください
---
system:
日本の天気をわかりやすく教えてくれるプロンプトです。
回答には次の要素を含める必要があります。
・地域名
・天気
・気温
・降水確率

user:
{{question}}

プラグイン部分に関しては今回は手が入っていないので以下参照してください
https://github.com/tomokusaba/WeatherPlugin/blob/master/ConsoleApp16/WeatherPlugin.cs

実行結果


想定通り、正しく結果が取得できているようです。

まとめ

今回のポイントとしてはKernelArgumentsのパラメータにPromptExecutionSettingsのインスタンスを渡すというところでした。
PromptExecutionSettingsでは関数自動呼び出しの設定を入れておきます。

Discussion