最近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が読み込まれる。
今回は「Plugins/SemanticPlugins」フォルダの下にPluginを2つ(ねこ語翻訳、指定言語翻訳)入れているので、これらのPluginが読み込まれる。
// カーネルの初期化 IKernel kernel = new KernelBuilder().WithOpenAIChatCompletionService("gpt-3.5-turbo", api_key).Build(); // セマンティックスキルの読み込み IDictionaryplugins = 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は「日本語→ねこ語」しか対応していないため、翻訳Pluginを使用して「英語→日本語」を行っていることがわかる。
ただ、フランス語を入れてみると残念な結果に。。
これは翻訳Plugin側の情報が曖昧だったためらしく、config.jsonを「より詳細な指示にしつつ、英語で記載」してあげて、
再度実行してみると、無事動作!
ということで、Semantic KernelのPlanner機能は色々なことができそうで、しかも楽しいのでおすすめ!
コメント