RAGの基礎と設計パターン — 埋め込み・チャンク・リランキング・評価を1から
検索拡張生成(RAG)を前提知識ゼロから解説。仕組みの直感、チャンク分割の戦略、ハイブリッド検索とリランキング、そして最重要の評価設計まで。
RAGとは何か: LLMに「持ち込み可の試験」を受けさせる
LLMには構造的な弱点が2つあります。知識が学習時点で止まっていること、そして知らないことを聞かれるともっともらしい嘘(ハルシネーション)を生成しがちなことです。社内規程や最新の製品仕様など、モデルが学習していない情報には答えられません。
RAG(Retrieval-Augmented Generation, 検索拡張生成)はこれを「試験の受け方を変える」ことで解決します。閉卷試験(記憶だけで答える)ではなく、持ち込み可の試験にするのです。
- 質問が来たら、まず手元の資料棚から関連ページを検索する
- 見つけたページを質問と一緒にプロンプトに入れる
- LLMは「この資料に基づいて答えて」と指示されて回答する
用語としてのRAGは Lewis らの2020年の論文に由来しますが、現在は「外部知識を検索してプロンプトに注入する構成」全般を指す言葉として定着しています。ファインチューニングと違ってモデル自体は変更しないため、知識の更新が資料の差し替えだけで済み、回答の根拠(出典)を示せるのが大きな利点です。
全体パイプライン: 5つの工程
RAGは大きく「仕込み(インデックス構築)」と「実行(検索と生成)」に分かれます。
[仕込み] 文書 → チャンク分割 → 埋め込み → ベクトルDBに保存
[実行] 質問 → 埋め込み → 類似検索 → (リランキング) → プロンプト合成 → 生成
この記事では各工程を順に分解し、最後に「どこが壊れやすいか」を評価の観点から整理します。
埋め込み: 意味を座標にする
埋め込み(embedding)とは、テキストを数百〜数千次元の数値ベクトルに変換することです。ポイントはただ1つ、意味が近い文は、ベクトル空間でも近くに配置されるよう学習されていることです。
v1 = embed("有給休暇の申請方法")
v2 = embed("休みを取るにはどうすればいい?")
v3 = embed("サーバーの再起動手順")
cosine_sim(v1, v2) # 高い(言い回しが違っても意味が近い)
cosine_sim(v1, v3) # 低い
キーワード検索と違い、単語が一致しなくても意味で引けるのが強みです。逆に、型番・人名・エラーコードのような「文字列そのものの一致」が重要な検索は苦手で、これが後述のハイブリッド検索の動機になります。
ここで出てきた「類似度」の実体は、ベクトルどうしの内積(コサイン類似度)です。2本のベクトルが指す方向が近いほど値が大きくなる——線形代数の記事で扱った内積の幾何そのものなので、下の図で角度と内積の関係を触って確かめてみてください。
チャンク戦略: RAGの品質はここで大半が決まる
文書を丸ごと埋め込むと意味が平均化されてぼやけ、細かすぎると文脈が失われます。分割(チャンキング)の設計指針は次の通りです。
- 固定長分割: 実装が最も簡単。例として512〜1024トークン程度+10〜20%のオーバーラップ(文脈の切断を緩和)から始めるのが定番
- 構造ベース分割: Markdownの見出し、段落、条項など文書の論理構造で切る。構造を持つ文書(規程・マニュアル・API文書)では固定長より一貫して良い結果になりやすい
- セマンティック分割: 隣接文の埋め込み類似度が急落する点で切る。計算コストと引き換えに話題の境界を尊重できる
- 親子チャンク(small-to-big): 検索は小さいチャンクで精度を上げ、LLMに渡すのはその親(前後を含む大きな塊)にするパターン。検索精度と文脈量のトレードオフを両取りできる実務の定番
検索の物差し(内積・コサイン・距離)の違いは、事故が起きる形で理解しておくべきです。クエリをドラッグして、内積のときだけ「長いベクトルの房」が割り込むのを確かめてください。
内積そのものから固有値・低ランクまでの数学はLoRAとRAGを支える線形代数で1本にまとめています。
コメント
コメントにはログインが必要です