清水理史の「イニシャルB」

生成AIの「RAG」とは? 知っておきたい重要キーワードを解説する

RAGの簡単なしくみ

 生成AIに関する記事を目にしたとき、「これ何だっけ?」と、記事内で使われている技術用語の理解に困った経験はないだろうか? 今回は、そんな人に向けて、最近、よく使われるようになった「RAG」について解説する。

 本連載でもしばしば使う「RAG」だが、何を指す言葉で、どのように、何の目的で機能するのかを見ていこう。

注目が集まるRAG

 RAGは、「Retrieval Augmented Generation」の頭文字をとったもので、日本語に訳すと「検索拡張生成」だ。簡単に説明すると、生成AIの言語生成能力を、検索技術と組み合わせて拡張する仕組みだ。

 RAGの技術自体は、以前から存在していたが、昨今、注目されるようになってきた理由は、ChatGPTのカスタムGPT(GPTs)やCopilot GPT Builder、Copilot Studio、NVIDIAが公開したChat with RTXなどの、RAGを利用可能な生成AIソリューションが増えてきたことが、その1つだ。

ローカルでRAGを利用できるChat with RTX

 また、2023年11月に開催された文化庁 の文化審議会著作権分科会法制度小委員会(第4回)にて「AIと著作権に関する考え方について(骨子案)」が提示されたことも、もう1つの理由だ。具体的には、生成AIの開発段階で学習を目的とした場合であれば著作物を利用することができるが(非享受目的)、生成AI利用段階におけるRAGは必ずしもそうではない(享受目的が併存する)ことが記載されている。

 要するに、RAGでウェブページや文書の情報を基に回答させる場合に、回答結果に参照元の情報が多く出力される場合は、著作権者の許可を得る必要があるということだ。ただし、軽微な引用は認められる可能性があることから、最終的には出力結果に依ると考えられる。

 その後、骨子が素案に改定され、さらに50を超える団体からのパブリックコメントの結果(上記リンクの法制度小委員会のページから「令和5年度第7回(2024年2月29日)」を参照)も公表された。興味のある人は、ぜひ「RAG」で検索しながら、どの提出者が、どのような意見を出しているのかを見てほしい。賛成意見もあれば、慎重な判断を求める意見もある。

RAGに関するパブリックコメントと回答(文化審議会著作権分科会法制度小委員会 令和5年度第7回(2024年2月29日) 「AIと著作権に関する考え方について(素案)」に関するパブリックコメントの結果についてより)

▼文化審議会著作権分科会法制度小委員会の記録および資料(資料は各回のリンクを参照)
著作権分科会 法制度小委員会

 第3の理由として、AnthropicのClaude 3(20万トークン)やGoogleのGemini 1.5(12.8万トークン)、GPT-4 Turbo(12.8万トークン)などの広大なコンテキストウィンドウを持つモデルが登場したことで、従来のRAGとの比較が話題になったことも挙げられる。検索する代わりに、必要な情報をコンテキストとして丸々与えてしまおうという発想だ。

Claude 3の紹介ページより。200K(20万トークン)入力時でも埋め込まれた情報を高い確率で抽出可能

RAGのしくみ

 RAGとは何なのかを理解するために、まずは生成AIが回答に利用する「知識」について見ていこう。

 生成AIは、通常、学習した知識を基に回答を生成する。このため、学習していない情報や学習後に更新された新しい情報については正しく回答できない(確率の高い単語を並べて間違った情報を回答する)。

 もちろん、プロンプトに知識となる情報を記述しておくことで、それを基に回答させることはできる。ただし、言語モデルには、入力できる情報量に限りがあるため、知識として与えられる情報量に限りがある(だから、前述した膨大なコンテキストウィンドウのモデルが登場した)。また、知識となる情報を毎回人間が探してきて、プロンプトとして与えるのでは効率が悪い。

プロンプトを利用した知識の例(Copilotのノートブック)。コンテキストウィンドウが大きければ、知識となる情報を丸々与えられる

 そこで、登場したのがRAGだ。検索技術を併用することで、質問に関連する情報をあらかじめ検索によってピックアップし、その情報を「知識」として生成AIに与えて(プロンプトに含めて)回答させる方式となる。

 RAGの最も身近な存在はMicrosoftのCopilotだ。検索技術を併用することで、質問内容に関連する情報をインターネットやMicrosoft 365のデータから探し出し、その内容を考慮して回答を生成することができる。

MicrosoftがCopilotの動作を説明した動画「The Copilot System: Explained by Microsoft」より、Microsoft 365などからデータを探し出してCopilot回答するイメージ(29秒ごろ)。なお、これは法人向けCopilotの動作で、個人向けではBing検索を利用して回答が行われる

 同様に、ファイルに対してもRAGを実行することが可能だ。ChatGPTのカスタムGPT(GPTs)やCopilot GPT Builder、Copilot Studioなどで利用できるが、WordやPDFなどの文書をあらかじめアップロードしておくことで、その内容を基に回答させることができる。

 プロジェクト資料やQA文書、業務マニュアルなどを用意しておけば、その中から質問に対する回答が記載された文章を検索し、その内容を基に回答するAIチャットボットを作ることができる。

 例えば、「経費の精算方法」を知りたい場合、RAGなしだと学習済みの知識から回答されるため、自社の業務の流れに合った回答は生成されない。しかし、あらかじめ業務マニュアルのファイルを知識として与えておけば、それを基に、自組織の業務ルールに合った回答が得られることになる。

