みんなのAI
機械学習プレイグラウンド
読み込み中…

学ぶ

Ch.12

RAG:検索で幻覚を減らす

RAGを一望

Closed-book=暗記試験、RAG=オープンブック

「返金ポリシーは?」 に Closed-book は記憶のみ、RAG はTop-k検索→増強→生成。

Closed-book: 記憶のみ · RAG: 検索後生成

?✦✦
クエリ
VS
Closed-book
📚資料なし›🚫検索しない›🧠記憶のみ›❌幻覚

外部検索なし

?
?
?
?
?
根拠なし
それっぽい推測
→
AI
→
✕幻覚リスク
VS
RAG
📚文書ストア›🔍検索›📝増強›✨生成

Top-k選択

Top-3

類似度上位k

📄📄📄
根拠チャンク (Top-k)
→
AI
→
✨✓根拠付き回答
Closed-book — 検索なし生成 · RAG — 検索·増強·生成
Closed-book—外部文書なし→幻覚·古い情報リスク
RAG—保存→埋め込み→Top-k→増強→生成

1つの質問の処理

  1. ユーザーの質問が入る
  2. 埋め込みで類似度を測る
  3. Closed-book=検索なし、RAG=Top-k
  4. テンプレートで増強、予算内
  5. 生成、出典·kをログ
社内の規程チャットボットを想像してください。「今年の有給は何日まで繰り越せる?」と聞いたのに、古いがそれっぽい一般論だけ返ると、すぐ信頼が崩れます。それが幻覚(Hallucination) — 出典なしで自信ありげに答える状態です。
RAG(検索拡張生成) はオープンブックのように、答える前に社内文書から関連ページを探し、質問文に貼ってから書かせます。Closed-book は資料なしの暗記試験に近く、学習後のモデルは新しい PDF·ニュース·社内DBを常に正確には持てません。検索(Retrieve)→差し込み(Augment)→生成(Generate) の順で動きます。
実務でよく出る語は、長文のチャンク(1枚)、意味を数字の座標にする埋め込み、似た文を早く探す ベクタDB、Top-k(上位 k 枚だけ)、cos(向きが近いかの点数)、一度に読めるctx、指示+質問のプロンプト、だいたい語·音節サイズのトークンです。budget = ctx−prompt−query は、答案用紙で問題説明を引いたあと残った行と覚えれば十分です。本章は比喩と数字でつなぎ、難しい証明はしません。

数式の読み方(RAG)

1. コサイン類似度 + Top-k — 検索の心臓
検索では、質問 q とチャンク c の意味の向きがどれだけ近いかを数値化します。それがコサイン類似度で、式は次のとおりです。
cos(q,c)=q⋅c∥q∥∥c∥\text{cos}(\mathbf{q},\mathbf{c})=\dfrac{\mathbf{q}\cdot\mathbf{c}}{\|\mathbf{q}\|\|\mathbf{c}\|}cos(q,c)=∥q∥∥c∥q⋅c​
q\mathbf{q}q は質問の埋め込み、c\mathbf{c}c はチャンクの埋め込みです。値が大きいほど関連が強く、Top-kkk で上位 kkk だけ渡します(k=5 なら5枚)。動画サイトがタイトル·説明の座標で「次に見る」を選ぶのと同様です。スコア 0.92, 0.81, 0.55, 0.30, 0.12 なら Top-k=3 で上3つ。「出張経費」は「交通費」に近く「サークル」は遠い — 角度→上位k→根拠の順で覚えます。
q (query)qcos(q,c)chunks c₁…c₅92%c1類似度78%c255%c341%c422%c5Top-k · 類似チャンク
図では棒の高さがcos(q,c)。緑線の下 Top-k だけテンプレ穴に入れると読みます。
2. チャンク分割 — 一口サイズ
PDFを丸ごと入れられないので、チャンクという一口サイズに分けて保存します。1000ページの料理百科をレシピカードに分けるイメージです。
チャンクサイズ(例:200トークン)とオーバラップ(例:40トークン)を調整します。「7日以内返金」が境界で切れると、オーバラップなしで次カードに逃げて検索ミスになります。20トークンは文脈不足、800トークンは1枚で予算を食います。サイズ+オーバラップが土台です。
3. コンテキスト予算 — 答案用紙1枚
ctx は答案用紙1枚です。まず指示(prompt) と質問(query) を書き、残りにチャンクを貼ります。
chunk_budget=ctx−prompt−query\text{chunk\_budget}=\text{ctx}-\text{prompt}-\text{query}chunk_budget=ctx−prompt−query
4096−512−200=3384。予算1200、サイズ200なら 1200 // 200= 6 枚。8192−1024−256=6912。引き算と // は同じ流れの前後です。
4. プロンプトテンプレート — 穴埋め
固定の型に、Top-kkk で選んだ文だけ `{retrieved_chunks}` に入れます。「以下の資料のみで答えよ」+ 貼り付け欄 + 問題の構造です。
```
Context:
{retrieved_chunks}
Question: {user_query}
Answer:
```
例えば `[チャンク1] 購入後7日以内に返金...` を貼り、`海外配送も対象?` と質問します。テンプレはAugment の箱です。

