Retrieval Augmented Generation (RAG)
RAGは、外部の知識ベースから関連する文章を検索し、LLMのプロンプトに追加します。これにより、最新かつ非公開で、出典を示せる情報に基づいた回答を生成できます。
検索拡張生成(RAG)は、大規模言語モデル(LLM)が質問に回答する際、外部の知識ソースからクエリ時に検索した文章を、質問とともにプロンプトへ挿入して利用する手法です。LLMの学習データには期限があり、企業の内部ドキュメントも含まれていないため、検索を使わないと事実を知らないか、もっともらしい内容を作り出してしまいます。これはハルシネーションと呼ばれる問題です。この用語は、Facebook AI ResearchのPatrick Lewis氏らによる2020年の論文Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasksに由来します。同論文では、事前学習済みBART生成モデルと、Wikipediaの密ベクトルインデックスを対象とするニューラルリトリーバーを組み合わせ、オープンドメイン質問応答の3つのタスクで最高水準の性能を達成しました。現在では、検索してから生成するあらゆるシステムをRAGと呼びます。
RAGパイプラインの仕組み#
RAGは2段階で動作します。インデックス作成は事前に行います。たとえばセマンティックチャンク化でドキュメントを文章に分割し、各文章を埋め込みに変換して、ベクトルをベクトルデータベースに保存します。クエリ時には、同じモデルで質問を埋め込みに変換し、ベクトル検索で最も近い文章を取得して、指示、文章、質問からプロンプトを作成します。次にLLMが、提供されたテキストに根拠を置いた回答を作成し、各主張の根拠となる文章を引用できます。
本番システムでは、この中核処理にいくつかのステップを加えます。ハイブリッド検索はベクトル類似度とキーワード照合を組み合わせ、型番などの完全一致が必要な語句を見落とさないようにします。リランカーは、より高精度なモデルを使って上位候補の順序を入れ替えます。また、コンテキスト検索では、インデックス作成前にLLMが各チャンクへ短い注記を付け、ドキュメント内での位置付けを示します。LangChainやLlamaIndexなどのフレームワークは、これらのコンポーネントをまとめて提供します。
検索と拡張の処理は、Sentence Transformersライブラリを使って、数行のPythonで実装できます。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Knowledge base: passages the LLM never saw during training
passages = [
"Badge access to Building C requires a safety briefing completed within the last 12 months.",
"The cafeteria in Building A serves breakfast from 7:00 to 9:30 on weekdays.",
"Forklift operators must renew their certification every three years.",
]
passage_embeddings = model.encode(passages)
# Retrieve: embed the question and keep the most similar passage
question = "How often do I need to redo forklift training?"
scores = model.similarity(model.encode(question), passage_embeddings)[0]
context = passages[int(scores.argmax())]
# Augment: put the retrieved passage in the prompt the LLM will answer from
prompt = f"Answer using only this context.\nContext: {context}\nQuestion: {question}"
print(prompt)このコードは、質問と意味が一致するフォークリフト認定の文章を含むプロンプトを出力します。質問はトレーニングのやり直しについて尋ねており、文章では認定の更新について述べています。どのLLMでもこのプロンプトから回答でき、モデルを再学習しなくても文章を毎日更新できます。
RAG、ファインチューニング、長いコンテキストの比較#
- ファインチューニング:新しい例を使ってモデルの重みを更新します。動作、スタイル、出力形式の変更には適していますが、頻繁に変わる事実を追加するには時間がかかり、引用できる情報源も残りません。そのため、多くのシステムでは形式の調整にファインチューニングを使い、知識の取得にRAGを使います。
- 長いコンテキストウィンドウ: 100万トークンを受け付けるモデルは、大量のドキュメントを直接読み込めますが、クエリごとにすべてのトークンのコストがかかり、入力が長くなるほど精度が低下します。この現象はコンテキスト劣化と呼ばれます。RAGは関連するパッセージだけを送信します。
基本的な手法を拡張したバリエーションもあります。GraphRAGはナレッジグラフから検索し、エージェント型RAGではエージェントが検索のタイミングと場所を判断します。マルチモーダルRAGはテキストだけでなく、画像、動画、音声も検索します。
RAGの用途#
- 企業向けチャットボット: 社内アシスタントがポリシー、Wiki、過去のサポートチケットに基づいて回答し、回答の根拠となった段落へのリンクを提示します。
- カスタマーサポート: アシスタントは返信前に、顧客の正確な製品モデルに対応するマニュアルと、その顧客の注文履歴を検索します。
- 医療: 臨床アシスタントは最新のガイドラインや医薬品情報を検索するため、モデルの記憶ではなく、確認可能な情報源に基づいて回答できます。
RAGは動画に関する質問にも回答できます。LLMは質問のたびに何時間もの映像を確認できないため、RAGとコンピュータービジョンを組み合わせることで、まず映像を検索可能な記録に変換します。トラッキングモードのUltralytics YOLO26は、各フレーム内のオブジェクトについてクラス、ボックス、永続的なトラックIDを報告し、パイプラインはこれらを行として保存します。そのため、「今朝、ドック3に何台のトラックが入ってきましたか?」のような質問では、動画ではなく該当する行を検索できます。
RAGの回答が誤る理由#
RAGは2つの段階で失敗します。検索の失敗は、チャンク化で回答を含む文章が分割された、埋め込みモデルが同義語を見逃した、または上位k件のカットオフよりわずかに下位にランクされたなどの理由で、その文章がプロンプトに届かないことを指します。これはテスト質問セットに対するk件以内の再現率で測定します。生成の失敗は、適切な文章が届いているにもかかわらず、モデルがそれを無視したり、誤読したり、矛盾する内容を述べたりすることです。Ragasなどの評価ライブラリは、両方を評価します。リトリーバーについてはコンテキスト再現率、生成モデルについては忠実度を測定します。忠実度は、回答内の主張のうち、検索したコンテキストで裏付けられるものの割合として定義されます。










