0Pricing
AI Prompt Engineering · レッスン

コストとレイテンシのトレードオフ

思考トークンの予算、推論コスト、ハイブリッドルーティング戦略を学びます。

「コストとレイテンシのトレードオフ」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

コスト・品質・レイテンシーの三角形

LLMシステム設計には、コスト、品質、レイテンシーという基本的な三角形があります。どの時点でも、この3つのうち最適化できるのは最大2つです。

  • 低コスト + 高品質 = 遅い(推論モデル、低速な生成)
  • 低コスト + 低レイテンシー = 低い品質(小型で高速なモデル)
  • 高品質 + 低レイテンシー = 高コスト(ストリーミングを使う推論モデル)

すべてのアーキテクチャ上の判断は、この三角形におけるトレードオフです。

推論モデルの料金

思考トークンには、標準の入力トークンおよび出力トークンに加えて追加料金がかかります。推論モデルの呼び出し料金には、入力トークン + 思考トークン + 出力トークンが含まれます。

高速または小型のモデルと比較すると、o3はトークンあたりGPT-4o-miniよりおよそ20倍高額です。extended thinkingを使用するClaude Opusは、出力トークンあたりClaude Haikuよりおよそ10~15倍高額です。

# Rough cost estimates (2025 pricing, may change)
# Source: provider pricing pages

PRICING = {
    # (input $/1M tokens, output $/1M tokens)
    'gpt-4o-mini':       (0.15,   0.60),
    'gpt-4o':            (2.50,  10.00),
    'o3-mini':           (1.10,   4.40),
    'o3':                (10.0,  40.00),
    'claude-haiku-4-5':  (0.25,   1.25),
    'claude-sonnet-4-5': (3.00,  15.00),
    'claude-opus-4-5':   (15.0,  75.00),
}

def estimate_cost(model, input_tokens, output_tokens, thinking_tokens=0):
    inp_price, out_price = PRICING[model]
    # Thinking tokens billed as output tokens
    total_out = output_tokens + thinking_tokens
    cost = (input_tokens / 1e6 * inp_price) + (total_out / 1e6 * out_price)
    return cost

# A single hard question with 8000 thinking tokens:
cost = estimate_cost('claude-opus-4-5', 500, 300, thinking_tokens=8000)
print(f'Cost per call: ${cost:.4f}')

思考トークンのオーバーヘッド

思考トークンは、出力トークンよりはるかに多くなることがあります。簡潔な200語の回答の背後で、5,000~15,000個の思考トークンが使われることもあります。これらの思考トークンにも、出力トークンと同じ料金がかかります。

そのため、推論モデルのコスト倍率を主に決めるのは回答の長さではなく、思考トークンです。

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def analyze_token_breakdown(question, budget_tokens):
    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=budget_tokens + 2000,
        thinking={'type': 'enabled', 'budget_tokens': budget_tokens},
        messages=[{'role': 'user', 'content': question}]
    )

    # Usage breakdown
    usage = response.usage
    print(f'Input tokens:  {usage.input_tokens:,}')
    print(f'Output tokens: {usage.output_tokens:,}')

    # Thinking tokens are in cache_creation_input_tokens on some APIs
    # or can be estimated from thinking block content length
    thinking_blocks = [b for b in response.content if b.type == 'thinking']
    est_thinking = sum(len(b.thinking.split()) * 1.3 for b in thinking_blocks)
    print(f'Est. thinking tokens: {int(est_thinking):,}')
    answer = next(b.text for b in response.content if b.type == 'text')
    print(f'Answer words: {len(answer.split())}')

analyze_token_breakdown(
    'Explain the trade-offs between REST and GraphQL APIs.',
    budget_tokens=5000
)

レイテンシーの目安

各モデル構成で観測されたレイテンシーの範囲です(負荷や問題の難易度によって大きく変動します)。

  • Claude Haiku: 0.5~2秒
  • Claude Sonnet: 2~8秒
  • Claude Opus(思考なし): 5~15秒
  • Claude Opus(thinking 5K): 15~40秒
  • Claude Opus(thinking 16K): 40~90秒
  • o3(high effort): 30~120秒
import time
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def benchmark_latency(prompt, model, budget_tokens=None):
    kwargs = {
        'model': model,
        'max_tokens': 2000,
        'messages': [{'role': 'user', 'content': prompt}]
    }
    if budget_tokens:
        kwargs['thinking'] = {'type': 'enabled', 'budget_tokens': budget_tokens}
        kwargs['max_tokens'] = budget_tokens + 2000

    start = time.time()
    response = client.messages.create(**kwargs)
    elapsed = time.time() - start
    answer = response.content[-1].text
    print(f'{model} (budget={budget_tokens}): {elapsed:.1f}s')
    return elapsed, answer