RAG: 検索で根拠ある回答

1. オープンブック vs クローズドブック — RAGの誕生
LLMだけ使う方式をClosed-book(クローズドブック) と呼びます。資料持ち込み不可の暗記試験のように、学習時の記憶だけで答えます。一方RAG(検索拡張生成) はオープンブックに近く、答える前に図書館(文書ストア) から1ページ分(チャンク) を探して質問文に貼ります。
流れは検索(Retrieve)→穴埋め(Augment)→生成(Generate) です。関連チャンクを選び、`{context}` に入れてからLLMが文章を書きます。
「今年の有給規定はどう変わった?」と聞かれたとき、Closed-bookは去年の常識でそれっぽく答え、RAGは今年の人事PDF 7ページを根拠に答えます。違いはどのページを見たかです。
2. 埋め込み — 文字を座標に
コンピュータは「返金」「返品」の意味をそのまま比較しにくいので、埋め込みで文を数字のリスト(ベクトル) に変換します。似た話題は座標空間で近く、違う話題は遠くに並びます。
検索ではコサイン類似度(cos) を使います。二つのベクトルが同じ方向を向くか(角度) を見る点数で、直線距離より「話題が重なるか」に近いです。「返金」と「返品·チャージバック」は近く、「昼食メニュー」は遠い。RAGはこの点数で関連チャンクを選びます。
3. チャンク分割 & Top-kkk 検索
500ページの規程PDFも、プロンプトに丸ごと入れられません。チャンク分割は長文を一口サイズ(例:200トークン) に切って保管することです。細かく切るほど検索単位は増えますが、短すぎると文脈が切れます。
質問が来ると埋め込みとcosで順位をつけ、Top-kkk で上位k枚だけ渡します(k=3なら3枚)。数万枚を速く探すためにベクタDBを使います。カード索引のように、毎回PDF全体を読まず似た断片だけ取り出します。
kが大きすぎると無関係な段落が混ざりコストも増えます。適切なkが重要です。
4. コンテキスト予算 & プロンプトテンプレート
モデルには一度に読める上限(ctx) があります。答案用紙1枚と考えてください。まず指示(prompt) と質問(query) がスペースを使い、残りに検索チャンクを貼ります。残りがチャンク予算で、budget = ctx−prompt−query です。
貼るときはプロンプトテンプレートという固定型を使い、`{context}` に検索結果、`{question}` にユーザー質問を入れます。「以下の文書のみで答えよ」も入れ、空欄の外を推測させません。
ctx=4096、指示512、質問200なら予算3384。チャンク200トークンならおおよそ3384 // 200 ≈ 16枚。引き算(予算) と//(最大枚数) は同じ話の前後です。

重要性

1. なぜRAGが必要か — もっともらしい推測から、根拠ある回答へ
LLMは文章を滑らかに書くのが得意です。そのため社内規程·最新ニュース·未学習の製品情報では、自信ありげな誤答が出やすく、承認や顧客対応に使われた後で気づくこともあります。
RAGは先に文書を検索しプロンプトに入れてから生成します。「人事規程PDF 12ページを参照」と追跡でき、文書や検索設定を直せます。幻覚をゼロにするというより、検証しやすい答えに近づけます。
例: 「海外配送も7日返金?」— Closed-bookは国内ルールを一般化しがち、RAGは配送条項チャンクで条件付きに答えます。
2. 全再学習なしで『今日の知識』に合わせる
月曜朝に新PDFが出ても、7Bを丸ごと再学習するのは現実的ではありません。RAGではチャンク化→埋め込み→ベクタDB更新だけで、同じLLMが新条文を引用できます。
比喩: 教科書改訂時に全員の記憶を入れ替えるのではなく、図書館の本だけ差し替えるイメージです。
例: 「2026福利厚生」— シナリオ問題で再チャンク·DB更新が先になる理由です。
3. 賢いLLMでもページが違えば外れる — 検索は半分の仕事
生成が優秀でも、検索でページが違えば答えは外れます。「返品」の質問に「食堂メニュー」が入れば、文はきれいでも業務的には失敗です。
答えがおかしいときは、temperatureよりTop-k·チャンクサイズ·オーバラップ·再ランクを先に見ます。recall@kは「正しい文書が上位 k に入ったか?」の検索の成績表で、文章の上手さとは別評価です。RAGは①根拠
②最新性
③検索品質を一本のパイプラインで扱うための仕組みです。

使い方

