体系 › RAG・検索拡張
·無料·10分で読めます

RAGの基礎と設計パターン — 埋め込み・チャンク・リランキング・評価を1から

検索拡張生成(RAG)を前提知識ゼロから解説。仕組みの直感、チャンク分割の戦略、ハイブリッド検索とリランキング、そして最重要の評価設計まで。

要点

  • RAGは、検索した関連ページをプロンプトに入れてLLMに答えさせる「持ち込み可の試験」方式である。
  • ファインチューニングと違いモデルを変更しないため、知識の更新は資料の差し替えだけで済み、出典も示せる。
  • 埋め込みは、意味が近い文がベクトル空間でも近くに配置されるよう学習されており、単語が一致しなくても意味で引ける。
  • ハイブリッド検索とcross-encoderによる2段階リランキングで、上位50〜100件を上位5〜10件に絞る。
  • 検索はRecall@kで、生成はFaithfulnessとAnswer Relevanceで、分けて評価するのが原則である。
対象textタスクragretrieval

RAGとは何か: LLMに「持ち込み可の試験」を受けさせる

LLMには構造的な弱点が2つあります。知識が学習時点で止まっていること、そして知らないことを聞かれるともっともらしい嘘(ハルシネーション)を生成しがちなことです。社内規程や最新の製品仕様など、モデルが学習していない情報には答えられません。

RAG(Retrieval-Augmented Generation, 検索拡張生成)はこれを「試験の受け方を変える」ことで解決します。閉卷試験(記憶だけで答える)ではなく、持ち込み可の試験にするのです。

  1. 質問が来たら、まず手元の資料棚から関連ページを検索する
  2. 見つけたページを質問と一緒にプロンプトに入れる
  3. LLMは「この資料に基づいて答えて」と指示されて回答する

用語としてのRAGは Lewis らの2020年の論文に由来しますが、現在は「外部知識を検索してプロンプトに注入する構成」全般を指す言葉として定着しています。ファインチューニングと違ってモデル自体は変更しないため、知識の更新が資料の差し替えだけで済み、回答の根拠(出典)を示せるのが大きな利点です。

全体パイプライン: 5つの工程

RAGは大きく「仕込み(インデックス構築)」と「実行(検索と生成)」に分かれます。

[仕込み]  文書 → チャンク分割 → 埋め込み → ベクトルDBに保存
[実行]    質問 → 埋め込み → 類似検索 → (リランキング) → プロンプト合成 → 生成

この記事では各工程を順に分解し、最後に「どこが壊れやすいか」を評価の観点から整理します。

埋め込み: 意味を座標にする

埋め込み(embedding)とは、テキストを数百〜数千次元の数値ベクトルに変換することです。ポイントはただ1つ、意味が近い文は、ベクトル空間でも近くに配置されるよう学習されていることです。

v1 = embed("有給休暇の申請方法")
v2 = embed("休みを取るにはどうすればいい?")
v3 = embed("サーバーの再起動手順")

cosine_sim(v1, v2)  # 高い(言い回しが違っても意味が近い)
cosine_sim(v1, v3)  # 低い

キーワード検索と違い、単語が一致しなくても意味で引けるのが強みです。逆に、型番・人名・エラーコードのような「文字列そのものの一致」が重要な検索は苦手で、これが後述のハイブリッド検索の動機になります。

ここで出てきた「類似度」の実体は、ベクトルどうしの内積(コサイン類似度)です。2本のベクトルが指す方向が近いほど値が大きくなる——線形代数の記事で扱った内積の幾何そのものなので、下の図で角度と内積の関係を触って確かめてみてください。

FIG 12本のベクトルの向きを変えると内積と余弦(コサイン類似度)が変わる。埋め込み検索の「意味が近い」とは、ベクトルのなす角が小さいことを指している

チャンク戦略: RAGの品質はここで大半が決まる

文書を丸ごと埋め込むと意味が平均化されてぼやけ、細かすぎると文脈が失われます。分割(チャンキング)の設計指針は次の通りです。

検索の物差し(内積・コサイン・距離)の違いは、事故が起きる形で理解しておくべきです。クエリをドラッグして、内積のときだけ「長いベクトルの房」が割り込むのを確かめてください。

