外部情報を取得して文脈として与える考え方「Grounding」

蒲生弘郷氏(以下、蒲生):時間的にはあと5分しかないんですが、すみません、延びるのを前提でやらせてもらいます。

外部情報を取得して文脈として与える考え方に「Grounding」というものがあります。いきなり出てきて何なのかという話になってくるんですが、いわゆるBing Chatに近いものです。

Bingは基本的にサーチをかけていって、そのサーチした結果をGPTに返してくるんですが、次のステップに進む前にこの動きを(まず)理解してもらおうかなと思います。

これって実際にはGPTが勝手に解釈して勝手につなぎにいっているわけではなくて、例えば「2023年のWBC優勝国はどこ?」と聞かれた場合には、バックエンドプログラムが処理を1回受け取っています。バックエンドプログラムの処理を受け取って、チャット内容をGPTに1回渡して、「クエリ化をしなさい」という指示を出します。

これをクエリ化して、「WBC、2023年、どこ?」とそのまま打ってもいけないので、「WBC 2023 優勝国」みたいなかたちにクエリに直してあげて、その検索結果を返させて、バックエンドプログラムで再び質問する。

「ユーザーが書いている質問と、(その)検索結果はこういうものが得られています」というところを加味した上で回答させるといった動きをしているんですね。

こういう外部ツールに接続をさせていくような考え方をGroundingと呼んでいるんですが、Groundingという言葉はけっこう曖昧性が残っています。あくまでこの発表内ではGroundingという言い方をしていますが。これを使った新しいプロンプティングが出てきています。

「Grounding」を使った新しいプロンプティング「ReAct」

それが「ReAct」という考え方です。ReAct自体は名前がけっこうひとり歩きしていて広義な意味で扱われるケースも多いんですが、厳密に言うと「必要なGroundingをGPTに考えさせて、動的にタスク実行するようなプロンプティング」です。

具体的にどうなるのか、まずイメージからつかんでもらいます。「今から野球を始めるんだけど、おすすめの野球用具一式を教えて」と聞くと、先ほどGroundingが走っていったようなかたちでバックエンドプログラムが受け取りつつ、まずはWeb検索を走らせます。クエリ化をして、「初心者 野球用具 一覧」(の結果)を持ってきます。

この初心者の野球用具リスト。例えばバットとボールとかですね。この返ってきたリストに基づいて、今度はGPTが考えて次に何をするのかを決めて、商品DBや検索エンジンに初心者向けの情報を取りにいきます。ここは社内DBとかの位置付けですね。社内で持っている商品データベースみたいな位置付けだと思います。

単純に聞かれたものを検索して答えるんじゃなくて、「商品情報を受け取った上で、回答させるクエリに応じて、何をすべきなのかを判断して、GPTが回答を変えた」という振る舞いができるようなプロンプティングがあるんですが、それがReActというものです。

例えば「これを3つずつ買うと、いくらぐらいになります?」と聞かれた場合には、検索とか商品DBとかを見るんじゃなくて、計算機を呼び出してあげて、合計金額を返させた上で「53,000円です」と回答できます。

さっきPhase 3で紹介しましたが、動的にGPTが振る舞えるようになるというのは、こういったかたちが将来像として見えてきているということになります。

ReActにおけるプロンプトの流れ

(スライドを示して)具体的にこれは何が動いているのかというと、発表向けに抽象化してけっこう省略はしているんですが、裏ではこんな感じに動かしているという例を出しました。

「あなたはスポーツ用品メーカーの購入アシスタントです」と役割を普通に渡してあげて、使えるツールは「Search」と「Lookup」と「Calculate」と、「こういうことができるツールですよ」とGPTにあらかじめ教えておきます。

「回答形式としてあなたがやることは、目的を達成するために必要なことを考えて記載しなさい。そして、必要なActionとActionのために必要なinputを入れた上で、もしActionの内容がなくなれば結論を書いてください」という渡し方をしてあげる。

例えばユーザーからの「Question」。ここはあえて回答をしっかりさせるために、Questionを「野球を始めようと思っています。グローブが欲しいのですが、どんなものを買ったらいいのでしょうか。最も安価なものだとうれしいです」と書きました。

とりあえずこの「Question」に対して、チャットボットはまず考えます。「野球のグローブの種類や価格帯を調べる必要があるな」「『Action』は『Search』が必要だ。そして『Action input』はこれでやろう」というかたちでチャットボットが決めてくれます。

決めた内容をバックエンドプログラムが受け取って、「Action」と「Action input」の内容を受け取り、「あっ、GPTはこう言っているから、私はその言うとおりに『Search』を動かします」というかたちで、Web検索に「野球用グローブ 種類 価格 初心者向け」といった検索を走らせて、Web検索結果を得る。

Web検索結果を得たら今度はその内容を「Observation」というところに、「初心者であっても、グローブは1万円以上のものを選んだほうがいいでしょう。本革のグローブを使うべきです」といったかたちで、今までの「Question」とか「Thought」とかも全部含めた上で、もう1回GPTに投げるという動きをします。

