Skip to Content
Docs03. 実装RAG 実装パターン

この記事の音声は準備中です。

音声の一覧・再生リストへ

RAG 実装パターン

この記事の目的

検索拡張生成(RAG外部の知識ソースを検索し、結果を LLM の入力に加えて回答の根拠にする手法。検索の判断を Agent に任せる構成は Agentic RAG と呼ばれる。)を「概念として知っている」から「本番品質で実装できる」に進むための、取り込み・検索・生成・評価の各段の設計判断を扱います。チャンキング戦略、検索方式(ベクトル・キーワード・ハイブリッド)、リランキング、Agentic RAG、引用の提示、権限反映までを自分のシステムに合わせて選択できるようになります。

対象読者

  • 固定 RAG または Agentic RAG の実装・改善を担当するエンジニア
  • 「作った RAG の精度が上がらない」段階で、どの段を直すべきか切り分けたいエンジニア

前提知識

本文

概要: RAG は 4 段のパイプライン

RAG の品質問題は「どの段の問題か」を切り分けないと直せません。本記事では次の 4 段に分けて設計判断を整理します。

RAG 実装パターン: 概要: RAG は 4 段のパイプラインの図RAG 実装パターン: 概要: RAG は 4 段のパイプラインの図
RAG 実装パターン: 概要: RAG は 4 段のパイプラインの図
図を元の大きさで表示

図の中をスクロールして読めます。キーボードでは図の領域へ Tab で移動し、矢印キーを使います。読み終わったら、この見出しをもう一度選ぶと閉じます。

RAG 実装パターン: 概要: RAG は 4 段のパイプラインの図RAG 実装パターン: 概要: RAG は 4 段のパイプラインの図

経験則として、体感品質の問題の多くは生成(プロンプト)ではなく取り込みと検索に根があります。「必要な文書がそもそも上位に来ていない」状態でプロンプトを磨いても改善しません。

取り込み: チャンキング(chunking)とメタデータ

チャンキング(chunking)とは、文書を検索・投入の単位に分割することです。分割の設計が検索品質の上限を決めます。

戦略内容向く文書
固定長分割N トークンごとに機械的に分割(前後の重なり = オーバーラップ付き)構造の乏しいテキスト。まず動かす初手
構造ベース分割見出し・段落・表・コードブロックなど文書構造の境界で分割Markdown・HTML・社内 Wiki など構造のある文書
意味ベース分割話題の切れ目を埋め込み類似度などで検出して分割構造がなく話題転換の多い長文(コスト増に見合うか要評価)

設計時の考え方は次のとおりです。

  • チャンクサイズはトレードオフです。小さいほど検索の的中は鋭くなるが文脈が欠け、大きいほど文脈は保たれるがノイズが増えて「どこが答えか」がぼやけます。文書タイプごとに評価セットで比較して決めます(勘で固定しない)
  • 分割の境界で意味を切らないことが原則です。表の途中・手順の途中で切れたチャンクは、検索にヒットしても使いものになりません。構造ベース分割を優先し、長すぎる節だけ二次分割します
  • チャンク単体で意味が通るかを確認します。「前述の設定を〜」だけのチャンクは検索しても文脈不明です。見出しパスや要約をチャンク先頭に付与する(コンテキスト付きチャンク)と、検索・生成の両方が安定します
  • メタデータ(出典文書・セクション・更新日・部署・アクセス権限ラベルなど)を必ず付けます。検索時のフィルタ(後述の権限反映・鮮度優先)と、引用の提示の両方で必須になります

埋め込みと検索方式

埋め込みモデルの選定では、対象言語(日本語の検索品質)・入力長・次元数(ストレージと速度)・コストを見ます。注意すべきは、埋め込みモデルの変更は全チャンクの再インデックスを意味することです。モデル選定のやり直しは高くつくため、評価セットで比較してから決め、インデックスにモデル名とバージョンを記録しておきます(選定の一般論は モデル選定ガイド)。

