Mímisbrunnr知恵の泉

← MLOps 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:LLMアプリの構成(プロンプト・推論・オーケストレーション) | 関連:検索拡張生成(機械学習)

⚠️ 要最新確認:ベクトルDB・埋め込みモデルは進化が速い。具体名は執筆時点の例。

要点(BLUF)

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. 運用の勘所

なぜそうするのか

RAG を「検索を主役にした基盤」として運用するのは、生成の質が検索の質に上限を規定されるからです。LLM は与えられた文脈をもとに答えるので、文脈が間違っていれば答えも間違います(しかも自信ありげに)。だから RAG の改善は、まず「正しい文脈を引けているか」(検索)から取り組むのが鉄則で、埋め込み・チャンク・インデックスの運用がそのまま回答品質に直結します。モデルを大きくするより、検索を良くする方が効くことが多い——これが RAG 運用の勘所です。

⚠️ よくある落とし穴

対応 lab

関連ノート