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η(d∣x)p_\eta(d\mid x)、generator の確率を pθ(y∣x,d)p_\theta(y\mid x,d) とすると、RAG の周辺化 likelihood は次のように書けます。

p(y∣x)=∑d∈Dkpη(d∣x)pθ(y∣x,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)=q⊤ed∥q∥∥ed∥s(x,d)=\frac{\mathbf{q}^\top\mathbf{e}_d}{\|\mathbf{q}\|\|\mathbf{e}_d\|}

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

Dk=TopK⁡d∈Ds(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 を無視することなどに分解できます。

関連ページ​

主なソース​