benchmark_latency('Name 3 planets', 'claude-haiku-4-5')
benchmark_latency('Solve x^2 - 5x + 6 = 0', 'claude-opus-4-5', 3000)
benchmark_latency('Design a fault-tolerant payment system', 'claude-opus-4-5', 10000)

ストリーミング時の初回トークン到達時間

推論モデルの合計レイテンシーは大きい一方、ストリーミング時の初回トークン到達時間(TTFT)は大幅に短くできる場合があります。モデルは思考を終えるとすぐに回答のストリーミングを開始します。ストリーミングして、ユーザーに素早く何かを表示してください。

import anthropic
import time

client = anthropic.Anthropic(api_key='sk-ant-...')

def stream_with_timing(prompt):
    start = time.time()
    first_token_time = None
    full_text = ''

    with client.messages.stream(
        model='claude-opus-4-5',
        max_tokens=10000,
        thinking={'type': 'enabled', 'budget_tokens': 5000},
        messages=[{'role': 'user', 'content': prompt}]
    ) as stream:
        in_answer = False
        for text_chunk in stream.text_stream:
            if not in_answer:
                in_answer = True
                first_token_time = time.time() - start
                print(f'Time to first answer token: {first_token_time:.1f}s')
            full_text += text_chunk
            print(text_chunk, end='', flush=True)

    total_time = time.time() - start
    print(f'\nTotal time: {total_time:.1f}s')

stream_with_timing('List 5 key benefits of microservices.')

ハイブリッドアーキテクチャパターン

実運用で使いやすいパターンは、まず高速な標準モデルを使う方法です。結果が十分であれば(品質指標で確認します)、すぐに返します。そうでなければ、推論モデルにエスカレーションします。これにより、難しいケースでは高い精度を保ちながら、平均レイテンシーとコストを低くできます。

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def hybrid_query(question, quality_threshold=0.7):
    # Step 1: Try fast model first
    r_fast = client.messages.create(
        model='claude-haiku-4-5',
        max_tokens=300,
        messages=[{'role': 'user', 'content': question}]
    )
    fast_answer = r_fast.content[0].text

    # Step 2: Quick confidence check
    confidence_check = client.messages.create(
        model='claude-haiku-4-5',
        max_tokens=20,
        messages=[{
            'role': 'user',
            'content': (
                f'Q: {question}\nA: {fast_answer}\n'
                f'Rate answer quality 0.0-1.0. Number only:'
            )
        }]
    )
    try:
        quality = float(confidence_check.content[0].text.strip())
    except ValueError:
        quality = 0.5

    if quality >= quality_threshold:
        return fast_answer, 'fast'

    # Step 3: Escalate to reasoning model
    r_slow = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=8000,
        thinking={'type': 'enabled', 'budget_tokens': 6000},
        messages=[{'role': 'user', 'content': question}]
    )
    return next(b.text for b in r_slow.content if b.type == 'text'), 'reasoning'

大規模利用時のコストを計算する

テストでは手頃に見える推論モデルも、大規模に利用すると無視できないコストになります。アーキテクチャを選ぶ前に、必ずコストを試算してください。

def project_monthly_cost(daily_queries, model_config):
    """
    Project monthly API costs for different configurations.
    model_config: dict with 'cost_per_query' key
    """
    monthly_queries = daily_queries * 30
    monthly_cost = monthly_queries * model_config['cost_per_query']

    print(f'Daily queries: {daily_queries:,}')
    print(f'Monthly queries: {monthly_queries:,}')
    print(f'Cost per query: ${model_config["cost_per_query"]:.4f}')
    print(f'Monthly cost: ${monthly_cost:,.2f}')
    return monthly_cost

# Compare configurations at 10,000 queries/day
configs = [
    {'name': 'All Haiku', 'cost_per_query': 0.0005},
    {'name': 'All Sonnet', 'cost_per_query': 0.015},
    {'name': 'All Opus+Thinking', 'cost_per_query': 0.85},
    {'name': 'Hybrid (90% Haiku, 10% Opus)', 'cost_per_query': 0.9*0.0005 + 0.1*0.85},
]

for config in configs:
    print(f'\n--- {config["name"]} ---')
    project_monthly_cost(10_000, config)

コスト削減のためのプロンプトキャッシュ

長く繰り返し使うシステムプロンプトやコンテキストを含む推論モデルの呼び出しには、プロンプトキャッシュを使用してください。キャッシュされたトークンの料金は、キャッシュされていないトークンより90%安くなります。同じ大きなコンテキスト(ドキュメントやコードなど)を繰り返し送信する場合に、特に大きな効果があります。

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

LONG_CONTEXT = 'A' * 50000  # Simulated large document

# With prompt caching: mark large context as cacheable
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=10000,
    thinking={'type': 'enabled', 'budget_tokens': 6000},
    system=[
        {
            'type': 'text',
            'text': f'You are analyzing this document: {LONG_CONTEXT}',
            'cache_control': {'type': 'ephemeral'}  # Cache this prefix
        }
    ],
    messages=[{
        'role': 'user',
        'content': 'What are the main themes in this document?'
    }]
)

