自己改善型RAG — 検索結果を評価して引き直す
一発勝負の検索が外れたときに黙って誤答する構造を、評価と再検索のループで断てるようになる。Self-RAG・CRAG・Agentic RAGの違いと、コストに見合う導入判断ができる。
- 基本のRAGは検索を1回で終える一方通行なので、外れたときに気づく仕組みが無い。無関係な文書を渡されたLLMは、それでも自信のある答えを作ってしまう。
- 自己改善型の共通構造は「引いた文書が質問に答えるのに十分かを判定し、不十分なら別の手を打つ」。判定器の設計と、打ち手(再検索・クエリ変更・外部検索・回答拒否)の選択が設計の中身。
- ループは必ず有限に閉じる。最大反復回数と、諦めたときに正直に「分かりません」と答える経路を必ず用意する。無限に引き直すエージェントは事故になる。
基本のRAGは一方通行です。検索して、引いた文書を渡して、答えさせる。この構造には検索が外れたときに気づく仕組みがありません。
しかも悪いことに、LLM は無関係な文書を渡されても「情報がありません」とは言わず、渡された文書から無理に答えを組み立てる傾向があります。出典付きで、自信のある文体で、間違った答えが返る。RAG を導入したのに信頼性が上がらない、という感覚の正体はここにあります。
横にスクロール
共通する構造
Self-RAG・CRAG・Agentic RAG と名前は違いますが、骨格は同じです。
質問
↓
検索
↓
[判定] 引いた文書は、この質問に答えるのに十分か?
↓ ↓
十分 不十分
↓ ↓
生成 打ち手を選ぶ
↓ (再検索 / クエリ変更 / 別ソース / 諦める)
[判定] 回答は文書に基づいているか? ↓
↓ ↓ 戻る
根拠あり 根拠なし
↓ ↓
返す 作り直す or 諦める
判定が2箇所にあることに注目してください。検索結果の評価(引けたか)と生成結果の評価(根拠に基づいているか)は別の問題で、前者だけでは幻覚を止められません。
判定器をどう作るか
判定の質がすべてを決めます。実装の選択肢は3つあります。
| 判定方法 | コスト | 精度 | 向く場面 |
|---|---|---|---|
| スコアの閾値 | ほぼゼロ | 低い(絶対値が不安定) | 明らかに何も引けていない場合の足切り |
| リランカのスコア | 低い | 中〜高 | 既にリランカを入れているなら流用できる |
| LLMに判定させる | 高い | 高い | 微妙なケースの判断が要る場合 |
スコアの閾値だけに頼るのは危険です。ベクトル検索の類似度は、コーパスやクエリによって絶対値が動くため、「0.7以上なら十分」といった固定閾値は安定しません。「上位1件のスコアが極端に低い」という明らかな失敗の検出には使えますが、微妙なケースの判断には向きません。
リランカを既に入れているなら、その関連度スコアは判定に流用できます。cross-encoder はクエリと文書を突き合わせて評価しているので、bi-encoder の類似度より判定材料として信頼できます。
LLM に判定させる方式は精度が高い代わりに、候補ごとに呼ぶとコストが跳ねます。上位数件をまとめて1回のプロンプトで評価させる形にすると、呼び出しは1回で済みます。
「十分/不十分」の2値ではなく、「十分/曖昧/明らかに不足」の3値にすると打ち手を自然に選べます。十分ならそのまま生成、曖昧なら文書を追加で引いて補強、明らかに不足なら検索そのものをやり直すか外部ソースへ切り替える。CRAGが採る設計がこれで、2値より打ち手の粒度が細かくなります。
打ち手の設計
不十分と判定されたとき、何をするか。
クエリを変えて引き直す。 クエリ変換の各手法がそのまま打ち手になります。1回目が失敗した情報を使えるのが利点で、「この語で引いたら関係ない文書ばかりだった」という結果を踏まえて言い換えられます。
検索先を変える。 ルーティングの分類が外れていた可能性があります。別のコーパスや、フィルタを緩めた検索を試します。
外部の検索に逃がす。 社内コーパスに無い一般知識なら、Web検索へ切り替えます。CRAGが提案する経路の1つで、内部に無いものを内部で探し続けないという判断です。
諦めて正直に答える。 最も重要な打ち手です。「提供された資料の中には、この質問に答える情報が見つかりませんでした」と返すのは失敗ではなく、正しい振る舞いです。無理に答えさせるより価値があります。
ループを閉じる
ここが実装で最も事故りやすい箇所です。
必ず設ける制限
最大反復回数 : 2〜3回。それ以上引き直しても改善しないことが多い
累積トークン予算 : 1質問あたりの上限を決める
累積レイテンシ予算 : 体感を壊さない上限(例: 10秒)
終了条件 : 上限に達したら必ず「分かりません」経路へ落とす
判定器が厳しすぎると「十分」と判定されず延々と引き直します。1回の質問でLLMを数十回呼び、レイテンシが分単位になり、コストが跳ねます。上限に達したときの振る舞いを先に決めてからループを実装してください。上限に達したら、その時点で最良だった文書で回答するか、正直に諦めるかのどちらかへ必ず落とします。無限ループの防止はガードレールの一部として設計するのが筋の良いやり方です。
コストに見合うか
自己改善型は確実に高くつきます。判定に1回、再検索に1回、再生成に1回——素朴に実装すると、基本のRAGの3〜5倍のコストとレイテンシになります。
導入判断の順序は次の通りです。
- まず基本を固める。 チャンク設計・ハイブリッド検索・リランキングで検索を良くするほうが、はるかに安く効きます。1回目の検索が当たるなら、ループは要りません。
- 失敗の型を測る。 評価で、失敗が「検索が外れている」のか「検索は当たっているのに生成が悪い」のかを分けます。前者ならループが効き、後者なら効きません。
- 部分的に入れる。 全質問にループを回す必要はありません。明らかに検索が失敗したときだけ(スコアが極端に低い、結果がゼロ)作動させれば、平均コストはほとんど上がらずに最悪ケースだけが改善します。
3つ目が実務的な落としどころです。全質問で判定LLMを呼ぶのではなく、安価なスコア閾値で「明らかな失敗」だけを拾い、そこにだけ打ち手を投入します。
まとめ
- 基本のRAGは一方通行で、検索が外れても気づけない。LLM は無関係な文書からでも自信のある答えを作る。
- 共通構造は「引いた文書が十分かを判定し、不十分なら別の手を打つ」。判定は検索結果と生成結果の2箇所に要る。
- スコアの閾値だけに頼らない(絶対値が不安定)。リランカのスコア流用か、上位をまとめて1回のLLM判定が現実的。3値判定にすると打ち手が自然に決まる。
- 打ち手はクエリ変更・検索先変更・外部検索・諦める。「分かりません」と答えるのは失敗ではなく正しい振る舞い。
- ループは必ず有限に閉じる。最大反復・トークン予算・レイテンシ予算・上限到達時の経路を先に決める。
- コストは3〜5倍になる。まず基本を固め、失敗の型を測り、明らかな失敗時だけ作動させるのが実務的。
RAG設計パターンの記事ガイド
自己改善型RAG — 検索結果を評価して引き直すを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RAG
比較で見る軸
難易度: advanced / カテゴリ: RAG設計パターン / タグ数: 5
導入後に効く点
自己改善型の共通構造は「引いた文書が質問に答えるのに十分かを判定し、不十分なら別の手を打つ」。判定器の設計と、打ち手(再検索・クエリ変更・外部検索・回答拒否)の選択が設計の中身。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- RAG設計パターン
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RAG / Self-RAG」に近いか確認する。
- 強みである「基本のRAGは検索を1回で終える一方通行なので、外れたときに気づく仕組みが無い。無関係な文書を渡されたLLMは、それでも自信のある答えを作ってしまう。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。