RAGの仕組み — 資料を探してから、答えを作る
探すところと、答えを作るところを分ける
まずは、休暇の案内を探す
RAGは、質問に関係する資料を探し、生成モデルの入力へ加える構成です。Python 3があれば、まずは検索だけを小さく試せます。次をretrieve-demo.pyへ保存し、python retrieve-demo.pyで実行しましょう。
documents = [
("休暇案内", "休暇は社内ポータルのフォームで申請します。"),
("経費案内", "経費は領収書を添えて経理フォームで精算します。"),
]
question = "休暇はどこから申請しますか?"
selected = [doc for doc in documents if "休暇" in doc[1]]
print("質問:", question)
for doc_id, text in selected:
print(f"[{doc_id}] {text}")
表示には[休暇案内] 休暇は社内ポータルのフォームで申請します。が含まれます。これは固定したキーワードで資料を拾う練習で、まだ生成モデルへつないでいません。質問の意味を理解して検索するものでもありません。検索と生成をつなぐ手順はRAG入門で試せます。
資料と質問を、回答の材料へ渡す
資料の準備と、質問が来てからの処理を分けます。準備では資料を取り込み、必要なまとまりへ分割し、文書ID・更新日・閲覧権限等を持たせます。質問時は許可された資料を検索し、質問と根拠を生成モデルへ渡します。
ベクトル検索は選択肢の一つです。キーワードや両者を合わせた検索も使えます。コサイン類似度は向きの近さで、大きい値ほど似ている指標です。「距離」を使う場合は小さいほど近いなど、定義を確かめます。ベクトルが近くても、その資料に正しい答えがあるとは限りません。
「見つかった」と「答えられる」を分ける
この案内で申請先は分かりますが、休暇の日数は分かりません。次の問いを試すと、回答を作ってはいけない場面が見えます。
| 質問 | この資料から分かること |
|---|---|
| どこから申請する? | 社内ポータルのフォーム |
| 年間何日ある? | 書かれていない |
| 経費の申請先は? | 経費案内を別に検索する必要がある |
検索の漏れ、元資料の古さ、根拠と回答の食い違い、回答保留を別々に確認します。資料を更新したら検索用のコピーも更新し、引用IDから元の版を追えるようにします。
もう少し詳しく:追加学習・権限・運用
RAGの通常の参照処理は、モデルの重みを再学習することとは異なります。一方、RAGの原著論文には検索と生成を組み合わせて学習する構成もあります。「RAGという名前なら学習は一切しない」とすべてを同じ扱いにしません。
追加学習はモデルの振る舞いやパラメーターへ関わり、RAGと組み合わせる場合もあります。RAGにも資料の整備、索引の更新、検索・生成の費用や評価があるため、「推論だけだから初期費用は必ず低い」とは言えません。
社内資料は利用者に許されたものを検索時から絞ります。外部APIへ送る範囲や保持条件も確認し、資料中の命令を信頼しない設計が必要です。指示文だけで情報漏えいを防ぐことはできません。
🐧 ペンギン先生のまとめ:「RAG」って出てきたら「資料を探して、答えの材料にしてから生成する仕組み」と思えばだいたいOK!
実装はRAG入門、動いて結果を見る仕組みはAIエージェントへ進めます。
参考資料
- Microsoft:RAG overview — 検索と生成・検索方式・更新と制御
- Lewisほか:RAG論文 — 検索と生成を組み合わせる原著の構成
- OpenAI:Vector embeddings — 埋め込み・コサイン類似度・検索
- OpenAI:Safety best practices — 根拠の確認と入力・出力の評価