OpenAI/Anthropic APIコストを下げる:モデル選定・プロンプトキャッシュ・バッチの実戦
結論:3つの手順で月額コストを60〜80%削減できる
個人開発でAPIコストが膨らむ原因は決まっている。高いモデルに全タスクを投げている、同じシステムプロンプトを毎回送信している、リアルタイム不要な処理をリアルタイムで流している。この3点を直すだけでコストは劇的に落ちる。
1. モデル選定:タスクを分類して最安モデルに落とす
モデルコストの目安(2025年時点・input/output per 1M tokens):
| モデル | input | output |
|---|---|---|
| gpt-4o | $2.50 | $10.00 |
| gpt-4o-mini | $0.15 | $0.60 |
| claude-sonnet-4-6 | $3.00 | $15.00 |
| claude-haiku-4-5 | $0.80 | $4.00 |
分類基準:
- ルーティング・分類・短文生成 → gpt-4o-mini / claude-haiku-4-5
- 長文要約・構造化抽出 → gpt-4o-mini(十分)
- 複雑な推論・コード生成 → gpt-4o / claude-sonnet-4-6
実装例:タスク種別でモデルを切り替える
def get_model(task_type: str) -> str:
routing = {
"classify": "gpt-4o-mini",
"summarize": "gpt-4o-mini",
"code_review": "gpt-4o",
"reasoning": "claude-sonnet-4-6",
}
return routing.get(task_type, "gpt-4o-mini")
実測では「分類+要約」をminiに移すだけでトークンコストが1/16になった。
2. プロンプトキャッシュ:同じプレフィックスをキャッシュして再課金を防ぐ
システムプロンプトが長い場合、毎リクエストで同じ内容を送ると全額課金される。Anthropicのプロンプトキャッシュを使えば、キャッシュヒット時のinputコストが90%オフになる。
Anthropic(cache_control)
import anthropic
client = anthropic.Anthropic()
system_prompt = "あなたは..." + "(長い指示 2000トークン以上)"
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=1024,
system=[
{
"type": "text",
"text": system_prompt,
"cache_control": {"type": "ephemeral"} # ここだけ追加
}
],
messages=[{"role": "user", "content": user_input}]
)
# レスポンスのusageでキャッシュヒットを確認
print(response.usage)
# cache_read_input_tokens > 0 ならキャッシュヒット
条件:1024トークン以上のブロックにのみ適用可。TTLは5分(ephemeral)。
OpenAI(自動キャッシュ)
gpt-4o / gpt-4o-miniはプロンプトが1024トークン超かつ同一プレフィックスであれば自動でキャッシュが効く。特別な設定不要。キャッシュヒット時はinputが50%オフ。
# 同一セッション内で同じsystem promptを使いまわすだけ
# ヘッダーのusage.prompt_tokens_detailsで確認可能
usage = response.usage
cached = usage.prompt_tokens_details.cached_tokens
print(f"キャッシュ済みトークン: {cached}")
コツ: システムプロンプトは先頭に固定し、ユーザー入力は末尾に追加する。順序を変えるとキャッシュが効かない。
3. Batch API:非同期処理で最大50%オフ
リアルタイム応答が不要な処理(定時レポート・記事生成・データ変換)はBatch APIで流す。
OpenAI Batch API
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "要約して:..."}], "max_tokens": 500}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "分類して:..."}], "max_tokens": 100}}
import openai, json
client = openai.OpenAI()
# バッチファイルをアップロード
with open("tasks.jsonl", "rb") as f:
file = client.files.create(file=f, purpose="batch")
# バッチ作成(24時間以内に完了)
batch = client.batches.create(
input_file_id=file.id,
endpoint="/v1/chat/completions",
completion_window="24h"
)
print(batch.id) # batch_xxxx を保存しておく
# 後で結果を取得
batch = client.batches.retrieve("batch_xxxx")
if batch.status == "completed":
result_file = client.files.content(batch.output_file_id)
for line in result_file.text.splitlines():
print(json.loads(line))
コスト:通常の50%。100万トークン処理するなら$1.25→$0.625。
Anthropic Message Batches
import anthropic
client = anthropic.Anthropic()
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"req-{i}",
"params": {
"model": "claude-haiku-4-5-20251001",
"max_tokens": 512,
"messages": [{"role": "user", "content": task}]
}
}
for i, task in enumerate(task_list)
]
)
print(batch.id)
まとめ:優先順位つき実装チェックリスト
- モデル切り替え(即効・実装30分):分類・要約タスクをmini/haikuへ移す。コスト16分の1。
-
プロンプトキャッシュ(実装1時間):長いシステムプロンプトに
cache_controlを追加。繰り返しリクエストのinputを90%削減。 - Batch API化(実装2〜3時間):毎朝の定時処理をすべてバッチに移行。残コストをさらに半減。
この3ステップを順番に適用した結果、月$80→$14まで圧縮できた。まずモデル選定から始めるのが費用対効果が最も高い。
関連リンク
- クラウド/SaaSのコスト無料セルフ診断(60秒・登録不要) — AWS/Vercel/Supabase/監視SaaSにムダな課金がないか、その場でチェックできます。
- AI開発・自動化の実践キット / プロンプト集(Gumroad)
※自社サービスのご案内を含みます。
Top comments (0)