FIG 2正規化しない内積検索では、向きが違っても長いベクトルが上位に入り込む。RAGが埋め込みを正規化する理由

内積そのものから固有値・低ランクまでの数学はLoRAとRAGを支える線形代数で1本にまとめています。

もう1つ効くのがメタデータの付与です。チャンクに「文書タイトル・章・更新日」を持たせ、検索時のフィルタ(例: 最新版のみ)や、チャンク先頭へのタイトル埋め込みに使うと精度が上がります。

逆に事故になりやすいのは、表・コードブロック・箇条書きの途中で機械的に切ることです。表の数行だけが切り出されたチャンクは「何の表か」という情報が消えており、埋め込んでも検索にかからず、運よく生成に渡っても根拠として機能しません。固定長分割を使う場合でも、最低限、表とコードは分割境界をまたがせない前処理を入れる——これだけで「検索は当たっているのに答えが壊れる」型の不具合がかなり減ります。同様に、PDFからのテキスト抽出が崩れている(段組みの読み順が入れ替わる、ヘッダー・フッターが本文に混入する)と、その後の工程をどれだけ磨いても取り返せません。チャンク設計の前に、まず抽出されたテキストを目視するのが遠回りに見えて最短です。

検索: dense・BM25・ハイブリッド

実務ではハイブリッドを既定にするのが安全です。ユーザーの質問には「意味で聞くもの」と「文字列で聞くもの」が必ず混在するからです。

リランキング: 荒く拾って、賢く並べ直す

ベクトル検索は「質問とチャンクを別々にベクトル化して距離を測る」ため高速ですが、精度には限界があります(bi-encoder方式)。そこで2段構えにします。

  1. 1段目(Retrieval): ベクトル/ハイブリッド検索で上位50〜100件を高速に取得
  2. 2段目(Reranking): cross-encoder(質問とチャンクを連結して1つのモデルに入れ、関連度を直接採点)で並べ直し、上位5〜10件だけをLLMに渡す

cross-encoderは1ペアごとに推論が必要で遅いため全件には使えませんが、候補を絞った後なら現実的です。「速いが粗い網で広く獲り、遅いが正確な目で選別する」—この2段構成はRAG品質を上げる最も費用対効果の高い一手であることが多いです。

評価: 「なんとなく良くなった」を卒業する

RAGは工程が多く、感覚だけの改善はすぐ迷子になります。検索と生成を分けて測るのが原則です。

検索の評価(生成の前に測る)

生成の評価

運用Tips

現場ではこう使う

RAGを実際に組む・運用するのは、社内文書QAボットや問い合わせ支援を作るバックエンド/MLエンジニアです。ゼロから作る場面よりも「動いてはいるが精度が出ないRAGを引き継いで改善する」場面のほうが多く、そのとき触るのは本文で見た各工程のパラメータです。

実際に触るもの: チャンク系では chunk_size と chunk_overlap(LangChainなら RecursiveCharacterTextSplitter の引数)。検索系では取得件数の top_k、ハイブリッド統合の重みやRRFの定数、メタデータフィルタの条件。ベクトルDBは FAISS・pgvector・Qdrant・Elasticsearch などから既存インフラとの相性で選ぶことが多く、リランカーは cross-encoder 系モデルを検索と生成の間に差し込むだけの構成が一般的です。

知らないと事故になる落とし穴:

面接・設計レビューで問われる問い: 定番は「検索精度が低いとき、まずどこを疑うか」。筋道は本文の通りで、プロンプトではなく検索を単体で測る(Recall@kを出す)→ ダメならチャンク境界と抽出前処理を見る → 次に埋め込みモデルの変更やハイブリッド化、の順で答えます。「RAGとファインチューニングの使い分けは」もよく問われます。知識の注入・更新はRAG、出力の形式・文体・振る舞いの矯正はファインチューニング、と役割の違いで答えるのが定石です。

まとめ

次回は、RAGの発展形(クエリ書き換え、HyDE、GraphRAG、エージェント型RAG)を設計パターンとして比較します。エージェントがツールとして検索を呼び出す構成の前提知識はLLMエージェントの基礎にまとめてあります。

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

コメントにはログインが必要です