これらを含めてあげると、GPTは今までの思考過程と検索の結果、得られた内容を考えた上で、「じゃあ次にしていくものは何だろうな? Thought、本革のグローブで1万円前後の商品情報を取得する必要があるな」というかたちから、「Lookup」というアクションが必要だと考える。

「Lookupに必要なインプットはこれだな」というかたちで出してあげて、また商品DBの検索にかかって結果を返してということを繰り返し繰り返しやっていく。以降、結論が出るまでやり続けるんですが、このReActのプロンプトの流れは、設計しようとすると非常に大変です。

ここ(スライドの内容)もだいぶはしょっている部分はあります。実際には「Action」の入れ方みたいなところも指示をしているし、例示にもいわゆるFew-shotも入れていたりします。

バックエンドの処理を自動化してくれる3つのライブラリ

こういうReActをやって、最終的には動的なタスク認識も含めてできるようなかたちになるんですが、今のを全部組んでいると大変だということで、そこのバックエンドの処理をある程度自動化してくれるというか、よろしくやってくれるツールとしていくつかライブラリが出てきています。

1つはけっこう有名ですが、「LangChain」と呼ばれるライブラリです。LangChainのライブラリはReActみたいに動的な実行だけじゃなくて、例えばプロンプトのテンプレート機能であったり、プロンプトを覚えていくメモリ機能みたいなところも含めて全般的に提供してくれる、非常に便利なツールになっています。

このLangChainを使ってあげると、ReActを自動化する「Agent」と呼ばれる機能みたいなところに、さまざまな先端機能が実装されるかたちになります。

それからあとは、「Semantic Kernel」。これはマイクロソフトがOSSとして最近発表したものです。やれることはLangChainと似たようなかたちにはなってくるんですが、Planner機能でAgent機能と同じようなパイプライン生成も可能になっています。

「ReActのような」と書いたのは、中身の生成ロジックとかがちょっと違うかなと私は思っているからです。いずれにしても、AIが何をすべきなのかを自分で考えてアクションを決めてくれるといったところがやり取りの中でできるようなライブラリになっています。同じくメモリーとか、プロンプトのテンプレートみたいな機能も提供されています。言語系のツールはこれからどんどん出てくるかなとは思うんですけれども、やはりいずれも開発速度が非常に速いです。

次々に論文が出てきてそれを次々に実装しているようなかたちになるので、確かに未来感がるし「すげぇ!」と思うんですが、やはり適切なバージョン管理をしておかないと、もう次のバージョンでは使えなくなっている機能がある。

あるいは、本番利用をしていく上では、本当に自分のさせたい振る舞いができているのかどうかを、やはり検証していく必要が出てくるので、注意しながら使っていくことが必要かなと思います。

GPTパイプラインの設計の重要性

こういったGPTを何回も呼び出していってパイプラインを組んでいくことは、今後けっこう重要になってきています。

ちょうど、ReActの中でもちゃんと順を追って考えていかないと何をしているのか中身がぜんぜんわからない。「GPTを何回呼んでんねん」みたいな話が出てきたと思いますが、「どこにどういう指示を与えた上で、与えるべきプロンプトは設定時点で(何が必要か」という)想定が必要になってきます。

(スライドを示して)先日、BabyAGIさんと呼んだほうがいいのか、アレかもしれないですが……。Twitter上で公開をされていたものになります。GPT-4を呼び出していくような流れとかパイプラインは非常によく設計されています。

例として非常に参考になる情報になっているので、これから新しいサービスを作っていきたい場合には、GPTのパイプラインをどう組んでいくのがいいのか、実際にはどう組まれているのかみたいなところをちょっと意識しながら考えてみるといいかなと思います。

Fine tuningとPrompt Engineeringの位置付け

ここまで長くしゃべってきましたが、Fine tuningとPrompt Engineeringの位置付けがだんだん見えてきたのかなと思います。Fine tuningというのは、何度か言っているように主観がだいぶ含まれる部分もあるんですが、あくまで内部の長期記憶や基礎の言語能力のようなものを獲得するようなイメージになります。

プロンプトを与えてあげることによって、いわゆる情報参照的、教科書持ち込みの試験的みたいなかたちで、細かい内容にもある程度対応できるようになってくるかたちになっています。学習側の工夫がすべてだった今までのML開発とは違って、プロンプト側の工夫がだいぶ重要になってきているというところがハイライトです。

Fine tuningもまだまだリソースが確保されていないし、1回やろうと思うと数百のデータとかを使っていかなければならないので、そのコストも必要になってくるという話になってきます。

まずはプロンプトでどうにかできないのかを考えていきながら、「まったく新しいタスクとか、タスクそのものの精度を絶対に向上させていかなければならない」みたいな話になってきたら、Fine tuningを含めた改良を検討していくようなかたちになります。それぞれの特徴みたいなものを捉えて、全体的にAIの学習を考えていければいいのかなと思います。

(次回に続く)