Claude API には Prompt Caching という機能があり、同じプロンプトを何度も使うユースケースでコストを大幅に削減できます。本記事では、業務システムでの実践的な活用パターンと、設定上の注意点・効果測定の方法を整理いたします。
この記事でわかること
- Prompt Caching の基本仕組みと料金体系
- 効果が大きいユースケース3パターン
- Anthropic Python SDK での実装例
- キャッシュヒット率を上げる設計のコツ
- 運用時のモニタリングとトラブル対応
目次
- Prompt Caching とは何か
- 料金体系の理解
- 効果が大きいユースケース3パターン
- Anthropic Python SDK での実装例
- ヒット率を上げる設計のコツ
- モニタリングと運用
- まとめ
Prompt Caching とは何か
Prompt Caching は、Claude API のリクエスト内で「変わらない部分(システムプロンプト、ツール定義、参考資料など)」を Anthropic 側でキャッシュし、次回以降のリクエストではキャッシュ済み部分の入力単価を大幅に割引する仕組みです。
Claude API では、リクエスト内の特定セクションに cache_control マーカーを付与することで、そのセクションがキャッシュ対象となります。キャッシュは5分間(または1時間)有効で、その期間内に同じプロンプトが届くとキャッシュヒットとして処理されます。
料金体系の理解
通常の入力トークンと、キャッシュ関連トークンの料金関係は次の通りです(Claude Sonnet 4.6 の例)。
| 区分 | 単価(通常入力比) | 説明 |
|---|---|---|
| 通常入力 | 100% | キャッシュ未使用時 |
| キャッシュ書き込み | 125% | 初回(キャッシュ生成時) |
| キャッシュ読み込み | 10% | キャッシュヒット時 |
つまり、初回はやや高くつくものの、2回目以降は通常の約1/10のコストで同じ入力部分を再利用できます。同じシステムプロンプトを1日に何百回も使うチャットボットでは、効果が劇的に出ます。
効果が大きいユースケース3パターン
① 長いシステムプロンプトを使うチャットボット
カスタマーサポートのチャットボットや、社内 FAQ ボットでは、システムプロンプトに「会社情報」「対応ガイドライン」「FAQリスト」を載せることが多く、これらは1万トークン以上になる場合があります。
このシステムプロンプトを Prompt Caching に乗せることで、2回目以降は入力単価が10%で処理され、大量利用時のコストが大幅に下がります。
② RAG(検索拡張生成)の参考資料
RAG 構成では、「ユーザーの質問 + 検索で取得した参考資料 → Claude に投入」という流れになります。参考資料が比較的固定的(社内マニュアル、製品仕様書など)であれば、参考資料部分をキャッシュ対象にできます。
頻繁にアクセスされる資料はキャッシュヒットを得やすく、特に「特定の製品マニュアルに関する問い合わせが集中する時間帯」では効果絶大です。
③ ツール定義の多いエージェント
Tool Use を多数(10個以上)登録するエージェント構成では、ツール定義そのものが毎回入力トークンとして送信されます。これは結構なトークン量になるため、ツール定義部分を Prompt Caching に乗せることでコストを抑えられます。
Anthropic Python SDK での実装例
システムプロンプトをキャッシュする最小例
import anthropic
client = anthropic.Anthropic()
LONG_SYSTEM_PROMPT = """あなたは○○社のカスタマーサポート AI です。
以下のガイドラインに従って、丁寧かつ正確に応答してください。
【会社情報】
... (数千トークンの会社情報)
【FAQ】
... (数千トークンの FAQ リスト)
【禁止表現】
... (禁止トーンの定義)
"""
def reply(user_message):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
system=[{
"type": "text",
"text": LONG_SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"} # ← キャッシュ対象
}],
messages=[{"role": "user", "content": user_message}]
)
return response.content[0].text
cache_control: {"type": "ephemeral"} を付与した部分がキャッシュ対象になります。初回は通常より高めの単価で書き込まれますが、5分以内の次回呼び出しからキャッシュヒットで安くなります。
ツール定義をキャッシュする例
tools = [
{"name": "search_product", "description": "...", "input_schema": {...}},
{"name": "get_inventory", "description": "...", "input_schema": {...}},
# ... 10個以上のツール
]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
tools=tools, # ツール定義
extra_headers={
"anthropic-beta": "prompt-caching-2024-07-31"
},
# ツール定義の末尾を cache_control でマーク
system=[{
"type": "text",
"text": "あなたはECサイトの接客アシスタントです。",
"cache_control": {"type": "ephemeral"}
}],
messages=[{"role": "user", "content": "..."}]
)
ヒット率を上げる設計のコツ
① キャッシュ対象部分を「変えない」設計
キャッシュは、対象セクションの内容が1文字でも違うとミスヒットになります。システムプロンプトを定期的に更新したい場合は、更新タイミングを意識した運用が必要です。「日付」や「タイムスタンプ」のような毎回変わる要素を、キャッシュ対象部分に含めないよう注意してください。
② 利用パターンを把握してキャッシュ TTL を選択
Claude API は5分のキャッシュ TTL(標準)と1時間のキャッシュ TTL を選べます。1時間 TTL は単価がやや高めですが、利用頻度が低めの業務(夜間バッチなど)では、1時間 TTL の方が結果的にヒット率が高くなる場合があります。
③ プロンプト構造を「キャッシュ可能部分 → 可変部分」の順に
Claude のキャッシュ機構は「プロンプトの先頭から、cache_control マーカーまで」をキャッシュします。可変部分(ユーザーの個別質問など)はメッセージ部分やプロンプトの末尾に配置し、キャッシュ可能部分は先頭に集約する設計が重要です。
モニタリングと運用
レスポンスからキャッシュヒット状況を確認
Claude API のレスポンスには usage フィールドに次の値が含まれます。
{
"usage": {
"input_tokens": 250, # 通常入力
"cache_creation_input_tokens": 0, # キャッシュ書き込み
"cache_read_input_tokens": 8500 # キャッシュ読み込み(ヒット)
}
}
cache_read_input_tokens が大きい値であれば、キャッシュヒットが効いている状態です。逆に毎回 cache_creation_input_tokens が出ているなら、TTL を超えているか、プロンプトが微妙に変わっている可能性があります。
月次コストレポートの作成
API 利用ログを保存し、月次で「通常入力 vs キャッシュ読み込み」の比率をダッシュボード化することで、Prompt Caching の効果を定量把握できます。キャッシュヒット率80%以上を目標に設計するのが現実的な目安です。
キャッシュ対象更新時の運用
システムプロンプトに新規 FAQ を追加するなど、キャッシュ対象部分を更新する際は、更新タイミングを業務側と合意し、影響範囲(ヒット率が一時的に下がる)を可視化します。
まとめ
Prompt Caching は、Claude API を業務で本番運用する際のコスト最適化の本命施策でございます。要点を整理しますと:
- 長いシステムプロンプト・参考資料・ツール定義をキャッシュ対象に
- キャッシュヒット時は通常入力の約10%の単価
- キャッシュ対象部分は「変えない」設計が肝心
- レスポンスの
usageでヒット状況を継続モニタリング
弊社の支援事例では、ある社内 FAQ ボットで Prompt Caching 導入により月額 API コストを約 85% 削減できたケースがございます。導入のハードルは低く、既存コードへの追加変更は数行で済むため、Claude API を本番運用中の場合は早期に有効化を検討する価値が高い機能でございます。