DEV Community

スシロー
スシロー

Posted on

【実体験】OpenAI/Anthropic APIコストを下げる:モデル選定・プロンプトキャッシュ・バッチの実戦

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")
Enter fullscreen mode Exit fullscreen mode

実測では「分類+要約」を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 ならキャッシュヒット
Enter fullscreen mode Exit fullscreen mode

条件: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}")
Enter fullscreen mode Exit fullscreen mode

コツ: システムプロンプトは先頭に固定し、ユーザー入力は末尾に追加する。順序を変えるとキャッシュが効かない。


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}}
Enter fullscreen mode Exit fullscreen mode
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 を保存しておく
Enter fullscreen mode Exit fullscreen mode
# 後で結果を取得
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))
Enter fullscreen mode Exit fullscreen mode

コスト:通常の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)
Enter fullscreen mode Exit fullscreen mode

まとめ:優先順位つき実装チェックリスト

  1. モデル切り替え(即効・実装30分):分類・要約タスクをmini/haikuへ移す。コスト16分の1。
  2. プロンプトキャッシュ(実装1時間):長いシステムプロンプトにcache_controlを追加。繰り返しリクエストのinputを90%削減。
  3. Batch API化(実装2〜3時間):毎朝の定時処理をすべてバッチに移行。残コストをさらに半減。

この3ステップを順番に適用した結果、月$80→$14まで圧縮できた。まずモデル選定から始めるのが費用対効果が最も高い。


関連リンク

※自社サービスのご案内を含みます。

Top comments (0)