検索拡張生成は、外部の文書コレクションを検索するリトリーバー(検索器)と、ジェネレーター(生成器)である言語モデルを組み合わせた手法です。Lewis ら(2020)が提案したもので、パラメトリックな seq2seq モデルと Wikipedia の非パラメトリックなベクトルインデックスを組み合わせることで、より事実に即した具体的なテキストを生成でき、オープンドメイン質問応答で最先端の成績を収めることを示しました。
現代の RAG システムの多くは、Dense Passage Retrieval(Karpukhin ら、2020)にならい、密な埋め込みを使って検索します。検索と言語モデルを結びつけるという考え方は、REALM(Guu ら、2020)でも発展させられました。
AI における RAG とは?わかりやすく言うと
RAG の意味をひと言でいえば、「まず調べてから答える」です。素の LLM は学習時に取り込んだ知識だけで答えるため、情報が古かったり記憶違いがあったりします。RAG システムはまず、社内文書、ナレッジベース、Web などから質問に関連する箇所を取得し、それを質問と一緒にモデルに渡します。そのため、回答では実際の情報源を引用し、出典を示すことができます。
そのため RAG は、社内の非公開文書を対象にしたチャットボット、常に最新の情報が求められるサポートアシスタント、各主張の出典を示すリサーチツールなどを構築する際の定番の方法になっています。
検索拡張生成の仕組み
- 1インデックス化。文書をチャンク(断片)に分割し、各チャンクを埋め込みに変換して、ベクトルデータベースや検索インデックスに保存します。
- 2検索。ユーザーの質問も同じ方法で埋め込みに変換し、最近傍探索で最も類似したチャンクを見つけます。その後にリランキングの工程を挟むこともよくあります。
- 3拡張と生成。上位の箇所をモデルのコンテキストウィンドウの範囲内でプロンプトに挿入し、モデルはそれに基づいて回答を書きます。理想的には、各記述の根拠となる箇所も示します。
RAG とファインチューニングの違い
どちらもモデルを自分の分野でより役立つものにする方法ですが、変えるものが異なります。RAG はモデルが参照できる情報を変え、ファインチューニングはモデルそのものを変えます。
| RAG | ファインチューニング | |
|---|---|---|
| 変わるもの | モデルに与えるコンテキスト | モデルの重み |
| 知識の更新 | 文書を再インデックスする | 再度学習させる |
| 出典の提示 | 使用した箇所を示せる | 出典をたどる仕組みはない |
| 向いている用途 | 最新の情報、非公開の情報、頻繁に変わる情報 | 一貫した文体や形式、専門的な振る舞い |
コンテキストウィンドウが長ければ、文書全体をチャットに貼り付けられるため、数ファイル程度なら RAG の代わりになります。それでも、文書の量がウィンドウに収まらない場合、頻繁に更新される場合、多数のユーザーをまたいで検索する必要がある場合は、RAG のほうが優れています。
MultipleChat における RAG
MultipleChat のプロジェクト はこの仕組みで動いています。プロジェクトに追加したファイルはインデックス化され、メッセージを送信すると MultipleChat がそれらを検索し、最も関連性の高いチャンクだけをモデルに渡します。そのため、コピー&ペーストしなくても、プロジェクト内のすべてのチャットで自分の文書を活用できます。Web 検索でリアルタイムの情報源も加えられ、有料プランでは Auto Verification が回答の直後に事実関係の問題をチェックします。