第8章 · Practice Projects

RAG (検索拡張生成) 入門

RAG Basics
→ で次のスライド · F でフルスクリーン · N で講師ノート · Esc で終了

重要キーワード

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 設計のコツ

  • 意味単位で分割 (見出し境界・段落境界)。
  • 重複 (overlap) を 10-20% 入れて文脈切れを防ぐ。
  • メタデータ (URL, タイトル, 更新日) を保持して引用に使う。
  • 1 チャンクは 200〜800 トークンが目安。

Embedding の選び方

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

詳細は次のレッスンで。

Hallucination 対策

  • 「context に無ければ不明と答える」 を強く指示する。
  • 引用を必須にする。
  • temperature を低めに (0.0〜0.3)。
  • Citations 機能を活用 (第4章参照)。
  • 関連度スコアが低いチャンクは閾値で除外。

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 文以内で簡潔に - 不明な場合は次に問い合わせるべき担当者を提案
Hands-on Exercise

演習: ミニ 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 で回答 → 引用元タイトル表示
▶ Playground を開いて実行

理解度チェック

4 問のクイズで理解度を確認しましょう。

クイズを開く
🎉

まとめ

お疲れ様でした!