この回のゴール
- これまでのパーツ(分割 → 埋め込み → 検索 → Claude)を 統合 する
- RAG プロンプト の設計を学ぶ
- Citation(引用元の明示) を実装する
- RAG なし vs RAG あり を並べて効果を体感する
- 次章のエージェントに向けて「検索 もエージェントのツールになる」発想を掴む
1. 全体パイプライン
[事前準備]
┌────────────┐ ┌──────────┐ ┌──────────┐
│ 文書ファイル │─▶│ チャンク │─▶│ 埋め込み │
└────────────┘ └──────────┘ └─────┬────┘
▼
┌─────────────────┐
│ FAISS index │ (永続化可能)
└─────────────────┘
[問い合わせ時]
埋め込み Top-k 取得
[質問] ─────────────▶ [q_vec] ─────────────▶ [ chunks ]
│
▼
┌──────────────────────┐
│ Claude (システム指示付) │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ 回答 + 引用元 [1][2] │
└──────────────────────┘
2. RAG プロンプトの設計
system プロンプトの基本型
system = """あなたは社内アシスタントです。
以下のルールを厳守してください:
1. 回答は【参考情報】に基づいてのみ行うこと
2. 参考情報にない質問には「その情報は確認できません」と答えること
3. 回答の根拠となった文書を [1][2] のように引用すること
4. 憶測や学習済み知識での補完は禁止
"""
user メッセージの組み方
【参考情報】
[1] ネオテックでは入社初年度から年間 15 日の有給休暇を付与します...
[2] 勤続 3 年以上の社員は年間 20 日、5 年以上は 25 日...
【質問】
有給は入社何年目で 25 日になる?
なぜこの形式?
- 参考情報と質問を明確に分離 → Claude が混同しない
- 番号付け → 回答で引用しやすい
- 構造化 → Claude が「参考情報に基づけばいい」と理解しやすい
3. Citation — 引用元を出す
回答例:
有給休暇は勤続 5 年以上で 25 日に増えます[1]。
入社初年度は 15 日で、3 年以上で 20 日になります[1]。
Claude に「[1] のような番号で引用してね」と指示し、実装側で番号 → 原文にマッピングして表示します。
なぜ引用が重要?
- 信頼性: ユーザーが根拠を確認できる
- デバッグ: 間違った回答の原因を追える
- 規制対応: 医療・法律・金融では必須
4. 検索失敗時のフォールバック
質問が文書にない場合:
悪い応答: LLM の学習知識から勝手に回答してしまう 良い応答: 「その情報は確認できません」と明確に伝える
system プロンプトで強く釘を刺すのが定石です。
5. RAG 改善の技術(発展)
Hybrid Search
- ベクトル検索(意味が近い)
- キーワード検索(BM25 など、単語一致)
これらを 組み合わせる ことで、意味検索だけでは拾えない 固有名詞・数字 も取れる。
Reranking
Top-k を多めに取ってから、別の軽量モデル(Cross-Encoder)でリランク する:
query → [粗い検索: top 20] → [リランク: top 3] → Claude
Query Expansion
質問を Claude で 言い換え・展開 してから検索:
Q: "休みの話"
↓ (Claude に展開させる)
Q': "有給休暇、祝日、夏季休暇について"
Contextual Retrieval (Anthropic, 2024)
各チャンクに 文脈情報を先に付けてから埋め込む。精度大幅向上。
まとめ
- RAG パイプライン = 分割 → 埋め込み → 検索 → プロンプトに同梱 → Claude が回答
- system プロンプトで「参考情報に基づけ・無いものは無いと言え・引用せよ」を強く指示
- Citation は信頼性・デバッグ・規制対応に重要
- 発展形: Hybrid Search / Reranking / Query Expansion / Contextual Retrieval
第 5 章のクロージング → 次章への接続
ここまでで「自分の文書から答える Claude」が作れた。でも: - 「文書になかったら Web 検索する」フォールバック - 「DB から具体的数字を取る」必要 - 質問によって検索するかどうかを判断する 動的な対応
👉 これらは AI エージェント(次章)で解決します。RAG は「検索というツールを持ったエージェント」の特殊ケースと見なせます。
参考文献
- Anthropic: Contextual Retrieval
- Lewis et al. (2020) Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
- LangChain RAG tutorial