検索方式は 3 択です。

方式得意苦手
ベクトル検索言い換え・曖昧な質問(意味の近さ)型番・人名・エラーコードなどの完全一致
キーワード検索(BM25 等)固有名詞・型番・コード片の完全一致言い換え・語彙の揺れ
ハイブリッド検索両者の結果を統合(RRF などの順位融合)実装・チューニングの手間

実務の初期値は ハイブリッド検索です。「ベクトル検索だけ」で始めると、型番・エラーコード・固有名詞の質問(業務システムでは頻出)で静かに失敗します。

リランキングとハイブリッド検索の組み立て

リランキング(reranking)とは、一次検索で広めに取った候補(例: 上位 50 件)を、より精密なモデルで並べ直して上位数件に絞る 2 段目の処理です。一次検索は再現率(取りこぼさない)を、リランキングは精度(上位の質)を担当する、という分業になります。

  • 効果: コンテキストに入れる件数を絞れるため、生成品質とコストの両方に効きます。「上位 20 件を全部入れる」より「リランキング後の上位 5 件」の方が良い結果になることが多いです
  • コスト: リランキングは候補件数に比例した追加レイテンシ・費用がかかります。まずハイブリッド検索のみで評価し、上位の質がボトルネックだと確認できてから追加します
  • 順序: 利用者の権限条件を確定 → その条件を検索時に適用して候補取得 → リランキング → 上位 k 件をコンテキストへ、を基本候補にします。権限条件はモデルが省略・変更できないようツール実装側で強制します

件数制限の後で権限フィルタを掛ける方式では、上位候補が権限外に偏ると、下位にある閲覧可能な文書を取りこぼします。基盤の制約などで後フィルタを選ぶ場合は、候補数の拡張・追加取得を設計し、利用者が閲覧可能な正解文書を母集団とした再現率を測ります。いずれの方式も、権限外の候補を生成モデルや外部のリランキングサービスへ渡してはいけません。検索基盤によるフィルタ時点の違いは Azure AI Search の解説 に具体例があります。

Agentic RAG の実装

クエリの言い換え、複数ソースの検索、取得値の計算は、固定された多段ワークフローでも実装できます。例えば「クエリ書き換え → 2 つの索引を並列検索 → 統合 → 計算 → 回答」は、各ステップに LLM を含めても経路は事前に定義できます。途中結果に応じてモデルが検索先・再検索・次の操作を動的に選ぶ必要がある場合に Agentic RAG を検討します。操作数だけを採用理由にしません(Anthropic の Workflow / Agent の区別 、RAG と Agent の関係・使い分け)。

検索の制御を Agent に渡すと決めた場合は、次を設計します。

  • 検索をツールとして定義する: 「クエリ」「フィルタ(文書種別・期間)」「件数」をパラメータにした検索ツールを渡します。ツール説明文には「どんな知識が入っているか」「どういうときに検索すべきか」を書きます(ツール定義の設計)
  • クエリの再構成を任せる: 必要に応じて、会話履歴を踏まえた具体化・分解をモデルに行わせます。クエリ書き換え単体は固定ワークフローにも置けるため、その効果と動的な経路選択の効果を分けて評価します
  • 反復の上限を決める: 検索 → 結果確認 → 再検索のループに回数・トークンの上限を設けます。「見つからないときに諦めて『わからない』と言う」条件も指示します
  • 検索結果の要約投入: 長いチャンクを複数往復で扱うとコンテキストが膨らみます。ヒット結果の要約や抜粋をループに返し、全文は最終生成時のみ投入する構成でコストを抑えられます(コンテキストエンジニアリング)

引用・根拠の提示

回答には出典を必ず付けます(RAG と Agent の関係・使い分け のアンチパターンでも触れた原則の実装編です)。

