皆さんこんにちは。健康診断の結果がちょっと気になる年齢になってきたSsk1029Takashiです。
GPT-3を扱ってチャットボット作ってみる記事の第2弾になります。
第1弾のこちらもぜひご覧ください。
acro-engineer.hatenablog.com
前回は質問応答システムとしてGPT-3を活用しましたが、今回はAIアシスタントとしてGPT-3を活用してみます。
AIアシスタントとは何かというと、Google Homeのように命令を入力すると、それに沿った処理を実行してくれるシステムを指します。
ChatGPTとの違いは命令の結果は必ずしも文章生成だけではないということです。
ChatGPTでは文字列を入れて、要求に沿った文字列を返します。
対して、AIアシスタントでは、カレンダーに予定を入力したり、アラームを設定したりなど、具体的なタスクを実行します。
この記事では、前回に続きGPT-3を使ってAIアシスタントを簡単に作る初手の検証をしてみます。
概要
仮に自分が以下のようなスクリプトを手元に持っているとしましょう。
普段は引数を自分で入力して起動していますが、指定するのが手間なので、ホームアシスタントのように命令を入力するだけで適切なスクリプトを実行するようにしてみたいですよね。
その場合、命令文から以下の情報を抜き出すことが必要になります。
- タスクの種類(type)
- 時間情報(when)
- コンテンツ内容(what)
- 誰が(who)
例えば「明日の10:00までに会議の報告資料を作るタスクを自分に登録して」という命令を入力したとすると以下のように解釈する必要があります。
type=task when=明日の10:00 who=自分 what=会議の報告資料を作る
各属性を付けて情報を抽出すれば後は、スクリプトに流し込むだけでタスクが登録できます。
このように、非構造な文章から構造化された情報を抜き出すタスクを「Information Extraction」と言います。
カスタマイズしたAIアシスタントを作るときにはこのInformation Extractionを使って以下の流れで命令を実行させることになります。
今回はこの図の点線の部分で囲っている、自分だけのAIアシスタントの命令解釈部分をGPT-3を使って作ってみましょう。
実際に試してみる
実はGPT-3は何も学習していない状態でも、Information Extractionに近いことはできます。
例えば入力に「明日の10:00までに会議の報告資料を作るタスクを自分に登録して」という文章を入れた後に、下記のような取得したい情報を並べます。
明日の10:00までに会議の報告資料を作るタスクを自分に登録して type= when= who= what=
すると、入力した情報を埋める形で構造化された情報が出てきます。
(なぜか英語ですが、、)
ということはGPT-3は事前学習の段階でInformation Extractionに近いタスクをすでに学習していることが推測されます。
とはいえ、素の言語モデルで解けてしまうのはすごいですね。自分も試して驚きました。
ただし、今回はtypeの部分は自分が用意したタスクの種類に絞る必要があります。
typeは文章中からある程度、実行内容の種類になりそうな内容をGPT-3が解釈して付与します。
事前に何が振られるか定義しているわけではないので、今のままだとこちらが用意していないtypeを振られてしまい、起動するスクリプトを適切に選べなくなる可能性があります。
それを防ぐために、以下のプロンプトのように事前にいくつかパターンを与えておくと比較的安定して情報を抽出できます。
明日の10:00までに会議の報告資料を作るタスクを自分に登録して type=task when=明日の10:00 who=自分 what=会議の報告資料を作る ### 今週水曜の15:00に自分と上司で設計検討するための打ち合わせを登録しておいて type=meeting when=今週水曜の15:00 who=自分と上司 what=設計検討するための打ち合わせ ### プロジェクトのキックオフがあるから予定入れて。 参加者はプロジェクトチーム全員で、今週の水曜17時から type= when= who= what=
上記の例では文章が2つに分かれていたり、要素の出現順が異なるなど与えられた例とは表記の揺れがありますが、各要素を的確に抽出してくれます。
このように、2~10程度の少数の例を与えて言語モデルに特定のタスクを覚えさせることをFew-shotと言います。
Few-shotを使うと、例を与えないときよりも安定した挙動を言語モデルにさせることができるので便利です。
タスクの種類を増やしてみる
前の章では2種類のタスクに必要な構造化された情報を文章から抽出することに成功しました。
では、タスクの種類を一つ増やしてみましょう。
例えば、目的地への交通手段を教えてほしいというタスクを追加するとしましょう。
今回追加するタスクは「場所」という要素が追加されている代わりに「いつ」「誰が」という要素はタスクに必要ありません。
この場合はどのようにするかというと、以下のようにwhereという要素を追加して、要素がない文章に対しては-で返すように覚えさせます。
今日の10:00までに会議の報告資料を作るタスクを自分に登録して type=task when=明日の10:00 who=自分 what=会議の報告資料を作る where=- ### 今週水曜の15:00に自分と上司で設計検討するための打ち合わせを登録しておいて type=meeting when=今週水曜の15:00 who=自分と上司 what=設計検討するための打ち合わせ where=- ### 新横浜への電車を教えて type=traffic when=- who=- what=電車 where=新横浜 ### 渋谷へ行くための交通手段を教えて type= when= who= what= where=
すると以下の実行結果のように、必要な要素だけ情報を抽出して教えてくれます。
このようにパターンを増やしつつ、解釈できるタスクを増やしていけば後はそれに対応して実行するスクリプトなりツールを用意すればAIアシスタントを拡張できそうです。
まとめ
今回は自分だけのAIアシスタントを作るためにInformation Extractionを文章に実行して、命令を解釈する部分をGPT-3を使ってお手軽に作ってみました。
ただし、命令が増えれば増えるほどプロンプトが膨らんできてしまうのがこの手法の難点です。
その場合は、Fine Tuningを利用するなどして専用のモデルを作成するなどは必要になりそうです。
とはいえ、今までこういった解析器を作ろうとすると、データセットを用意して学習して、それでも精度に問題が出るなどかなり手間がかかりましたが、GPT-3を使うことで簡単に自分のシステムに組み込めるようになりました。
皆さんもぜひお試しください。
それではまた。
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。