この回のゴール
- これまでのパーツ(分割 → 埋め込み → 検索 → Claude)を 統合 する
- RAG プロンプト の設計を学ぶ
- Citation(引用元の明示) を実装する
- RAG なし vs RAG あり を並べて効果を体感する
- 次章のエージェントに向けて「検索 もエージェントのツールになる」発想を掴む
1. 全体パイプライン
tools = [
{"name": "calculator", "description": "数式を計算する", ...},
{"name": "get_current_time", "description": "現在時刻を返す", ...},
{"name": "search_dictionary", "description": "辞書を検索する", ...},
{"name": "get_weather", "description": "天気を取得する", ...},
]
2. RAG プロンプトの設計
system プロンプトの基本型
response = client.messages.create(
...,
tools=tools,
tool_choice={"type": "auto"}, # 👈 ここ
)
user メッセージの組み方
User: 東京と大阪の天気、あと 1+2+3 を計算して
Claude: [tool_use: get_weather(city="東京")]
[tool_use: get_weather(city="大阪")]
[tool_use: calculator(expression="1+2+3")]
なぜこの形式?
- 参考情報と質問を明確に分離 → Claude が混同しない
- 番号付け → 回答で引用しやすい
- 構造化 → Claude が「参考情報に基づけばいい」と理解しやすい
3. Citation — 引用元を出す
回答例:
messages = [
...,
{"role": "assistant", "content": response.content}, # 3 つの tool_use
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "toolu_A", "content": "..."},
{"type": "tool_result", "tool_use_id": "toolu_B", "content": "..."},
{"type": "tool_result", "tool_use_id": "toolu_C", "content": "..."},
]},
]
Claude に「[1] のような番号で引用してね」と指示し、実装側で番号 → 原文にマッピングして表示します。
なぜ引用が重要?
- 信頼性: ユーザーが根拠を確認できる
- デバッグ: 間違った回答の原因を追える
- 規制対応: 医療・法律・金融では必須
4. 検索失敗時のフォールバック
質問が文書にない場合:
悪い応答: LLM の学習知識から勝手に回答してしまう 良い応答: 「その情報は確認できません」と明確に伝える
system プロンプトで強く釘を刺すのが定石です。
5. RAG 改善の技術(発展)
Hybrid Search
- ベクトル検索(意味が近い)
- キーワード検索(BM25 など、単語一致)
これらを 組み合わせる ことで、意味検索だけでは拾えない 固有名詞・数字 も取れる。
Reranking
Top-k を多めに取ってから、別の軽量モデル(Cross-Encoder)でリランク する:
response = client.messages.create(
...,
tool_choice={"type": "auto", "disable_parallel_tool_use": True},
)
Query Expansion
質問を Claude で 言い換え・展開 してから検索:
{
"type": "tool_result",
"tool_use_id": "toolu_ABC",
"content": "Error: ネットワーク接続に失敗しました",
"is_error": True,
}
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