権限反映と運用

  • 権限反映(ACL)検索: 社内文書には閲覧権限があります。インデックスを 1 つに統合するなら、チャンクのメタデータに権限ラベルを持たせ、検索時に必ず利用者の権限でフィルタします。生成後のフィルタでは手遅れです(権限外文書の内容が回答に混入してから消すことはできません)。この設計を怠ると、RAG が権限バイパス経路になります(データ漏えい対策)
  • 鮮度と再インデックス: 文書の更新をどう反映するか(定期全再構築 / 差分更新)、古い版をいつ消すかを最初に決めます。「規定は改定されたのに回答が古い」は RAG の典型的な信頼失墜パターンです
  • インデックスのバージョニング: チャンキング設定・埋め込みモデルを変えたら別インデックスとして構築し、評価で比較してから切り替えます(ロールバック可能に。バージョニング・デプロイ・モデル更新追従 と同じ考え方です)

RAG の評価: 検索と生成を分けて測る

RAG の評価は最終回答だけを見ると切り分けができません。段ごとに測ります。

対象代表的な問い測り方の例
検索必要なチャンクが上位 k 件に入っているか質問と正解チャンクの対応表を作り、再現率(recall@k)や順位を測る
生成与えたチャンクに忠実か(faithfulness)・質問に答えているかLLM-as-a-Judgeコードでは採点できない開放的な出力を、基準を与えた別の LLM に判定させる評価手法。judge 自体の検証(人手ラベルとの一致率測定)を前提とする。 + 抜き取りの人手確認
全体最終回答が正しいか・出典が正しいかエンドツーエンドの評価セット

「検索は当たっているのに回答が悪い」なら生成(プロンプト・チャンク投入方法)を、「検索から外している」なら取り込み・検索(チャンキング・方式・クエリ書き換え)を直します。評価セットの作り方自体は 評価データセットの構築と保守 を参照してください。

実務での注意点

アンチパターン

  • ベクトル検索だけで本番に出す → 型番・人名・エラーコードの完全一致質問で静かに失敗し続ける → ハイブリッド検索を初期値にし、失敗クエリのログで方式を調整する
  • チャンクサイズを勘で決めて再評価しない → 精度の上限がそこで固定され、プロンプト改善で挽回できない → 文書タイプごとに評価セットでサイズ・分割方式を比較する
  • 権限フィルタを生成後に掛ける(または掛けない) → 権限外文書の内容が回答へ混入し、RAG が権限バイパス経路になる → 検索段でのメタデータフィルタを必須にし、権限テストケースを評価に含める
  • 最終回答の良し悪しだけで改善する → どの段が悪いか分からず、あてずっぽうの修正が続く → 検索(recall@k)と生成(忠実性)を分離して計測する
  • 埋め込みモデルを気軽に乗り換える → 全チャンク再インデックスと評価やり直しの費用を見落とす → 変更はインデックスのバージョニングと評価比較を伴う「デプロイ」として扱う

チェックリスト

  • チャンキングは文書構造を考慮し、サイズ・オーバーラップを評価セットで比較して決めた
  • チャンクに出典・更新日・権限ラベルなどのメタデータが付いている
  • 完全一致系の質問(型番・固有名詞)に対応できる検索方式(ハイブリッド等)になっている
  • 検索時に利用者の権限でフィルタしており、権限テストケースが評価にある
  • フィルタの適用時点を確認し、件数制限による取りこぼしを権限制限下の再現率で評価した
  • 固定の多段ワークフローと比較し、Agentic RAG が必要なら動的な経路選択の理由を説明できる
  • 回答に出典が付き、根拠チャンク ID から検証できる
  • 該当情報がないときに「見つからない」と答える設計(指示 + コード側ガード)がある
  • 検索品質(recall@k)と生成品質(忠実性)を分離して計測している
  • 再インデックスの運用(頻度・差分・旧版削除)とインデックスのバージョニングが決まっている

関連トピック

参考資料

TODO・未確認事項