RAG
検索拡張生成 / Retrieval-Augmented Generation
検索(Retrieval)と生成モデルを組み合わせ、外部知識に基づいて出力を根拠づける手法
概要
検索拡張生成(RAG)は、外部知識源(社内文書・Webページ・データベース等)から質問に関連する文書をあらかじめ検索し、その検索結果をプロンプトのコンテキストとしてLLMに与えたうえで回答を生成させる手法。LLM単体では学習時点の知識しか持たず、企業固有の情報や学習後に発生した最新情報には対応できないが、RAGは推論のたびに外部データベースを参照するため、モデル自体を再学習せずに知識を常に最新化できる。文書をベクトル化して類似度検索する「ベクトル検索型」が主流だが、キーワード検索や構造化データへのクエリと組み合わせるハイブリッド構成も広く使われる。生成結果に出典を明示しやすく、ハルシネーション対策としても有効なため、企業向けチャットボットやドキュメント検索アシスタントの標準的な実装パターンになっている。
背景
RAGはLLMが持つ静的な知識とハルシネーションの限界に対処する。推論時に最新または領域固有の外部データを参照させることで解決する。
歴史
2020年: Lewis らが知識集約型NLPタスク向けにRAGを提案。2023-2024年: ベクトルデータベースを介したRAGがエンタープライズLLMアプリの標準パターンに。
アーキテクチャ
クエリエンコーダ → インデックス化された文書ストアに対するベクトル類似度検索 → 検索されたパッセージをLLMプロンプトへ挿入 → 生成。
ワークフロー
文書の取り込み → チャンク分割と埋め込み → ベクトルインデックスへの格納 → クエリ時にtop-kチャンクを検索 → 検索結果を条件として回答生成。
コード例
基本的なRAG検索ステップ
results = vector_store.similarity_search(query, k=4)
context = "\n".join(r.page_content for r in results)
prompt = f"Answer using this context:\n{context}\n\nQuestion: {query}"利点
- 検索した根拠に基づくことでハルシネーションを低減
- モデルを再学習せずに知識を更新できる
- 出典の提示に対応できる
欠点
- 検索精度が回答品質全体のボトルネックになる
- ベクトルDB・インデックス構築など追加のインフラと遅延が発生する
比較
- ファインチューニング — RAGは推論時に知識を注入する。ファインチューニングは知識をモデル重みに焼き込む
関連用語
よくある質問
RAGにはファインチューニングが必要?
不要。一般に、既製の凍結されたLLMと検索パイプラインの組み合わせで機能する。