最終更新:

RAGの仕組み — 資料を探してから、答えを作る


探すところと、答えを作るところを分ける

資料を準備ID・版・閲覧権限質問に合う資料を検索質問 + 見つかった資料生成モデルへ渡す答えと出典を、元資料と比べる
RAGの構成の例です。本文の短いコードは検索だけを試します。最新化には検索用のコピーや索引の更新も必要です。
ひよこ ひよこ
AIに、休暇の申請先を教えてもらうには?
ペンギン先生 ペンギン先生
会社の案内を検索し、見つかった資料を回答の材料へ渡す方法があるよ。RAG、検索拡張生成だね。覚えさせる前に、必要な資料を探す入口から見よう。
ひよこ ひよこ
新しい資料を読ませると、モデルが覚える?
ペンギン先生 ペンギン先生
通常のRAGでは、質問ごとに資料を入力へ加え、モデルの重みを更新しないよ。資料を追加・変更したら、検索対象のコピーや索引も更新する。追加しただけで回答へ反映される保証はないんだ。
ひよこ ひよこ
検索は、必ず意味をベクトルにする?
ペンギン先生 ペンギン先生
キーワード、ベクトル、両方を使う方法等があるよ。RAGは検索と生成をつなぐ考え方で、特定の検索方式の名前ではない。一般のWeb検索も、キーワード一致だけの技術ではないね。
ひよこ ひよこ
ベクトルの近さって、何を見るの?
ペンギン先生 ペンギン先生
埋め込みで文書と質問を数値の列へ変え、類似度等を比べる。コサイン類似度は向きの近さで、大きいほど近い。距離と呼ぶ値なら大小の読み方を確認し、単位や方式を混ぜないようにしよう。
ひよこ ひよこ
見つかった案内を渡せば、必ず正しい?
ペンギン先生 ペンギン先生
文書が古い、必要な条件が欠ける、モデルが読み違える場合があるよ。出典を付けても、その資料が答えを支えるかを確認する。引用番号が付くだけでは証明にならないんだ。
ひよこ ひよこ
「休暇は年に何日?」も答えられる?
ペンギン先生 ペンギン先生
申請先しか書かれていなければ、日数は分からないよ。関連資料が見つかることと、必要な根拠があることは別。「資料では確認できない」と保留する質問も試すんだ。
ひよこ ひよこ
社内資料なら、追加学習より安全?
ペンギン先生 ペンギン先生
学習しないことだけでは安全と言えない。閲覧権限、送信先、保持条件、文書に紛れた命令等を確認する。許されない資料は検索結果とモデルへの入力に含めないよ。
ひよこ ひよこ
RAGとファインチューニングは、どちらを選ぶ?
ペンギン先生 ペンギン先生
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エージェントへ進めます。

参考資料