Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】RAG Explained

2025年09月20日に「Dev.to」が公開したITニュース「RAG Explained」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

RAG(検索拡張生成)は、LLMのハルシネーション問題(事実誤認)を解決する技術だ。外部情報源から関連データを検索・取得し、LLMのプロンプトに加えて回答を生成させる。これにより、モデルを再学習せずとも、最新かつ正確な情報に基づいた信頼性の高い回答が可能となる。

出典: RAG Explained | Dev.to公開日:

ITニュース解説

Retrieval-Augmented Generation、略してRAG(ラグ)は、近年特に注目されている大規模言語モデル(LLM)の利用パターンの一つだ。この技術を理解するために、まず「検索(Search)」と「取得(Retrieval)」という言葉の違いから説明する。検索とは、多くの候補の中から何かを見つけ出す行為を指す。例えば、ウェブサイトで特定のページを探したり、長い文書の中から特定のキーワードを探したりするようなことだ。一方、取得とは、あるコレクションの中から特定の項目を取り出す行為を意味する。図書館で特定の書物を取り出したり、データベースから特定のデータを引き出したりするイメージに近い。実際には、取得という行為の中に検索が含まれることが多い。つまり、必要なものを見つけてから、それを取り出して利用するという流れだ。RAGにおいても、この「検索して、関連する項目を取り出し、それを使って生成を改善する」という一連のプロセスを指して「Retrieval」と呼ぶ。

RAGがなぜ登場したのかを理解するには、LLMが抱える根本的な問題を把握する必要がある。現在の主流であるデコーダー型LLMは、過去の単語や文章から次に続く単語を予測することに非常に長けている。大量のテキストデータを学習することで、統計的なパターンや言語の規則性を身につけているためだ。しかし、この仕組みには大きな弱点がある。それは、学習データに含まれていない、あるいは関連性の低い情報について尋ねられた場合だ。人間なら「分からない」と答えることができるが、機械学習システムは「知らない」という概念を本質的に持っていない。そのため、たとえ根拠がなくても、学習したパターンに基づいて最もらしい次の単語を予測し続けようとする。これが、流暢で自信に満ちた、しかし事実とは異なる文章を生成する「ハルシネーション(幻覚)」と呼ばれる現象だ。

まるで、特定のテーマについて何も知らないのに、非常に説得力があり、自分の無知を認めたがらない人がいるようなものだ。そうした人に専門外の質問をすると、もっともらしいが完全にでっち上げられた話を語るだろう。LLMも同様に、信頼できる事実に基づかない、もっともらしい文章を生み出してしまうことがある。例えば、「チームで一番背が高いのは誰ですか?」と一般的なモデルに尋ねても、あなたのチームに存在しない人物の名前を挙げて、その身長まで自信満々に答える可能性がある。これはモデルが意図的に嘘をついているのではなく、適切な根拠がないまま、次に続く単語を予測しようとしているだけなのだ。

このハルシネーションを軽減するために、モデルが不確かさを認める頻度を増やすような訓練も試みられてきた。これによって露骨なハルシネーションは一部減ったものの、二つの課題が残った。一つは、答えがどこかに存在するはずなのに、モデルが「分からない」と答えてしまうケース。もう一つは、依然として自信満々に間違った回答を生成してしまうケースだ。これらの問題の根本原因は、モデルが回答を生成する際に、適切な事実にアクセスできないことにある。

LLMはあらゆることを知っているわけではない。メールの草稿作成やブレインストーミングのような創造的なタスクでは、事実の不足が致命的にならないこともある。しかし、正確な事実が求められるタスクでは、知識の欠落や情報の古さが大きな問題となる。この問題を解決するための「分かりやすい」アイデアの一つは、LLMに特定の事実を直接教え込む「ファインチューニング」という方法だ。例えば、あなたのチームメンバーの身長データをモデルに学習させれば、「チームで一番背が高いのは誰か?」という質問に答えられるようになるかもしれない。

しかし、このファインチューニングにも二つの課題がある。一つは「広大な海の中の小さな信号」問題だ。あなたの小さなデータセットが、巨大なモデルに与える影響はごくわずかかもしれない。もう一つは「コストと複雑さ」の問題だ。LoRA(Low-Rank Adaptation)などの最新技術を使っても、質の高いファインチューニングは簡単ではなく、費用もかかる。特に、事実情報が頻繁に変わる場合には、その都度ファインチューニングを行うのは現実的ではない。

そこで、一つの賢いアイデアが生まれた。それは、ベースとなるLLMはそのまま利用し、ユーザーからの質問があった際に、関連する事実情報をシステムが別途取得し、その情報を質問と一緒にLLMに与えて回答を生成させるというものだ。これがRAGの核となる考え方だ。「取得(Retrieve)→ 拡張(Augment)→ 生成(Generate)」のプロセスが、そのままRAGという名前の由来になっている。

RAGの仕組みを最大限に活用するには、「命令チューニング」と「プロンプト」の役割を理解することが重要だ。訓練されたばかりの生のLLMは、単にテキストを続けるように学習されているため、必ずしも指示に従うわけではない。例えば、「世界で一番高い山は何ですか?」と尋ねても、「それはよくある質問です…」のように、質問に対する直接的な答えではなく、文脈を続けるような返答をする可能性がある。これを解決するのが命令チューニングだ。質問と望ましい回答のペアをモデルに追加で学習させることで、モデルは指示に従い、質問に対して直接的かつ簡潔に答えることを学ぶ。RAGでは、取得した事実情報を使ってプロンプトを拡張する際に、「提供されたコンテキストのみを使用して質問に答える」といった指示をLLMに与える。命令チューニングが施されたモデルは、この指示に正確に従い、提供された事実に基づいて回答を生成するようになるのだ。