usage = response.usage
print(f'Cache read tokens: {getattr(usage, "cache_read_input_tokens", 0):,}')
print(f'Cache creation tokens: {getattr(usage, "cache_creation_input_tokens", 0):,}')
# Second call with same system content costs ~90% less on cached tokens

コスト効率を高めるバッチ処理

OpenAIとAnthropicはどちらも、時間制約のないリクエストに対して50%のコスト割引を適用するバッチAPIを提供しています。結果を数時間待てる大量のクエリがある場合、バッチ処理が最も費用対効果の高い選択肢です。

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

# Batch API: 50% cheaper, 24-hour turnaround
requests = [
    {
        'custom_id': f'query_{i}',
        'params': {
            'model': 'claude-opus-4-5',
            'max_tokens': 1024,
            'messages': [{'role': 'user', 'content': f'Analyze dataset row {i}'}]
        }
    }
    for i in range(100)  # 100 queries in one batch
]

# Submit batch
batch = client.messages.batches.create(requests=requests)
print(f'Batch ID: {batch.id}')
print(f'Status: {batch.processing_status}')
print(f'Requests: {batch.request_counts}')
# Poll batch.id for results when processing_status == 'ended'

トークン予算の最適化

問題の種類に応じてbudget_tokensを適切な大きさに設定してください。単純な問題に16Kの予算を使うと、トークンを無駄にし、レイテンシーも増加します。問題の難易度の段階に基づいて、予算の対応表を作成してください。

BUDGET_LOOKUP = {
    'simple_math':        1000,   # Arithmetic, basic algebra
    'medium_code':        3000,   # Function implementation, debugging
    'complex_reasoning':  8000,   # System design, complex analysis
    'research_grade':    16000,   # Proofs, research-level problems
}

def budget_for_query(query):
    q_lower = query.lower()
    if any(kw in q_lower for kw in ['calculate', 'what is', 'how many', 'convert']):
        return BUDGET_LOOKUP['simple_math']
    elif any(kw in q_lower for kw in ['code', 'function', 'bug', 'implement']):
        return BUDGET_LOOKUP['medium_code']
    elif any(kw in q_lower for kw in ['design', 'architecture', 'analyze', 'strategy']):
        return BUDGET_LOOKUP['complex_reasoning']
    else:
        return BUDGET_LOOKUP['medium_code']  # Safe default

print(budget_for_query('What is 15% of 340?'))       # 1000
print(budget_for_query('Implement a trie in Python')) # 3000
print(budget_for_query('Design a CDC pipeline'))      # 8000

LLMアプリケーションのSLA設定

標準モデルと推論モデルのどちらを選ぶか決める前に、アプリケーションのサービスレベル合意(Service Level Agreement、SLA)要件を定義してください。

  • P50レイテンシー: 一般的なユーザー体験
  • P99レイテンシー: 最悪時のユーザー体験
  • トークン予算: ユーザーの1回のクエリにかけられる最大コスト
  • 品質の下限: テストセットで許容できる最低精度

推論モデルでは、インタラクティブなアプリケーションのP99レイテンシーSLAに簡単に違反する可能性があります。アーキテクチャの決定を確定する前に、制約を把握してください。

理解度チェック:推論モデルのコスト

標準モデルと比べたとき、推論モデルの利用コストが高くなる主な要因は何ですか。

まとめ:コストとレイテンシーのトレードオフ

思考トークンは出力トークンとして課金され、目に見える回答の10~50倍になることもあるため、推論モデルは高コストです。難しい問題では、レイテンシーが15~120秒に及びます。対策として、ハイブリッドパターン(まず高速モデルを使い、信頼度が低い場合だけエスカレーションする)、大きなコンテキストを繰り返し使う場合のプロンプトキャッシュ(キャッシュ済みトークンが90%割引)、オフライン処理向けのバッチAPI(50%割引)、問題の難易度に応じたbudget_tokensの適正化を利用してください。大規模利用では、1クエリあたりのわずかなコストでも積み重なって月額料金が大きくなります。アーキテクチャを決定する前に、必ずコストを試算してください。

よくある質問

「コストとレイテンシのトレードオフ」レッスンは無料ですか?

はい。「コストとレイテンシのトレードオフ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。

「コストとレイテンシのトレードオフ」で何を学びますか?

思考トークンの予算、推論コスト、ハイブリッドルーティング戦略を学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Prompt Engineeringを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「コストとレイテンシのトレードオフ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 推論モデルの違い
  2. Extended Thinkingに効果的なプロンプト
  3. 推論モデルと標準モデルの使い分け
  4. コストとレイテンシのトレードオフ
← AI Prompt Engineeringに戻る