← レッスンに戻る
第8章 · 実践プロジェクト

RAG (検索拡張生成) 入門

RAG Basics · 約 14 分

重要キーワード

English日本語説明
RAG 検索拡張生成 Retrieval-Augmented Generation
Embedding 埋め込みベクトル テキストを数値ベクトルに変換した表現
Vector DB ベクトルDB 類似度検索に特化した DB (FAISS/Chroma/pgvector...)
Top-K 上位K件 類似度上位 K 件のチャンクを取得
Citations 引用機能 Anthropic 公式の引用付き応答機能

RAG (Retrieval-Augmented Generation)

LLM の知識は学習時点で固定されています。 社内ドキュメント・最新情報 を答えさせるには、検索結果を その場でプロンプトに注入 する必要があります。これが RAG。

基本フロー

  1. ドキュメントを チャンク化 (例: 500 トークンずつ)。
  2. 各チャンクを embedding (ベクトル化)
  3. ベクトル DB に格納 (FAISS / Chroma / pgvector / Pinecone)。
  4. クエリ時: a. ユーザー質問を embedding 化。 b. 類似度上位 K 件を取得。 c. プロンプトに として埋め込む。 d. Claude に回答させる。

例 (擬似)

def answer(question: str) -> str:
    chunks = vector_db.search(embed(question), k=5)
    context = "\n\n".join(c.text for c in chunks)
    prompt = f'''
<context>
{context}
</context>

<question>
{question}
</question>

context に基づいて回答してください。情報が無ければ「不明」と答えてください。
出典として該当チャンクのタイトルを末尾に付けてください。
'''
    res = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return res.content[0].text

Chunk 設計のコツ

Embedding の選び方

Anthropic は専用 embedding API を提供していないため、外部のものを使います: - OpenAI text-embedding-3-small/large - Voyage AI (Anthropic 推奨) - Cohere - ローカル bge-large, multilingual-e5

詳細は次のレッスンで。

Hallucination 対策

Claude の代替: Citations

Claude には Citations という、入力ドキュメントから自動引用を出す API もあります。 独自 RAG を組まずに高品質な引用付き回答が得られます。 - Citations: 入力 document からの引用を自動生成 - 自前 RAG: ベクトル検索で動的に context を引っ張る 両者を 併用 するのも強力。

ベクトル検索だけでなく キーワード検索 (BM25) を併用するハイブリッド検索が、 エッジケース (固有名詞、数値) に強い。 Reciprocal Rank Fusion などで統合します。

Reranking

最初に多めに (例: 50 件) 取得 → reranker モデルで上位 5 件を精選、という二段階構成が定番。 Cohere Rerank, Jina Reranker, Voyage Rerank などが有名。

RAG の品質改善は Eval が命

第 9 章で扱う Eval を必ずセットで構築。 精度が伸び悩んだら以下を順に見ます: 1. Chunk 設計 (サイズ、overlap, 境界) 2. Embedding モデル 3. Top-K と reranking 4. プロンプト

試す

RAG プロンプト設計を Claude に任せる。

▶ RAG プロンプト設計
社内ヘルプデスク用 RAG の Q&A プロンプトテンプレートを書いてください。 要件: - context に無ければ「不明」と答え、推測しない - 引用形式 (チャンクタイトル) を末尾に付ける - 5 文以内で簡潔に - 不明な場合は次に問い合わせるべき担当者を提案

演習問題

演習 1: ミニ RAG を SQLite + sentence-transformers で

外部サービスを使わず、ローカル完結の小さな RAG を作ってください。

  • データソース: 5-10 件の Markdown FAQ
  • Embedding: sentence-transformers/multilingual-e5-base
  • ベクトル: SQLite に numpy bytes で保存 (or numpy.array を pickle)
  • 類似度: cosine similarity
  • 検索 → Claude で回答 → 引用元タイトル表示
スタータープロンプト:
Python で次の構成のミニ RAG を書いてください。
1. faqs/ ディレクトリの .md ファイルを読み込み、各ファイル全体を 1 チャンクとする
2. sentence-transformers (`paraphrase-multilingual-MiniLM-L12-v2`) で embedding
3. SQLite にチャンク + ベクトルを保存
4. ask(question) 関数: クエリ embedding → cosine 類似度 Top-3 → Claude に context として渡し回答
5. 回答末尾に引用元のファイル名を一覧表示
完全コードを示してください。
ヒントを見る

pip install sentence-transformers が必要。本格運用では Chroma などのベクトル DB がおすすめ。プロトタイプには十分です。

理解度チェック

  1. RAG が解決する問題は?
    1. 学習時点以降の情報や社内データを答えさせる
    2. GPU メモリを増やす
    3. API キーを暗号化する
    4. UI を作る
  2. Chunk 設計の推奨は?
    1. 段落・見出し境界で分け、10-20% overlap を入れる
    2. 1 文字ずつ分ける
    3. ファイル単位で分けない
    4. 暗号化チャンクにする
  3. ハルシネーション対策として有効でないのは?
    1. context に無ければ不明と答えるよう指示
    2. 引用を必須化
    3. temperature を 1.5 に上げる
    4. 出典タイトルを返させる
  4. RAG の高度化テクニックでないのは?
    1. Reranking
    2. Hybrid Search (Vector + BM25)
    3. GPU を増やす
    4. Citations の併用
解答と解説を見る
  1. A — 学習に含まれない情報をプロンプト経由で注入できるのが RAG です。
  2. A — 意味単位 + overlap が標準的アプローチです。
  3. C — 高 temperature はむしろハルシネーションを増やします。
  4. C — GPU は RAG の精度には直結しません。アルゴリズム改善が中心。