Claudeを本番運用するためのインフラ・モニタリング・ガバナンス
0 / 6 完了
(0%)
LESSON 01
/ 06
コスト最適化:トークン消費とプロンプトキャッシュの実戦

「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(必要な時だけ)。ルーター実装で自動振り分けが効率的。