① 知識の図書館を作る(取り込み·チャンク化)
まず根拠になる文書を集め、規程·マニュアル·FAQをチャンクに切ります。ファイル名·ページなどのメタデータを残せば、後で「出典を見せて」にすぐ応じられます。
各チャンクを埋め込みしてベクタDBへ。毎回PDF全体を読まない索引を作る段階で、以降は関連断片だけ取り出します。
② ぴったりの文書を探す(検索)
質問もベクトル化し、cos(q,c) が大きい順にTop-kkk を選びます。k=5なら5枚だけ次へ。必要なら再ランク·重複除去もします。
「検索はするが答えが外れる」ときは、まずk·チャンクサイズ·オーバラップを疑います。
③ 試験用紙を組み立てる(増強)
ctx−prompt−query の予算内でチャンクをつなぎ、`{context}` テンプレ穴に入れます。「以下の文書のみで答えよ」と書くのがAugment — 空の頭で推測させないためです。
④ 答えを書く(生成) — 四段階の流れ
完成プロンプトでLLMが回答し、出典·ページ·チャンクIDを示すと信頼が上がります。k·サイズ·予算·スコアをログし、幻覚や古い答えが増えたら検索設定を調整します。
全体では、収集/チャンクで文書をピザのように分割保管し(Splitter, Vector DB)、検索でしおりのように cos·Top-kkk でページを選び、増強でオープンブックのようにテンプレ·予算内に貼り、生成でLLMが参考文を見て答えます。図書館→ページ検索→穴埋め→生成が製品上の動きです。

まとめ

この章を一文でまとめると、RAGは図書館で関連ページを探し、質問文に貼ってから答えるオープンブックです。流れは検索(Retrieve)→穴埋め(Augment)→生成(Generate) です。
まず質問に近いチャンクを選びます。コサイン類似度 cos(q,c) は「質問 q とチャンク c の意味の向きが近いか」の点数で、高い順にTop-kkk だけ残します。次にプロンプトテンプレートの `{context}` に貼ります。モデルが一度に読める上限が ctx で、指示(prompt) と質問(query) を引いた残りが予算です。budget = ctx−prompt−query、チャンクが200トークンならおおよそ budget // chunk_size 枚入ります。
例: 「返金ポリシーは?」なら cos で規程PDFから3枚だけ選びます。ctx=4096、指示512、質問200なら 512+200 を引いた残りの行にだけ根拠を貼ります。
一度の検索では足りない複雑な質問は、マルチホップ(検索を何度かつなぐ)やエージェント(次に何を探すか自分で決める)へ広げます。

問題解説ノート

問題ではまず暗記試験(Closed-book) vs オープンブック(RAG) を思い出します。Closed-bookは検索なし、RAGはページ検索→cos(q,c)·Top-kkk·予算·テンプレで穴埋めしてから生成します。
流れはRetrieve→Augment→Generate。budget = ctx−prompt−query のあと budget // チャンクサイズ で最大枚数。temperatureは答えのばらつきで、検索品質とは別です。
よく出る数値: ctx=4096, prompt=512, query=200 → 3384 · Top-kkk=5 → 5枚 · 予算1200, サイズ200 → 1200 // 200= 6。「返品」↔「返金規程」は近く、「食堂」は遠い。

例 (概念 · concept) — RAGに最も近い? ② 検索→増強→生成 → 2

例 (判定 · ox) — 埋め込み検索で選ぶ → 1

例 (判定 · ox) — Closed-bookがPDFをTop-k → 0
セッションではコンテキスト予算(vote)·Top-k(vote)·チャンク数(aggregate/config) がよく出ます。パターンは「ctxから prompt·query を引き、残りを //」です。
例 (コンテキスト予算 · vote) — 上限4096、プロンプト512、クエリ200 → チャンク予算? → 3384
例 (Top-k · vote) — Top-k5 → チャンク数? → 5
例 (チャンク数 · aggregate) — 予算1200、サイズ200 → 1200 // 200= 6
例 (整数除算 · config) — 1400 // 200 は? → 7
例 (シナリオ · scenario)
「社内規程QAで最新PDFを急ぎ反映。まず?
①全再学習
②再チャンク化·ベクタDB更新
③softmax削除」
→ 正解2
例 (シナリオ · scenario)
「検索はするが回答が外れる。まず?
①temperatureのみ
②Top-k·チャンクサイズ·再ランク
③GPUドライバ」
→ 正解2
例 (概念 · concept)
「Top-kが大きすぎると?
①検索不可
②ノイズ·コスト増
③次元0」
→ 正解2
例 (概念 · concept)
「埋め込みに近い説明は?
①最適化手法名
②テキストをベクトル化して類似検索
③BNのみ」
→ 正解2
例 (判定 · ox)
「プロンプトテンプレートは`{context}`·`{question}`に検索結果を入れる枠。」
→ 正解1
例 (判定 · ox)
「コサイン類似度が大きいと常にユークリッド距離も小さい(学習用の簡略説明)。」
→ 向きの話 → 正解0
例 (パイプライン · ensemble)
「Top-k2、要約4文/チャンク → 合計? (2×42 \times 42×4)」
→ 8
例 (コンテキスト予算 · vote)
「上限8192、プロンプト1024、クエリ256 → 予算?」
→ 6912
例 (チャンク数 · config)
「予算2400、サイズ200 → 12」