🎓 レベル:標準 | 重要度:A(必須)
📎 前提:LLMアプリの構成(プロンプト・推論・オーケストレーション) | 関連:検索拡張生成(機械学習)
⚠️ 要最新確認:ベクトルDB・埋め込みモデルは進化が速い。具体名は執筆時点の例。
要点(BLUF)
- RAG(検索拡張生成)は「外部知識をベクトル検索で取り込み、文脈としてLLMに渡す」仕組みです。学習し直さずに最新・社内の知識を反映でき、幻覚(LLMの評価・ガードレール・コスト管理)を抑えられます。
- パイプラインは2系統:インデックス側(文書をチャンク分割→埋め込みベクトル化→ベクトルDBに格納)と検索側(質問を埋め込み→近傍検索→文脈として生成に渡す)。これは ML の学習/推論パイプライン(MLパイプラインの全体設計)と同じ二面性です。
- RAG の品質は検索の品質で決まります。どれだけ良い LLM でも、関連しない文書を渡せば答えは良くなりません。運用の主眼は「正しい文脈を引けているか」の評価と、インデックス鮮度・劣化の管理です。RAG の原理は機械学習(検索拡張生成)へ。
1. なぜ RAG が要るのか
LLM は学習時点の知識しか持たず、社内文書も知りません。ファインチューニング(ファインチューニング)で知識を入れる手もありますが、コストが高く、更新も大変です。RAG はモデルを変えずに、検索で外部知識を都度与えるので、知識の更新が「文書を入れ替えるだけ」で済みます。
2. RAG のパイプライン
flowchart TB
subgraph インデックス側(事前)
D["文書"] --> C["チャンク分割"]
C --> E1["埋め込みベクトル化"]
E1 --> V["ベクトルDBに格納"]
end
subgraph 検索側(クエリ毎)
Q["質問"] --> E2["質問を埋め込み"]
E2 --> S["近傍検索(類似上位k件)"]
V --> S
S --> CTX["文脈として整形"]
CTX --> LLM["LLMに質問+文脈を渡す"]
LLM --> A["回答(出典つき)"]
end
3. ベクトルDBと近傍検索
文書も質問も、埋め込みモデルで意味ベクトルに変換します。意味が近いテキストはベクトル空間で近くに来るので、コサイン類似度などで「質問に近い文書」を探せます。ベクトルDB(専用インデックス)は、大量ベクトルから近傍を高速に検索する基盤です(近似最近傍探索 ANN)。
4. 動く最小例:コサイン類似度による検索(RAGの中核)
埋め込みモデルは使わず、RAG の心臓部である「質問ベクトルに近い文書を引く」を最小実装します(ベクトルは擬似的に与える)。
import numpy as np
rng = np.random.default_rng(0)
# 文書とその埋め込みベクトル(実運用は埋め込みモデルで生成・要最新確認)
docs = ["MLOpsの定義", "特徴量ストアの役割", "カナリアリリース", "RAGの仕組み"]
# 擬似埋め込み:各文書を異なる方向のベクトルに
doc_vecs = np.array([
[1.0, 0.1, 0.0, 0.0],
[0.1, 1.0, 0.1, 0.0],
[0.0, 0.1, 1.0, 0.1],
[0.0, 0.0, 0.1, 1.0],
])
def cosine(a, b):
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
def retrieve(query_vec, doc_vecs, docs, k=2):
sims = [cosine(query_vec, dv) for dv in doc_vecs]
order = np.argsort(sims)[::-1][:k]
return [(docs[i], round(sims[i], 3)) for i in order]
# 「RAGについて教えて」に近い質問ベクトル(doc4方向に寄せる)
query_vec = np.array([0.0, 0.05, 0.2, 0.95])
results = retrieve(query_vec, doc_vecs, docs, k=2)
print("質問に近い文脈 上位2件:")
for doc, sim in results:
print(f" 類似度 {sim}: {doc}")
print(f"\nLLMに渡す文脈 = {[d for d, _ in results]}")
出力:
質問に近い文脈 上位2件:
類似度 0.993: RAGの仕組み
類似度 0.306: カナリアリリース
LLMに渡す文脈 = ['RAGの仕組み', 'カナリアリリース']
出力の意味:質問ベクトルに最も近い文書「RAGの仕組み」が類似度0.993で正しく1位になり、これを文脈として LLM に渡します。RAG の本質はこの検索——質問に関連する文書を引いて生成に与えること。もしここで無関係な文書しか引けなければ、どれだけ優秀な LLM でも良い回答は出ません。だから RAG の運用では「検索が正しい文脈を引けているか」を評価・監視するのが最重要です。実運用ではベクトルDB(ANN)が大量文書から高速に近傍を引きます(要最新確認)。
5. 運用の勘所
- 検索品質を評価・監視する:「引いた文書が質問に関連していたか」を測る(再現率・適合率、LLM-as-judge)。RAG の品質はここで決まる。
- チャンク分割を設計する:大きすぎると無関係部分が混じり、小さすぎると文脈が切れる。粒度を要件で調整する。
- インデックスの鮮度を保つ:文書が更新されたら再埋め込み・再インデックス。古い知識を引かないようにする。
- インデックス劣化に注意:文書が増えるとベクトル空間が混み、検索精度が落ちることがある。定期評価で監視する。
- 出典を返す:どの文書から答えたかを示し、検証可能性とガードレール(LLMの評価・ガードレール・コスト管理)に繋ぐ。
なぜそうするのか
RAG を「検索を主役にした基盤」として運用するのは、生成の質が検索の質に上限を規定されるからです。LLM は与えられた文脈をもとに答えるので、文脈が間違っていれば答えも間違います(しかも自信ありげに)。だから RAG の改善は、まず「正しい文脈を引けているか」(検索)から取り組むのが鉄則で、埋め込み・チャンク・インデックスの運用がそのまま回答品質に直結します。モデルを大きくするより、検索を良くする方が効くことが多い——これが RAG 運用の勘所です。
⚠️ よくある落とし穴
- 検索品質を測らず生成だけ見る:悪い文脈が原因の幻覚を、モデルのせいと誤診する。検索を評価する。
- チャンク分割を無頓着にする:粒度が悪いと関連文書を引けない・文脈が切れる。
- インデックスを更新しない:古い知識を引き続け、最新情報を反映できない。鮮度を管理する。
- 出典を返さない:検証できず、幻覚と事実の区別がつかない。出典を添える。
- RAGの原理をここで詳述する:埋め込み・検索拡張の理論は機械学習(検索拡張生成)。ここは運用基盤に集中。
対応 lab
- なし(概念ノート)。近傍検索の中核は本文 §4。実ベクトルDBは要最新確認。
関連ノート
- LLMアプリの構成(プロンプト・推論・オーケストレーション)(RAGはオーケストレーションの一部)
- LLMの評価・ガードレール・コスト管理(検索・生成の評価)
- 特徴量ストア(オフライン/オンラインの二面性との類似)
- 検索拡張生成(機械学習・RAGの原理)
- 第7章 LLM・生成AIの運用基盤 目次
- MLOps・AI基盤 全体目次