Retrieval-Augmented Generation
Retrieval-Augmented Generation (RAG) は、LLM の prompt に 外部知識ベースから検索した文書 を加えて回答を生成する手法です。LLM だけでは扱えない最新情報、社内文書、長文 corpus などを扱う標準的方法になっています。
なぜ RAG なのか
LLM 単体には次の限界があります。
- 学習データの cutoff 以降の情報を知らない
- パラメータに収まらない長文 / 専門知識を覚えにくい
- 出典を示せない (hallucination)
- 更新するには再学習が必要
RAG は、検索 + 生成 を組み合わせてこれらを軽減します。
典型 architecture
- Indexing: 文書を chunk に分割し、embedding を vector DB に格納
- Retrieval: query を embedding し、近傍 chunk を取得
- Augmentation: chunk を prompt に挿入
- Generation: LLM が context を見ながら回答
Embedding
Chunk と query を密 vector に写すために、専用の text embedding model を使います。代表例: OpenAI text-embedding-3、BGE、E5、GTE、Cohere Embed、Voyage 系。
評価は MTEB benchmark で行われることが多いです。
Hybrid search
純粋な dense embedding は意味的検索に強いですが、固有名詞や略語に弱い場合があります。実用では dense + sparse (BM25) の hybrid + reranker が標準です。
Chunking
良い RAG は良い chunking から始まります。
- Fixed-size (例: 512 token + overlap)
- Sentence / paragraph 単位
- Semantic / topic-based chunking
- Hierarchical (parent doc + small chunks)
- Late chunking (model 内部で集約)
Indexing pipeline
RAG の品質は、generation model より前に indexing pipeline で大きく決まります。文書をそのまま vector DB に入れるだけでは、検索単位が粗すぎたり、逆に細かすぎたりして、必要な情報が context に入らないことがあります。
| Step | 目的 | 注意点 |
|---|---|---|
| Cleaning | boilerplate、重複、壊れた table を除く | garbage in, garbage out になりやすい |
| Chunking | retrieval しやすい単位に分ける | 小さすぎると文脈不足、大きすぎると ranking が鈍る |
| Metadata | title、section、date、権限、source を付ける | filtering と citation に効く |
| Embedding | dense vector を作る | domain に合う embedding model を選ぶ |
| Indexing | vector / sparse index に登録する | 更新頻度と削除処理も設計する |
Retrieval pipeline
実用的な RAG は、単一の vector search だけではなく、query transformation、hybrid search、reranking、context packing を組み合わせます。
Query rewriting
User query は短すぎたり、指示文と検索語が混ざったりします。Query rewriting は、LLM を使って retrieval に向いた query に変換します。Multi-hop question では、query を sub-question に分解することもあります。
Reranking
Retriever は高速ですが粗いです。Top 50〜100 件程度を取得し、その後に cross-encoder や LLM reranker で top-k を並べ替えると、answer に必要な chunk が context に入りやすくなります。
Context packing
取得した chunk をそのまま詰めると、重複や順序の悪さで context window を浪費します。実務では、source ごとの deduplication、section hierarchy の復元、重要 chunk の前方配置、citation id の付与を行います。
RAG の代表 pattern
| Pattern | 内容 | 向いている場面 |
|---|---|---|
| Naive RAG | query embedding → top-k retrieval → answer | 小規模 FAQ |
| Hybrid RAG | dense retrieval + BM25 + reranker | 固有名詞、型番、略語が多い corpus |
| Corrective RAG | 取得結果が弱いときに再検索する | query が曖昧な場合 |
| Agentic RAG | agent が検索、読む、再検索を繰り返す | 調査型 task |
| GraphRAG | entity / relation graph を使う | 組織知、長文 report、関係性分析 |
| Long-context RAG | 多数 chunk を long context model に入れる | retrieval recall を優先したい場合 |
失敗パターン
- Retrieval miss: 正しい文書が top-k に入らない。
- Lost in the middle: 正しい chunk が context にあっても、LLM が使わない。
- Citation drift: 回答内容と citation が対応しない。
- Stale index: source は更新済みだが index が古い。
- Permission leakage: 検索時にアクセス権限 filter を忘れる。
- Over-retrieval: 関係ない chunk を入れすぎて回答がぼやける。
実装 checklist
- Source document の更新、削除、権限を index に反映できるようにします。
- Chunk には document id、section title、URL、更新日、権限 metadata を付けます。
- Dense retrieval と sparse retrieval の両方を評価します。
- Reranker を入れる前後で recall@k と answer faithfulness を比較します。
- Answer には citation を付け、citation が文の根拠になっているかを評価します。
- Human evaluation と synthetic evaluation を分けて運用します。
高度な RAG
| パターン | 内容 |
|---|---|
| Query rewriting | LLM で query を書き直して retrieval 精度を上げる |
| HyDE | 仮想的な答えを生成して embedding に使う |
| Multi-query | 1 query → 複数 sub-query |
| RAG-Fusion | 複数 ranking を Reciprocal Rank Fusion |
| Agentic RAG | Agent が自分で検索ループを回す |
| GraphRAG | Knowledge graph と組み合わせる |
| Long-context RAG | 大量 chunk を long context モデルに入れる |
評価
RAG の評価は二段階で行うのが標準です。
- Retrieval: hit rate、MRR、recall@k
- Generation: faithfulness (出典通り)、answer relevance、context utilization
代表 framework: Ragas、TruLens、ARES。
数式で見る retrieval と generation の結合
RAG では、query に対して document を検索し、その document を条件に回答 を生成します。Retriever の確率を 、generator の確率を とすると、RAG の周辺化 likelihood は次のように書けます。
ここで、 は top-k retrieval で得た document 集合です。この式の気持ちは、「どの文書を根拠にするかの不確実性を retriever が持ち、その文書を見た generator が回答を作る」というものです。
Dense retrieval では、query embedding と document embedding の内積または cosine similarity を使います。
Top-k document は次のように選ばれます。
この式の気持ちは、「LLM に全部の corpus を渡すのではなく、query と意味的に近い chunk だけを context に入れる」ということです。RAG の失敗は、retrieval miss、chunk 分割の悪さ、reranking の失敗、generator が context を無視することなどに分解できます。
関連ページ
- LLM Overview
- Long Context and Position Encoding
- KV Cache
- AI Agents Overview
- Tool Use and Function Calling
主なソース
- Original RAG paper: https://arxiv.org/abs/2005.11401
- MTEB benchmark: https://arxiv.org/abs/2210.07316
- HyDE: https://arxiv.org/abs/2212.10496
- GraphRAG: https://arxiv.org/abs/2404.16130
- Ragas: https://docs.ragas.io/
- Advanced RAG Techniques: https://arxiv.org/abs/2312.10997