ドキュメントをベースに回答するカスタムGPT

RAGが動作する仕組みを見てみよう

 RAGの実装方法はさまざまだが、ここでは、単純化した流れを紹介する。

STEP 1:文書を「チャンク」に分割する

 まずは知識として与えられた文書をいくつかに分割する。これをチャンクと呼ぶ。チャンクは、シンプルに文字数でも分割できるが、より高い精度を求める場合は段落などの意味単位で分割する場合もある。

チャンクに分割するイメージ

STEP 2:チャンクをベクトル化する

 続けて、分割した文書――チャンクをベクトル化する。「ベクトル」と聞くと、画像処理やDTPにおけるベクトルデータ(形状や線の太さなどを数値化したデータ)を思い浮かべる人もいるかもしれないが、AIモデルにおけるベクトル化は、文章の意味論的な内容を多次元空間内における点(座標)として変換し、数値の組み合わせに置き換えることを言う。OpenAIのtext-embedding-3-smallの場合、1536次元のベクトルに変換できる。

 これは、実際に見た方が分かりやすいだろう。以下は、Google Collab上でOpenAIのtext-embedding-3-smallを使って、「社用車を利用する場合は社内ポータルから日時を指定して予約します。」という文章をベクトルに変換した結果だ。内部的にはベクトルデータとして扱われる。

text-embedding-3-smallを使って文章をベクトルに変換した結果の例

STEP 3:データベースに格納する

 一般的なRAGでは、チャンクに分割してベクトル化した文書をベクトルデータベースに格納する。上記のベクトルデータと元の文章が大量に保管される場所で、これが生成AIで回答を生成する際の知識の基になる。

 データベースはさまざまな形態があり、メモリ上に一時的に展開する場合もあれば、ローカルのデータベースを利用する場合、「Pinecone」のようなクラウドサービスを利用して永続的に保管される場合もある。

STEP 4:検索ワードをベクトル化する

 文書と同様に、生成AIへの検索ワード(プロンプト)もベクトル化する。これにより、文書との比較が可能になる。

text-embedding-3-smallを使って検索ワードをベクトルに変換した例

STEP 5:類似度を判定する

 知識となる文書と検索ワードの、2つのベクトルが用意できたら、類似度を判定する。下図は単純化した例だが、類似度は「0.576…」となっている。データベースから、類似度の高い情報をピックアップすることで、回答のための知識を準備するわけだ。

text-embedding-3-smallを使って検索ワードの類似度を比較した例

STEP 6:生成AIで回答を生成する

 最後に、ピックアップした知識をもとにテキストに戻して、回答を生成する。

補足:類似度を直感的に理解する

 類似度が理解しにくいかもしれないので、補足しておく。例えば下図のように、全く同じ単語、同じ単語を含む文章、似ている文章、まったく関係のない文章で、下図のように類似度が変わる。

 今回は単純化した計算なので正確ではないが、まったく同じ単語は「1」になり、同じ単語を含む場合は「約0.8」、似たような言葉は「0.4」、まったく関係なければ「0.2」となる。

類似度を比較した例

 直感的に理解したいなら、「Embedding Projector」の利用もおすすめする。英単語のベクトルを3次元でグラフィカルに表示できるウェブサイトで、さまざまな単語が点で表現されている。右上の「Search」に「bike」という単語を入力すると、点の中から「bike」に相当する単語が強調され、その周辺にある関連する「bicycle」や「wheels」などの単語も表示される。

Embedding Projectorにて、ベクトルで表現された言葉の類似度を3次元で視覚化した様子

 「検索」というと、指定したキーワード(単語)が文章に含まれるかどうかを調べることをイメージするかもしれないが、生成AIのRAGでは、ベクトルの類似度から知識として利用する文章を検索する。

 このため、例えば、上記の例で社用車について質問したいとき、「社用車」という単語が必ずしも含まれていなくてもいい。「会社の車の鍵の場所」などと検索しても、目的にあった文章を検索できる。

精度を上げる方法が模索されている

 以上、RAGのしくみを解説した。これは単純化したモデルなので、実際のサービスと異なる部分もあるが、文書を分割して、ベクトルデータに変換し、データベースで検索し、生成AIで回答を作る、といった大きな流れは共通となる。

 実際には、もっと複雑な仕組みを利用しないと精度が出ない場合がある。例えば、意図しないソースを基に回答が生成される場合や、関連する情報を補足してほしくても回答してくれない場合などだ。

 そのため、RAGの精度を向上させる方法は、日々研究が進められている。具体例としては、例えば検索の基になる文書で用語を統一したり、見出しなどを付けて構造化したり、文書内の専門用語や社内用語を置き換えたり、補足を追記したり、といったデータセットの工夫が挙げられる。

 また、単純な文書データベースではなく、データ同士の関連性を考慮した構造を持つグラフデータベースを利用することで、文書同士の関連性や階層を考慮させる方法もある。

 さらには、RAGによる回答を言語モデルそのものに再評価させ、正しいかどうか判定し、必要に応じて再検索してから、ユーザーに提示する方法などもある。

 今後、さらに身近な存在になるはずなので、何となくでも仕組みを知っておくと、より活用しやすくなるだろう。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できるWindows 11」ほか多数の著書がある。