では、RAGは具体的にどのように動作するのか、そのステップを見てみよう。

  1. ユーザーからの質問受付: まず、ユーザーが質問をシステムに投げかける。このとき、システムは「以下の質問に答えてください」といった命令形式のプロンプトを準備する。
  2. 関連情報の取得: 次に、システムはユーザーの質問に答えるために役立つ可能性のある関連情報(ドキュメント、文章の断片、データベースの行など)を、外部の知識源から取得する。
  3. プロンプトの拡張: 取得した情報を使って、元のプロンプトを拡張する。つまり、質問だけでなく、関連する事実情報もプロンプトに含める形にする。
  4. LLMによる回答生成: 拡張されたプロンプトをLLMに入力し、回答を生成させる。このときLLMは、与えられた事実情報を根拠として回答を作成する。
  5. 回答の返却: 生成された回答をユーザーに返す。必要であれば、回答の根拠となった情報の出典を示すこともできる。

具体的な例を挙げよう。ユーザーが「チームで一番背が高いのは誰ですか?」と質問した場合を考える。 RAGシステムは、まず「チームメンバーの身長一覧:アレックス 193cm、ジョーダン 175cm、エミリー 163cm、ジェームズ 188cm」といった記録を外部の情報源から取得する。 そして、この取得した情報をプロンプトに組み込む。例えば、「以下のコンテキストのみを使用して、質問に答えてください。コンテキスト:チームメンバーの身長一覧—アレックス 193cm、ジョーダン 175cm、エミリー 163cm、ジェームズ 188cm。質問:チームで一番背が高いのは誰ですか?」のような形だ。 この拡張されたプロンプトを受け取ったLLMは、「アレックスが193cmで一番背が高いです」と、提供された情報に基づいて正確に回答を生成する。

このRAGの動作は、「ニューラル検索」と「命令に従う生成」という二つの能力に依存している。ニューラル検索とは、ユーザーの質問と候補となる文書や文章の間にどれだけ意味的な類似性があるかを測定する技術だ。まず、各文書や文章を「埋め込みモデル」というものを使って「ベクトル」(数値の並び)に変換する。意味的に似ているテキストは、このベクトル空間上で互いに近い位置に配置される。これらのベクトルは、高速な近傍検索(似ているベクトルを素早く見つける)に特化した「ベクトルデータベース」に保存される。ユーザーから質問が来ると、その質問も同様にベクトル化され、ベクトルデータベース内で最も近いベクトルが検索される。そして、そのベクトルに紐づく元の文章が取り出され、LLMへのプロンプトに組み込まれる。このように、単なるキーワードの一致だけでなく、質問の意図や文脈に意味的に関連性の高い情報を探し出し、利用できる形で取り出すのがニューラル検索の重要な役割だ。

取得した情報をプロンプトに組み込み、その情報を使うようモデルに指示する「拡張プロンプト」は、命令チューニングされた最新のチャットモデルであれば、ほとんどの場合うまく機能する。もし期待通りの精度が得られない場合や、さらに高い精度が必要な場合は、RAG形式のトレーニングデータ(コンテキスト文章を含む入力と、そのコンテキストに限定して引用する出力)でモデルを追加でファインチューニングすることも可能だ。

RAGがこれほど人気を集めているのは、比較的簡単に実装できるにもかかわらず、非常に高い効果を発揮するからだ。主に以下の二点で大きな力を発揮する。

  • ハルシネーションの削減: 回答が取得したテキストに根拠を持つため、モデルが事実に基づかない情報を生成するリスクを大幅に減らせる。
  • 不足する知識の注入: ベースモデルを再訓練することなく、必要な知識をLLMに提供できる。

具体的なユースケースとしては、主に二つの場面が挙げられる。

  1. 新しい情報に関する質疑応答: LLMが学習している知識にはタイムラグがある。例えば、GPT-4の公開されている学習データは2023年4月までの情報に基づいているとされている。もし今月に起きた出来事について質問しても、モデルは知らないため正確に答えられないだろう。RAGを活用すれば、最新のニュース記事、文書、分析データなどを取得し、それに基づいてLLMに回答を生成させることで、常に最新の情報に基づいた回答を得ることが可能になる。
  2. 独自の、またはニッチなデータに関する質疑応答: 会社の規定、社内Wiki、コンプライアンスマニュアル、製品仕様書、チームの議事録など、一般に公開されていない独自のデータに関する質問も、RAGで解決できる。これらの情報をファインチューニングでモデルに学習させることもできるが、文書が変更されるたびにモデルを再訓練する必要がある。RAGならば、単にドキュメントストアを更新するだけで済み、モデルを再訓練する必要がない。例えば、「年間で何ポイントのウェルネスポイントが付与されますか?」という質問があった場合、RAGシステムは人事ポリシーのページを取得し、LLMはそのページの内容のみに基づいて回答を生成する。

RAGは魔法ではない。それは、LLMの大きな弱点を補うための非常に実用的なパターンだ。LLMは言語のパターンや推論には優れているものの、知らない事実に対しては脆いという性質を持つ。RAGは、その欠点を埋めるために、適切なタイミングで適切な事実をプロンプトに持ち込む。そして、命令チューニングされたモデルは、その事実に基づいて指示に従い、根拠のある回答を生成する。多くの現実世界のアプリケーションにおいて、RAGは精度、保守性、そしてコストの最適なバランスを提供し、特に知識が頻繁に更新されるような状況では、単純なファインチューニングよりも優れた結果を出すことが多い。

関連コンテンツ

関連IT用語