C# Semantic Kernelを使ってOpenAIのGPTを呼び出す|第3回Plannerの使用

最近OpenAIを含めたAIの勉強を始めたので、その内容をメモ。

今回はPlannerを使用してSemantic Kernelに登録したFunctionを順次実行してみる。

スポンサーリンク

事前準備

事前準備としてSemantic Kernelをインストールしたコンソールアプリを用意しておく。

今回やりたいこと

Semantic Kernelに

  • 日本語のテキストをねこ語に翻訳するPlugin(前々回作成)
  • 入力テキスト指定言語に翻訳するPlugin

を登録して、「日本語以外の言語で与えた文章を「ねこ語」に変換するプランをPlannerに立てて実行してもらう。

(簡易)入力テキストを指定言語に翻訳するPlugin作成

まずは入力テキストを指定言語に翻訳するPluginを作成する。

Pluginのconfig.jsonはこんな感じで用意して、
skprompt.txtはこんな感じで用意。
簡単に動作確認してみると、
(かなり直訳っぽいけど)無事動作!

Plannerの実装

今日の本題、Plannerの実装はこんな感じ。
カーネルの初期化から、セマンティックスキルの読み込みは前々回の通り。
今回は「Plugins/SemanticPlugins」フォルダの下にPluginを2つ(ねこ語翻訳、指定言語翻訳)入れているので、これらのPluginが読み込まれる。

// カーネルの初期化
IKernel kernel = new KernelBuilder().WithOpenAIChatCompletionService("gpt-3.5-turbo", api_key).Build();

// セマンティックスキルの読み込み
IDictionary plugins = kernel.ImportSemanticSkillFromDirectory(@".\Plugins", "SemanticPlugins");
続いてPlannerを作成して、やりたいこと(今回は英語のテキストをねこ語へ翻訳)を渡し、プランを作成してもらう。

// Planner を作って、やりたいことを渡す
var planner = new SequentialPlanner(kernel);
Plan plan = await planner.CreatePlanAsync("次のテキストを猫語に翻訳してください。「Would you call a taxi, please?」");
実行には直接関係ないけど、Plannerが作成してくれたPlanの中身(Step)を表示してみる。
どんなプランになっているかがこれで分かる。

foreach (var step in plan.Steps)
{
    Console.WriteLine($"・Plugin「{step.Name}」を実行する。");
}
最後に立ててくれたStepを「StepAsync」で順次実行していく。

while (plan.HasNextStep)
{
    Console.WriteLine($"- {plan.Steps[plan.NextStepIndex].Name}を実行しています。");
    await kernel.StepAsync(plan);
    Console.WriteLine($"出力: {plan.State.Input}");
    Console.WriteLine();
}

実行

ということで、実行してみるとこんな感じ。
今回用意した「ねこ語に翻訳する」Pluginは「日本語→ねこ語」しか対応していないため、翻訳Pluginを使用して「英語→日本語」を行っていることがわかる。
ただ、フランス語を入れてみると残念な結果に。。
これは翻訳Plugin側の情報が曖昧だったためらしく、config.jsonを「より詳細な指示にしつつ、英語で記載」してあげて、
再度実行してみると、無事動作!

ということで、Semantic KernelのPlanner機能は色々なことができそうで、しかも楽しいのでおすすめ!

コメント

タイトルとURLをコピーしました