AIDBでは日々、AIの最新研究を紹介しています。本記事は初めてRAGに触れる方から、実務での活用を検討している方まで、幅広くお読みいただける企画の一部です。
今回は、「RAG」という技術そのものについて、あらためて包括的に理解が進むことを目指した内容をお届けします。
はじめに
ChatGPTをはじめとするLLMが業務に浸透する中、ある重要な課題が浮上しています。「LLMが知らない情報について、どうやって正確に答えさせるか」という問題です。
LLMは膨大なテキストデータで学習されていますが、学習時点より後の情報は知りません。また、企業の社内文書や個人のメモといった、学習データに含まれていない情報についても答えることができません。さらに、学習した内容であっても、事実と異なる内容をもっともらしく出力してしまう「ハルシネーション」と呼ばれる現象も起こります。
こうした課題への解決策として広く使われているのが「RAG(Retrieval-Augmented Generation)」という技術です。日本語では「検索拡張生成」と訳されることもあります。外部のデータベースから関連情報を検索し、それをLLMに渡して回答を生成させる仕組みです。
RAGは現在、企業で構築されているLLMシステムの約6割で採用されているとの報告もあります。しかし、日々発表される研究論文を追っていると、「検索して答えさせる便利な仕組み」という表面的な理解と、研究の最前線で明らかになっている実態との間には、少し差があることに気づきます。
本記事では、AIDBが日々追っている最新研究の知見をもとに、RAGの本質から実践的な導入・運用のポイントまで体系的に解説します。
そもそもRAGとは何か
RAGとは、ユーザーの質問に対して、まず外部のデータベースから関連する情報を検索し、その検索結果をLLMに渡すことで、より正確で最新の回答を生成させる技術です。
仕組みはシンプルです。たとえば「昨日発表された新しい法規制について教えて」と尋ねたとします。LLMは過去のデータで学習しているため、昨日の出来事は知りません。しかしRAGを使えば、最新のニュース記事や公式文書を検索し、その内容をLLMに読ませてから回答を生成することができます。
ChatGPTやClaudeなどに文書ファイルを添付して回答を生成させる機能を使ったことがある方も多いでしょう。あの機能もRAGの一種です(ただし一説によると、ChatGPTやClaudeは添付文書をそのままコンテキストに入れている可能性もあるとのこと)。
RAGの目標
RAGが目指すのは「必要な情報をしっかり拾い上げつつ、余計なものは混ぜないこと」です。
言い換えると、「見逃しを減らしたいけど、ノイズも減らしたい」ということになります。これを専門的には「網羅性(recall)」と「関連性(precision)」と呼びます。この2つはどちらかを高めるともう一方が下がりやすく、両立が難しいとされています。RAGでは、このバランスを取ることが設計上の大きな課題です。
RAGを構成する4つの基本モジュール
RAGの仕組みと役割を整理した調査では、RAGは次の4つのパートで構成されると説明されています。
インデックス(データに目印をつけて整理する)
最初に行うのは、大量の文書を検索しやすい形に整理しておく作業です。長い文章を短く区切り(これを「チャンク」と呼びます)、それぞれを数値に変換して類似性を比較できるようにします。この数値化のことを「埋め込み(embedding)」といいます。
ただし、文書を細かく分けると全体の流れが失われやすいですし、数値化されたベクトルだけでは因果関係などの複雑な意味を捉えるのが難しい場合もあります。
検索(ユーザーの質問に合うデータを探す)
ユーザーの質問を受け取ると、まずその質問を「検索に適した言葉」に書き換えます。あいまいな表現をわかりやすくしたり、長い質問を分割したりすることもあります。
その後、候補になりそうな文書を広く集めます。このとき、まずは高速に検索できる方法で候補を集め、あとからより深い意味を比較して精度を上げていく段階的なやり方がよく使われます。
生成(探した情報をもとにLLMが回答する)
検索してきた情報をもとにLLMが実際に文章を生成します。ここでは「プロンプトの設計」が重要になります。どの情報をどの順番で渡すか、どんな指示を与えるかで、LLMの出力が大きく変わるためです。
また、検索してきた情報に矛盾があるとき、LLMがどちらを信じるかも課題になります。モデルがもともと覚えていることと外部の情報が食い違ったときに、どう対応するかを工夫する必要があります。
オーケストレーション(全体の流れを調整する)
これまでの3つのパートをどんな順番でどう使うかを判断する役割です。簡単な質問なら検索を飛ばしてLLMに直接答えさせる選択もありえます。一方で、込み入った質問であれば、複数の情報を集めて何度も推論させるような処理が必要になることもあります。
RAGとファインチューニングの違い
LLMを業務に合わせて強化する方法には、大きく分けて2つのアプローチがあります。一つはRAG、もう一つは「ファインチューニング」と呼ばれる方法です。両者は補完的な関係にありますが、特性が大きく異なります。
ファインチューニングとは
ファインチューニングは、モデルそのものを追加学習させる方法です。特定の業務や分野に関するデータを使ってモデルの重みを調整し、その分野での性能を高めます。
この方法は効果が出やすい反面、いくつかの課題があります。まず、計算コストが高く、専門的な知識と環境が必要です。また、もともと備わっていた知識や得意分野が失われる「破滅的忘却」と呼ばれるリスクもあります。さらに、一度学習させた内容を更新するには、再度ファインチューニングを行う必要があります。
RAGの特徴
RAGはモデル自体を変更せず、入力文の工夫によって出力をコントロールする方法です。外部から検索してきた情報をプロンプトに含めることで、その場で必要な知識を与えます。
RAGの利点は、モデルを再学習させる必要がないため導入が比較的容易なことです。また、データベースを更新するだけで最新情報に対応できます。情報の出所を明示しやすいため、回答の根拠を示すことも可能です。
一方で、検索の精度に依存するため、関連する情報をうまく見つけられなければ回答の質も下がります。また、プロンプト設計に大きく左右されやすいという課題もあります。
どう使い分けるか
両者の使い分けについては、一般的に次のような考え方があります。
ファインチューニングが向いているのは、特定の文体やトーンを一貫して出力させたい場合、あるいは特定分野の専門用語や表現を自然に使わせたい場合です。モデルの「振る舞い方」を変えたいときに有効です。
RAGが向いているのは、最新情報や頻繁に更新される情報を扱う場合、あるいは社内文書や非公開データを参照させたい場合です。モデルが「何を知っているか」を拡張したいときに有効です。
実務では、両者を組み合わせて使うケースも増えています。「文脈を育てる」という発想を紹介した研究では、ファインチューニングなしでもRAGの工夫によってLLMの性能を向上させるアプローチが提案されています。失敗した回答の例を集めて共通するパターンを整理し、それを文脈として活用することで、追加学習なしに改善を図る方法です。
研究が明かすRAGの「今」
ここからは、最新研究から見えてきたRAGの実像を紹介します。「検索して答えさせる便利な仕組み」という表面的な理解を超えて、この技術が本当は何をしているのか、どこまでできてどこに限界があるのかを掘り下げていきます。