アジェンダを紹介

佐々木峻氏:自己紹介ですね。Acroquest Technologyの佐々木と申します。ふだんは主に検索システムあたりの開発をやっています。

軽くうちの会社の紹介だけさせてください。新横浜にあるシステム開発の会社で、主にIoT関連やデータ分析などをやっています。

最近は、「ChatGPT」と検索システムの結合などをやり始めているので、検索とChatGPTを組み合わせたいという要望があれば、お問い合わせください。

というところで、今日話すことは、3つですね。まず、ReActについて話をして、「Semantic Kernel」がどういうふうに使えるのかといったところで、実際にちょっと作ってみましょうという話をしていきます。

ユーザーの入力をGPTが解釈して、実行は外部ツールを使用する「ReAct」という考え方

まず、ReActという考え方の話ですね。ReActは、ユーザーの入力をGPTが解釈して、実行は外部ツールを使用するという考え方です。

GPTはどこまでいっても言語モデルなので、やはり文字列を入力して、文字列を返すことしか基本はできません。そういったところの拡張性をほかのツールにやらせよう、プログラムに書かせて実装させようというのがReActの考え方です。

例えば、「OpenAI APIの使い方について、検索してまとめを教えてください」というのであれば、GPTの3モデルが、「OpenAIのAPIの使い方で検索する」というところを考えて、そこから外部ツールを呼び出して、「OpenAI API」みたいなところで検索して、戻ってきた値を「今度は要約しよう」と考えて、予約自体はまた別ツールでやるというのがReActの考え方になります。「Reasoning」と「Action」といったところが「ReAct」の考え方になります。

先ほど言ったとおり、言語モデルは文字列を入れて文字列を返すことしかできませんが、それとの連携が取れるといったところがうれしいところになります。

ReActを活用したアプリケーションを実装できるライブラリ「Semantic Kernel」

そんな中で、じゃあSemantic Kernelとは何かという話なんですが、このライブラリ。ロゴらしいロゴはないのですが、ReActを活用したアプリケーションを実装できるライブラリです。

もう1個よく使われるのは、この「LangChain」ですが、(Semantic Kernel)はこれの後発ライブラリですね。

言語はC#かPython。マイクロソフトらしくC#が必要なパーツなので、大人しくC#を使っておいたほうがいいですね。ReActのアプリを簡単に実装できるライブラリです。

Semantic Kernelにおける、2つの概念

簡単な動作イメージですが、概念としては「Kernel」と「Skill」というものがあります。Kernelというのは、先ほどお話ししたReasoning、考えるところ。Skillは、具体的に何をするか? といったところのツールの部分になります。

LangChainは、AgentとToolで分かれていますが、そのSemantic Kernelバージョンです。

ちょっと細かい説明がいろいろ入りますが、Kernelは、先ほどお話ししたとおり処理全体を制御する役割を持っています。

Skillは何ができるか? というところですが、2種類あります。Semantic Functionは、プロンプトのテンプレートを持っているだけの、これを呼び出すというところのSkillですと。

Native Functionは、実際にC#でプログラムで実装して、そのとおりに動かすファンクションです。

Semantic Kernelはおもしろいのが、Plannerという機能があることで、Plannerはユーザーの入力から、どのSkillをどの順番に実行すると良いか、最初に実行計画というのを立ててくれるんですね。

(スライドを示して)例えばここにあるように、「GPTをアシスタントとして使うための情報があるか検索して要約してください」と書くと、最初にサーチが来て、GPTをアシスタントとして使うための情報を検索して、次の行でSummaryDocumentを動かして、要約します。最後に、その結果を出力しますよと計画を立ててくれます。

Semantic Kernelの作り方 その1「Skillを作成する」

というところで、「実際にSemantic Kernelを作る時、どういうふうに作ればいいの?」というところを、さらさらと流していきます。

先ほども言ったとおり、作るもののイメージはこのような感じで、「Elasticsearch」の検索ができて、予約できるという2つのSkillを持ったアプリをちょっと簡単に作ってみたいと思います。

やること。Skillを作って、Kernelを実装して、実行してみる、という感じですね。作るSkillは2つです。要約するSkillと、Elasticsearchで検索するSkillです。

最初に、要約するのはGPTに任せればいいので、Semantic Functionを作ります。用意するものは2つで、まずはconfigですね。これはLLM、GPTでのパラメーターを定義するものです。

大事なのが、この中のdescriptionで、ここの中でこのスキルは何ができるものですよと説明ができます。これの説明を見て実行計画を立てるので、ここで適当なことを言うと、ぜんぜん的外れな実行計画を立てられてしまいます。なので、ここは簡潔になるべく英語で書いてあげると、まともな出力になります。

このskpromptがテンプレートですね。このinputに、実際に実行計画を立てた時のinputが入ってきます。

ちょっとこれは細かいので、Elasticsearchで検索しているとだけ覚えてください。Native Functionの実装はこんな感じで作ります。

ここも同じくdescriptionで、この関数は何をするのかというところを簡単に説明しています。

あとはこれを配置して、ディレクトリの中に配置して……。

といったところで、このSkillを配置して、実際に動かしてみます。

Semantic Kernelの作り方 その2「Kernelを実装する」

Kernelを実装するところに入ります。段階は主に3つで、Skillを登録して、実行計画を立てて、順番に実行していきます。

まずは、Semantic Kernel自身が実行計画を立てるのに使うモデルを定義して、あとはPlannerというSkill……これもSkillの1個なので使えるように登録します。

じゃあちょっと、「Plannerでどのぐらいのことまでできるの?」というのを簡単なデモでお見せします。

例えば、簡単な文章ですね。これはただ単に検索するだけなので、要約まではしなくていいパターンですね。これをやると、出力でサマリーだけを実行するといったところが出てきます。

では次に、「検索して、次に要約してくれ」というのが出てきたらどうなるかというと、先ほど見せたとおり、1回検索して、その後サマリーします。その結果を出力するというところに、計画が立てられます。こっちがいろいろ考えなくても、いい感じに道筋をつけてくれてすばらしいといったところですね。

Semantic Kernelの作り方 その3「実行してみる」

実際に実行してみると、本当はちょっと長ったらしいコンソールが出てきて、順番に実行計画を立てたものを実行していくのですが、最終的には、検索結果を踏まえて要約したものが出てきます。といったところがSemantic Kernelの説明ですね。

まとめ

まとめです。まず、Semantic Kernelを使うとReActで簡単に外部ツールと連携したものが実行できます。あとはPlannerが非常にいい感じに実行計画を立ててくれるので、ちょっと便利ですよねといったところになります。

というところで、詳しくは以下のブログに書いているので、ぜひご覧いただければと思います。

ご清聴ありがとうございました。

(会場拍手)