RAGでChatGPTの回答精度が上がる
RAGの話に入る前にChatGPTについておさらいします。正式名称は「Chat Generative Pre-trained Transformer」です。つまり、「チャットを生成する、事前にデータで訓練されている訓練済みのトランスフォーマー」という意味になります。
トランスフォーマーとは2017年にGoogleの研究チームが作った技術で、わかりやすさのためにシンプルに言うと、与えられた文字の続きを予測するAIです。例えば「日本で1番高い山は、」という文字を与えると、続きの文字として「富士山」を出します。
会社の規定や法律の文章などの独自データからChatGPTに回答させたい場合は大きく2つの方法があります(実際には、3つ目の方法として事前学習方式があるが話が長くなるため今回は割愛する)。
1つ目はファインチューニングという方法です。新しいデータで再学習させるファインチューニングは、学習時間とコストが必要になります。
2つ目はプロンプトに回答データを入れて答えさせる方法で、学習時間やコスト、マシンパワーも必要ないので最近流行り出しています。こちらがRAGに当たります。
RAGの全体の流れとしては、ユーザーの質問をクエリーとしてデータベースを検索します。
そして、返ってきた検索結果を元々のユーザーからの質問と一緒に、プロンプトの中に埋め込みます。
これが以下のイメージになります。
「以下の検索結果を基に、ユーザーインプットに対して適切な回答を訂正してください。」という指示を実行させるために、「有給申請の方法を教えてください」というクエリを投げます。そうすると検索結果として「社内ポータルの〇〇から申請してください」と出ます。
クエリと検索結果の両方を与えてChatGPTに対応させる形がRAG(Retrieval Augmented Generation)です。つまりは検索を拡張しているのですが、当時Meta社に在籍していたパトリックルース博士が2020年の5月に発表した論文内で初めて提唱した概念です。
検索を3ステップに分けてRAGのボトルネックを特定していく
RAGには色々な課題がありますが、適切な回答が得られないことと誤った情報を生成してしまうハルシネーションが代表格としてあります。
これらの問題は、データの質や検索インデックスの作り方、検索精度によって大きく影響を受けます。そういった時には、どの処理にボトルネックがあるのかをRAGのシステムを作るときに見た方が良いです。私が実際にプロジェクトをやっている中でも、こちらは非常に重要視しています。
そのため、まずは、そもそも社内で使っている検索エンジンから精度良く回答を得られるのかを確認する必要がありますし、生成AIから回答生成できるレベルのデータなのかを見ないことにはシステムの最終的なパフォーマンスが高まりません。
RAGの場合だと検索前・検索時・検索後と大きく3つのステップに分けられるので、各ステップにおいてどこがボトルネックなのかを考えていくのが良いと思います。
スライドを見ていただくと分かるかと思いますが、ざっと書き出しただけでもこれだけ色々やれることがあります。
検索前ではデータの前処理やクエリ変換、クエリによる分類を行う方法があります。検索時にはベクトル検索以外の方法も検討したり、検索語はプロンプトチューニングや生成した回答自体が本当に有効かをChatGPT自体に評価させる方法が有効です。上記の手法を試してしっかりと精度を上げて、ボトルネックを埋めていくのが非常に重要です。
RAGを簡単に作成できる仕組みが次々と登場
そして、新たな潮流としてDifyというRAGを簡単に作れる仕組みが出てきています。数時間もかからずにデプロイできるので、Difyを選択する中小企業もかなり増えると予想されます。
あとはエンタープライズ向けであればMicrosoft公式のリファレンスアーキテクチャがおすすめです。 こちらも日本語版が公開されていて、1時間程度でRAGを作成できます。
続いてChatGPT-4oです。画像もDifyに通せるので、マルチモーダルな仕組みなどDifyと組み合わせると面白いものが作れるようになっています。 しかし、それでも大多数の人には難しいので、生成AIエンジニアは非常に重要な存在になってくると思います。