Skip to main content

Retrieval-Augmented Generation

Retrieval-Augmented Generation (RAG) は、LLM の prompt に 外部知識ベースから検索した文書 を加えて回答を生成する手法です。LLM だけでは扱えない最新情報、社内文書、長文 corpus などを扱う標準的方法になっています。

なぜ RAG なのか

LLM 単体には次の限界があります。

  • 学習データの cutoff 以降の情報を知らない
  • パラメータに収まらない長文 / 専門知識を覚えにくい
  • 出典を示せない (hallucination)
  • 更新するには再学習が必要

RAG は、検索 + 生成 を組み合わせてこれらを軽減します。

典型 architecture

  1. Indexing: 文書を chunk に分割し、embedding を vector DB に格納
  2. Retrieval: query を embedding し、近傍 chunk を取得
  3. Augmentation: chunk を prompt に挿入
  4. Generation: LLM が context を見ながら回答

Embedding

Chunk と query を密 vector に写すために、専用の text embedding model を使います。代表例: OpenAI text-embedding-3、BGE、E5、GTE、Cohere Embed、Voyage 系。

評価は MTEB benchmark で行われることが多いです。

純粋な 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目的注意点
Cleaningboilerplate、重複、壊れた table を除くgarbage in, garbage out になりやすい
Chunkingretrieval しやすい単位に分ける小さすぎると文脈不足、大きすぎると ranking が鈍る
Metadatatitle、section、date、権限、source を付けるfiltering と citation に効く
Embeddingdense vector を作るdomain に合う embedding model を選ぶ
Indexingvector / 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 RAGquery embedding → top-k retrieval → answer小規模 FAQ
Hybrid RAGdense retrieval + BM25 + reranker固有名詞、型番、略語が多い corpus
Corrective RAG取得結果が弱いときに再検索するquery が曖昧な場合
Agentic RAGagent が検索、読む、再検索を繰り返す調査型 task
GraphRAGentity / 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

  1. Source document の更新、削除、権限を index に反映できるようにします。
  2. Chunk には document id、section title、URL、更新日、権限 metadata を付けます。
  3. Dense retrieval と sparse retrieval の両方を評価します。
  4. Reranker を入れる前後で recall@k と answer faithfulness を比較します。
  5. Answer には citation を付け、citation が文の根拠になっているかを評価します。
  6. Human evaluation と synthetic evaluation を分けて運用します。

高度な RAG

パターン内容
Query rewritingLLM で query を書き直して retrieval 精度を上げる
HyDE仮想的な答えを生成して embedding に使う
Multi-query1 query → 複数 sub-query
RAG-Fusion複数 ranking を Reciprocal Rank Fusion
Agentic RAGAgent が自分で検索ループを回す
GraphRAGKnowledge 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 xx に対して document dd を検索し、その document を条件に回答 yy を生成します。Retriever の確率を pη(dx)p_\eta(d\mid x)、generator の確率を pθ(yx,d)p_\theta(y\mid x,d) とすると、RAG の周辺化 likelihood は次のように書けます。

p(yx)=dDkpη(dx)pθ(yx,d)p(y\mid x)=\sum_{d\in\mathcal{D}_k}p_\eta(d\mid x)p_\theta(y\mid x,d)

ここで、Dk\mathcal{D}_k は top-k retrieval で得た document 集合です。この式の気持ちは、「どの文書を根拠にするかの不確実性を retriever が持ち、その文書を見た generator が回答を作る」というものです。

Dense retrieval では、query embedding q=fq(x)\mathbf{q}=f_q(x) と document embedding ed=fd(d)\mathbf{e}_d=f_d(d) の内積または cosine similarity を使います。

s(x,d)=qedqeds(x,d)=\frac{\mathbf{q}^\top\mathbf{e}_d}{\|\mathbf{q}\|\|\mathbf{e}_d\|}

Top-k document は次のように選ばれます。

Dk=TopKdDs(x,d)\mathcal{D}_k=\operatorname{TopK}_{d\in\mathcal{D}}s(x,d)

この式の気持ちは、「LLM に全部の corpus を渡すのではなく、query と意味的に近い chunk だけを context に入れる」ということです。RAG の失敗は、retrieval miss、chunk 分割の悪さ、reranking の失敗、generator が context を無視することなどに分解できます。

関連ページ

主なソース