AI APIのコスト構造を理解する

ほとんどのAI APIはトークン単位の従量課金です。入力トークン(プロンプト)と出力トークン(回答)が別々に課金されることが多く、一般的に出力の方が高く設定されています。

たとえばClaude Opus 4系では入力が百万トークンあたり数ドル、出力はその3〜5倍という価格体系です。長いシステムプロンプトや大きなドキュメントを毎回送ると入力コストが積み上がります。

コスト最適化の基本方針は「必要なトークン以外を送らない」「同じトークンを何度も送らない」「高価なモデルを使わなくてよい場面では使わない」の3点に集約されます。

Prompt Cachingで入力コストを削減

AnthropicのPrompt Cachingは、同じシステムプロンプトやドキュメントを繰り返し使う場合に入力コストを大幅に削減できる機能です。

仕組み

通常、毎回のAPIリクエストで全てのプロンプトトークンに料金がかかります。Prompt Cachingを使うと、指定したプレフィックス(プロンプトの先頭部分)がAnthropicのサーバーにキャッシュされます。次回以降は同じプレフィックスを再送せず、キャッシュを参照します。

キャッシュヒット時のコストはキャッシュミス時の約10%(90%削減)です。5分間有効なキャッシュが自動的に延長されます。

実装例

import anthropic

client = anthropic.Anthropic()

# 長いシステムプロンプトをキャッシュする
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "あなたは法律の専門家アシスタントです。日本の法律・判例に精通しており...",
        },
        {
            "type": "text",
            "text": open("legal_knowledge_base.txt").read(),  # 数万トークンのドキュメント
            "cache_control": {"type": "ephemeral"}  # ここをキャッシュ
        }
    ],
    messages=[{"role": "user", "content": "契約書のリスクを分析してください。"}]
)

cache_control: {"type": "ephemeral"} を付けた箇所がキャッシュされます。ユーザーが変わっても、同じシステムプロンプトとドキュメントなら同じキャッシュが使われます。

効果が大きいユースケース

  • 数万トークンのマニュアルや法律文書をシステムプロンプトに含めるRAGアプリ
  • 毎回同じ長い初期設定を送るチャットボット
  • 大きなコードベースを参照させながら質問に答えるエージェント

モデル選択の戦略

最高性能のモデルを常に使うのは費用の無駄です。タスクの複雑さに応じてモデルを使い分けます。

タスク別の推奨モデル

単純な分類・要約・テキスト変換:Haiku系(最安値、高速) 日常的なQ&A・文章生成・コード補完:Sonnet系(バランス型) 複雑な推論・多段階エージェント・高品質コード生成:Opus系(最高品質)

同じことを100万回実行するバッチ処理と、1回の重要な意思決定では使うべきモデルが異なります。

ルーティング戦略

入力の複雑さを事前に判定して適切なモデルに振り分ける「LLMルーター」パターンも効果的です。

def route_to_model(query: str) -> str:
    # 短い・単純な質問はHaikuへ
    if len(query) < 100 and "?" in query:
        return "claude-haiku-4-5"
    # コード生成はSonnetへ
    elif any(kw in query for kw in ["コード", "実装", "関数"]):
        return "claude-sonnet-4-5"
    # それ以外の複雑なタスクはOpusへ
    else:
        return "claude-opus-4-5"

バッチ処理の活用

リアルタイムで応答する必要がないタスクはバッチAPIを使うと大幅に割安になります。AnthropicのMessage Batches APIは通常価格の50%で利用でき、24時間以内に処理されます。

import anthropic

client = anthropic.Anthropic()

# 複数リクエストをまとめてバッチ送信
batch = client.messages.batches.create(
    requests=[
        {
            "custom_id": f"item-{i}",
            "params": {
                "model": "claude-haiku-4-5",
                "max_tokens": 256,
                "messages": [{"role": "user", "content": f"この商品名を英訳して: {name}"}]
            }
        }
        for i, name in enumerate(product_names)
    ]
)

print(f"バッチID: {batch.id}")
# 後で結果を取得

商品説明の一括翻訳・レビューの感情分析・大量データの分類など、一括で処理できるタスクに適しています。

プロンプトの最適化

不要な説明を省く

プロンプトに「丁寧に」「できる限り詳しく」「〜することができます」といった冗長な表現を削ることで入力トークンを削減します。指示は簡潔に、具体的に書くほどコストも下がります。

max_tokensの適切な設定

max_tokensをデフォルトのまま大きな値にしておくと、不必要に長い回答が生成されてコストが上がります。タスクに必要な出力サイズの上限を設定します。

使用量のモニタリング

コストを管理するには使用量の可視化が必要です。

AnthropicのダッシュボードではAPIキー単位の使用量を確認できます。アプリ側でも response.usage.input_tokensresponse.usage.output_tokens を記録することで、モデル別・機能別のコスト分析が可能です。

response = client.messages.create(...)
print(f"入力: {response.usage.input_tokens} tokens")
print(f"出力: {response.usage.output_tokens} tokens")
print(f"キャッシュヒット: {response.usage.cache_read_input_tokens} tokens")

定期的にコストレポートを確認し、急激な増加をSlackやメールで通知する仕組みを作っておくと安心です。

まとめ

AI APIのコスト最適化は、Prompt Cachingによる入力コスト削減・モデルの使い分け・バッチ処理の活用・プロンプトの簡潔化の4本柱が基本です。まず使用量をモニタリングしてどこにコストが集中しているかを把握し、効果の大きい施策から順番に実施するのが現実的なアプローチです。