FIXER Tech Blog - AI/Machine Learning
FIXER cloud.config Tech Blog
未来が来た!! Semantic KernelでAIのタスク実行計画を自動立案!
2023年06月22日 10時30分更新
本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「未来が来た!!Semantic KernelでAIのタスク実行計画を自動立案!」を再編集したものです。
ChatGPTの登場以来、未曾有のAIブームが到来している昨今。しかしChatGPTだけではできないことも多くあります。例えばウェブやデータベースから最新の情報を取得するなどのより複雑なタスクをこなそうと思えば、単純なプロンプトのやりとりだけでないプログラムとの連携が必要になるでしょう。
しかしAIと違ってプログラムは融通の効かないもの。色々な入力や応答があり得るAIとのやり取りの中に、スムーズにプログラムを組み込むのは中々に骨が折れます。一体いくつの場合を想定して、どのような条件分岐をすれば全てを網羅できるのでしょう?
ほとんど無理に近いですよね。
Semantic Kernelって何者?
そこで今回ご紹介するのが、Semantic Kernelです。これを使えばなんと、タスク実行計画を自動で立案してくれるんです!!! 凄すぎる!!! もし自動にしたくない部分があれば、手組みもできます。類似のLangChainとの違いが気になる人は、手動にもできる部分が多いのが違いだと思って貰えれば大丈夫です。
更に、プロンプトと通常のプログラムを同じ「スキル」という枠組みで同列に扱ってプログラムが組めるんです。スキルを使うときに気にするのはI/Oだけでよく、中身がプロンプトか普通のプログラムかは全く気にする必要がありません。
これは4月ごろからMicrosoftがOSSとして開発している、非常に新しいライブラリーです。6月現在では、プレビュー版としてGitHubおよびNPMで公開されています。
以下の画像はMicrosoft公式の解説ページに掲載されているもので、①の入力を受けた後に、②で複数の機能を組み合わせてタスクを実行し、③の回答を返す様子が図示されています。
実装してみよう
今回はごく簡単な実装で、スキルを2個組み合わせて返答文を作るコードを書いてみます。
作成するもの
・Semantic Function(プロンプトを使ったスキル)
・Native Function(コードを使ったスキル)
・Kernelの設定
・スキルの実行用コード
事前準備
Azure OpenAI Serviceが使える方は、まず該当のリソースを作成して、gpt3.5-turboのモデルをデプロイしておいてください。作成できない方は、OpenAIのアカウントを通じて直接モデルを利用する方法もあります。その場合OpenAIのアカウントを取得しておいてください。
続いて.NET7が実行できるプロジェクトを作成してください。その後NuGet Package Managerで以下のコマンドを実行し、Semantic Kernelのライブラリーをインストールします。
※バージョンは頻繁に更新されているので、GitHubのReleasesの最新のバージョン番号を用いてください。NuGet Galleryのページからも取得できます。
Package Manager以外を用いてインストールする場合は、NuGet Galleryのページから使いたい方法に合ったコマンドを取得してください。
Semantic Functionの作成
AIへのプロンプトと、APIコール時のパラメーターなどを指定します。設定ファイルとプロンプトのファイルを以下のようなディレクトリ構成で作成してください。
ディレクトリ名は自由に変えて構いませんが、ファイル名は絶対に変更しないでください。ディレクトリ名を変更した場合は後述の実行コードでの指定ディレクトリ名も適宜変更してください。
Skills以下に全てのスキルを格納する形式となっていて、その直下のディレクトリがスキル群(正式名: Skill)、更にその配下のディレクトリが特定の機能を持つスキル(正式名: Function)です。後述の実行コード上では、スキル群の単位で読み込みます。
各ファイルの内容は以下の通りです。
config.json:
コンフィグの各項目のうち、よく触るのはdescription、completion、inputの3項目です。
descriptionにはタスクの実行計画が立てられる際に参照される説明文を記述します(超重要)。
completionにはOpenAIのAPIに送る各種パラメーターを設定します。パラメーターの意味については他に解説記事が多くありますので、調べてみてください。
inputにはこのスキルが受け取る引数を記述します。引数名と説明書き、デフォルト値が指定できます。
skprompt.txt:
プロンプトには一般的なプロンプトの形式に加えて、引数を代入する記述ができます。引数名としてコンフィグで指定したものを記述すれば、実行時に自動で引数を受け取ることができます。なお引数名に大文字小文字の区別はありません。
Native Functionの作成
C#のコードをSemantic Kernelのスキルとして認識させられる形で書きます。C#のファイルを以下のようなディレクトリ構成で作成してください。
先程作成したSemantic Functionと合わせると以下のようになっているはずです。
C#のファイルには次のように記述します。
SKFunction属性をつけ、パラメーターにこのスキルの説明文を記述します。この説明文はSemantic Functionのときと同様に、タスクの実行計画を立てる際に参照されます。
付けられる属性や関数の組み立て方は他にもありますが、その解説は後続の記事に譲ります。
このスキルでは、入力にジョン・スミスという人物の発言だという補足情報を付加しています。
Kernelの設定
全体の管理をするKernelを設定していきます。今回はAIのモデルに対する接続のみ設定します。
GPTではなくdavinciなどを用いる場合はメソッド名のChatをTextに置き換えてください。
もしメモリー機能やEmbeddingの利用、DBなどと接続したい場合はKernelの作成時に追加で設定を記述します。今回はその具体的な書き方には触れません。
スキルの実行用コードの作成
ここまでに作ったスキルを実際に動かしてみましょう!
Kernelの設定を書いた部分の下へ追記する形で、以下のコードを書いていってください。
スキルはKernelにインポートしてから使います。SemanticスキルとNativeスキルで読み込み用の関数が異なるので注意してください。
今回は最も簡単に扱えるSequentialPlannerを使います。これは与えられた全てのスキルの中から、タスク遂行に適したスキルの選択と実行順の組み立てを自動でこなしてくれるものです。タスクが単純でスキル数も少ないうちは、これを使うだけで大丈夫です。
プランナーに入力を与えて、プランを自動で立案させます。ここでは適当な文字列を定義していますが、実際はユーザー入力などを与えてプランを作らせます。
ユーザー入力に追加の指示文などを加えて入力文字列とすると、精度が向上する場合もあります。
作成されたプランを表示して確認したいときは、上記のようにするとJSON形式で表示させられます。
最後にプランを実行し、結果を出力させてみましょう。
実行結果
私の手元で実行したときには、プランナーの立てたプランは以下のように出力されました。
プランは入れ子構造になっていて、最も外側のプランのsteps項目の配下に、各ステップに対応する具体的な内容が書かれています。この場合では、まず ProvideInfo に「ジョン・スミスとは何者か?」という入力を送ってから、その結果を ExampleGeneralResponse のADDITIONAL_INFOへ送り、その入力には「よろしくお願いします!」と送っている様子が見えます。
これが妥当なプランかは微妙なところですが、一応プランとしては成立しているようです。
このプランを実行した結果は、こう出てきました。
案外悪くないように見えます。冒頭に余計なものが入っていますが、これはスキルのプロンプトにワンショットの例を書いておけば、だいたい消えてくれます。
最後に
今回は簡単な例でしたが、この仕組みを使えばデータベースから検索した情報を差し込んだり、ウェブ検索した情報を差し込んだり、別のプロンプトで解釈させた結果を参照したりなど、様々なことが可能になります。
Semantic Kernelにはこれ以外にもメモリー機能や、外部へのコネクター、より抽象レベルの低いプランの立て方など、まだまだ多くの紹介したい部分がありますが、それらの紹介は次以降の記事ですることにします。
Semantic Kernelは今まさに猛スピードで開発が進んでいるライブラリーなので、今後機能が増えたり、使い方が変わってより便利になる可能性は高いです。今からぜひ触ってみてはいかがでしょう。
海老原広汰/FIXER
ソーシャルVRの隆盛と、宇宙に人が住む未来を夢見る者。
未来の世界へ向けて、一歩を踏み出し続けます。
この連載の記事
-
TECH
生成AIに感謝を伝えると回答精度が向上する? GaiXerで検証した -
TECH
生成AIアシスタントのAmazon QにS3のデータソースを連携する方法 -
TECH
LLMをローカルPCで動かし“話し相手”を作ってみた結果…… -
TECH
インスタグラムのエフェクトを「Meta Spark Studio」で自作してみた -
TECH
インスタエフェクト自作第二弾!“小顔デカ目効果”を作る -
TECH
RAGの基礎知識を得て“ゼロ円RAGシステム”を構築してみた -
TECH
Microsoft Fabricを触ってデータサイエンスに超入門してみた! -
TECH
LLM活用はチャットだけじゃない、自由記述文を共通フォーマットに落とし込む方法を学んだ -
TECH
Gemini 1.5 Proの特徴とは? Gemini API経由で試す -
TECH
Azure OpenAIの便利な「jsonモード」の使い方&制限事項 -
TECH
生成AIのClaude 3に本格的なコーディングをさせるプロンプトを作った - この連載の一覧へ