概要
Anthropicは、RAGの根本的な課題に対する解決策「Contextual Retrieval」を発表しました。
問題: チャンクの文脈喪失
従来のRAGでは、ドキュメントをチャンクに分割すると、各チャンクが元文書の文脈を失います。
具体例
元文書の一部:
Q3の売上は前年比3%増加した。
このチャンクだけでは「どの会社のQ3なのか」が分かりません。
解決策: Contextual Retrieval
各チャンクにLLMで文脈説明テキストを付与してから、embedding・BM25インデックスを作成します。
import anthropic
client = anthropic.Anthropic()
def add_context_to_chunk(document: str, chunk: str) -> str:
"""Anthropicのcontextual retrieval: チャンクに文脈を付与"""
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=200,
messages=[{
"role": "user",
"content": f"""<document>
{document}
</document>
以下のチャンクに、文書全体の中での位置づけを簡潔に説明するコンテキストを付与してください。
<chunk>
{chunk}
</chunk>
コンテキストのみを出力してください(50-100文字)。"""
}],
)
context = response.content[0].text
return f"{context}\n\n{chunk}"
# 使用例
document = "株式会社ABCの2024年度決算報告。(中略)Q3の売上は前年比3%増加した。"
chunk = "Q3の売上は前年比3%増加した。"
contextualized = add_context_to_chunk(document, chunk)
# → "株式会社ABCの2024年度Q3決算: Q3の売上は前年比3%増加した。"
具体的なデータ変換例
| 変換前(従来チャンク) | 変換後(Contextual Chunk) |
|---|---|
Q3の売上は前年比3%増加した。 | [株式会社ABCの2024年度決算] Q3の売上は前年比3%増加した。 |
返品率は業界平均を下回っている。 | [ECサイトXの顧客満足度レポート2024] 返品率は業界平均を下回っている。 |
新しいAPIエンドポイントは/v2/usersです。 | [製品Yのv2.0マイグレーションガイド] 新しいAPIエンドポイントは/v2/usersです。 |
成果
- Contextual Embeddings単体: 検索失敗率 35%削減(5.7% → 3.7%)
- Contextual BM25併用: 検索失敗率 49%削減(5.7% → 2.9%)
- Prompt Cachingでコスト90%削減・レイテンシ2倍改善