RAG (検索拡張生成) 入門
重要キーワード
RAG (Retrieval-Augmented Generation)
LLM の知識は学習時点で固定されています。 社内ドキュメント・最新情報 を答えさせるには、検索結果を その場でプロンプトに注入 する必要があります。これが RAG。
基本フロー
- ドキュメントを チャンク化 (例: 500 トークンずつ)。
- 各チャンクを embedding (ベクトル化)。
- ベクトル DB に格納 (FAISS / Chroma / pgvector / Pinecone)。
- クエリ時:
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 を引っ張る 両者を 併用 するのも強力。
Hybrid Search
ベクトル検索だけでなく キーワード検索 (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 の Q&A プロンプトテンプレートを書いてください。
要件:
- context に無ければ「不明」と答え、推測しない
- 引用形式 (チャンクタイトル) を末尾に付ける
- 5 文以内で簡潔に
- 不明な場合は次に問い合わせるべき担当者を提案演習: ミニ 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 で回答 → 引用元タイトル表示
まとめ
お疲れ様でした!