← Claudeを本番運用するためのインフラ・モニタリング・ガバナンス
LESSON 01 / 06

コスト最適化:トークン消費とプロンプトキャッシュの実戦

所要時間 14分 上級レベル

「PoCはよかった、でも本番投入したらコストが跳ね上がった」——AI機能本番運用で最初にぶつかる壁です。本レッスンでは、Claude API のコストを 50〜90%削減 する実戦テクニックを学びます。

コスト構造の理解

Claude API の料金は次の3要素:

  • 入力トークン:プロンプト全体のサイズ
  • 出力トークン:生成された応答のサイズ
  • キャッシュ:プロンプトキャッシュのヒット率

モデル別の料金(参考、2026年5月時点):

モデル 入力(/MTok) 出力(/MTok) キャッシュ書込 キャッシュ読出
Opus 4 $15 $75 $18.75 $1.50
Sonnet 4.7 $3 $15 $3.75 $0.30
Haiku 4 $0.80 $4 $1.00 $0.08

戦略1: プロンプトキャッシュの活用

プロンプトキャッシュは 最大90%のコスト削減 が可能。長いシステムプロンプト・知識ベース・Few-shot例を使い回すなら必須。

import anthropic

client = anthropic.Anthropic()

# 大きなシステムプロンプトをキャッシュ
SYSTEM_PROMPT = """
あなたは...(10,000トークンの長文)
"""  # 例:会社のFAQ・ガイドライン・過去事例を全部入れる

response = client.messages.create(
    model="claude-sonnet-4-7",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": SYSTEM_PROMPT,
            "cache_control": {"type": "ephemeral"},  # キャッシュ有効化
        },
    ],
    messages=[
        {"role": "user", "content": user_message},
    ],
)

# 2回目以降の同じシステムプロンプトは大幅割引
# 例:10,000トークン → 通常 $0.030 → キャッシュヒット時 $0.003

キャッシュの効果計算

# 例:FAQ Botを1日1000回呼び出す

# プロンプト構成
- システムプロンプト(FAQ): 10,000 tokens
- ユーザー質問: 平均100 tokens
- 応答: 平均300 tokens

# キャッシュなし(Sonnet 4.7)
1日のコスト = 1000 × ((10,100 × $3 + 300 × $15) / 1M)
            = 1000 × ($0.0303 + $0.0045)
            = 1000 × $0.0348
            = $34.80/日 = $1,044/月

# キャッシュあり(初回以外ヒット)
1日のコスト = 1 × $0.0348(初回) + 999 × ((10,000 × $0.30 + 100 × $3 + 300 × $15) / 1M)
            ≒ $0.035 + 999 × $0.00795
            ≒ $7.97/日 = $239/月

# 削減効果:77%

戦略2: モデルの使い分け

用途に応じて適切なモデルを選択。常に Opus を使うのは無駄遣い。

用途 推奨モデル 理由
分類・タグ付け Haiku 軽量で十分、コスト1/4
標準的な要約・生成 Sonnet コスト・性能のバランス
複雑な推論・コード生成 Sonnet 多くの場合これで足りる
最高難度のタスク Opus Sonnetで足りない場合のみ
大量バッチ処理 Sonnet + Batch API 50%割引

戦略3: ルーター実装(軽い質問→Haiku、重い→Sonnet)

def route_query(query: str) -> str:
    # 軽量モデルで複雑度判定
    classification = anthropic.Anthropic().messages.create(
        model="claude-haiku-4",
        max_tokens=10,
        system="ユーザーの質問を分類してください。応答は'simple'または'complex'のみ。",
        messages=[{"role": "user", "content": query}],
    )

    if classification.content[0].text.strip() == "simple":
        return "claude-haiku-4"
    return "claude-sonnet-4-7"


# 使用例
model = route_query(user_query)
response = client.messages.create(model=model, ...)

戦略4: Batch API の活用

レイテンシが許容できるバッチ処理は Batch API で50%割引

import anthropic

client = anthropic.Anthropic()

# 100件の処理を一括投入
batch = client.messages.batches.create(
    requests=[
        {
            "custom_id": f"item-{i}",
            "params": {
                "model": "claude-sonnet-4-7",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": item}],
            },
        }
        for i, item in enumerate(items)
    ],
)

# 24時間以内に処理完了(通常は数分〜数時間)
# 結果取得
batch_status = client.messages.batches.retrieve(batch.id)
if batch_status.processing_status == "ended":
    results = client.messages.batches.results(batch.id)

戦略5: トークン削減のテクニック

テクニック 削減効果
不要な装飾を削除 5〜10%
JSON圧縮(インデント無) 20〜30%
履歴の要約圧縮 50〜80%
Few-shot例を最小限に 30〜50%
出力フォーマット指定 10〜20%
# JSONレスポンスを必ず圧縮
prompt += "応答は最小化したJSON(改行・インデントなし)で出力してください"

# 出力長を制限
max_tokens = 500  # 必要最小限

# 構造化された短い応答を強制
prompt += "応答は20字以内のラベル名のみ"

コスト監視ダッシュボード

# コスト計測のメタデータ収集

import json
from datetime import datetime

def call_with_tracking(messages, model="claude-sonnet-4-7", **kwargs):
    response = client.messages.create(
        model=model,
        messages=messages,
        **kwargs,
    )

    # コスト計算
    cost = calculate_cost(
        model=model,
        input_tokens=response.usage.input_tokens,
        output_tokens=response.usage.output_tokens,
        cache_read=response.usage.cache_read_input_tokens or 0,
        cache_write=response.usage.cache_creation_input_tokens or 0,
    )

    # メトリクスDB に記録
    metrics_db.insert({
        "timestamp": datetime.now(),
        "model": model,
        "input_tokens": response.usage.input_tokens,
        "output_tokens": response.usage.output_tokens,
        "cost_usd": cost,
        "user_id": current_user_id(),
        "feature": current_feature_name(),
    })

    return response


# 月次レポート
SELECT
    feature,
    COUNT(*) as calls,
    SUM(cost_usd) as total_cost,
    AVG(cost_usd) as avg_cost_per_call
FROM api_calls
WHERE timestamp > NOW() - INTERVAL '30 days'
GROUP BY feature
ORDER BY total_cost DESC;

異常検知のアラート

# 突発的なコスト急増を検知

def check_cost_anomaly():
    last_hour = get_cost_last_hour()
    avg_hour = get_avg_cost_per_hour_last_30_days()

    if last_hour > avg_hour * 3:
        send_alert(
            f"⚠️ コスト異常: 直近1時間 ${last_hour:.2f}(平均の{last_hour/avg_hour:.1f}倍)"
        )

# Cron で5分おき実行

このレッスンのまとめ

「プロンプトキャッシュ → モデル使い分け → ルーター → Batch API → トークン削減 → 監視」の組み合わせで、コストを 50〜90%削減 できます。次のレッスンでは、レイテンシ削減を学びます。

よくある質問

この記事に関連する質問と答えをまとめました。

Q.プロンプトキャッシュで本当にコストが90%下がる?
A.
長いシステムプロンプトを再利用するケースなら現実的です。実例:FAQ Bot で月$1,044→$239(77%削減)など。「同じプロンプトが繰り返される」シナリオで効果絶大。
Q.Sonnet と Haiku の使い分けは?
A.
分類・タグ付け・軽い対話は Haiku(コスト1/4)、標準的な要約・生成は Sonnet、複雑な推論や難しい意思決定は Opus(必要な時だけ)。ルーター実装で自動振り分けが効率的。