0Pricing
AI Prompt Engineering · 课时

成本与延迟之间的权衡

思考词元预算、推理成本和混合路由策略。

成本与延迟之间的权衡 是 CoddyKit 上的免费 AI Prompt Engineering 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Prompt Engineering 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Prompt Engineering 课程共包含 4 节课。

成本、质量与延迟三角

在 LLM 系统设计中,存在一个基本三角:成本、质量和延迟。在任何特定时刻,您最多只能同时优化其中两个方面。

  • 低成本 + 高质量 = 速度慢(推理模型、慢速生成)
  • 低成本 + 低延迟 = 质量较低(小型/快速模型)
  • 高质量 + 低延迟 = 成本高(使用流式传输的推理模型)

每项架构决策都是在这个三角中的权衡。

推理模型定价

思考令牌的费用是在标准输入令牌和输出令牌费用之外另行收取的。一次推理模型调用的费用包括:输入令牌 + 思考令牌 + 输出令牌。

与快速小型模型相比:o3 的每个令牌费用大约是 GPT-4o-mini 的 20 倍;启用扩展思考的 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(思考 5K):15 到 40 秒
  • Claude Opus(思考 16K):40 到 90 秒
  • o3(高强度):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 都为非时效性请求提供批处理 API,费用可降低 50%。如果您有大量查询可以等待数小时后再获得结果,批处理是最具成本效益的选择。

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

在标准模型和推理模型之间做出选择之前,请定义应用的服务级别协议(SLA)要求:

  • P50 延迟:典型的用户体验
  • P99 延迟:最差情况下的用户体验
  • 令牌预算:每次用户查询的最高成本
  • 质量下限:在测试集上可接受的最低准确率

对于交互式应用,推理模型很容易违反 P99 延迟 SLA。在架构决策最终确定之前,请先了解您的限制条件。

知识检查:推理模型成本

与标准模型相比,使用推理模型时成本较高的主要原因是什么?

回顾:成本与延迟的权衡

推理模型成本高昂:思考令牌会按照输出令牌计费,其数量可能是可见答案的 10 到 50 倍。处理困难问题时,延迟范围为 15 到 120 秒。可以采取以下措施进行缓解:使用混合模式(先使用快速模型,仅在置信度较低时升级),对重复的大型上下文使用提示词缓存(缓存令牌可享受 90% 折扣),对离线工作负载使用批处理 API(可享受 50% 折扣),并根据问题难度合理设置 budget_tokens。规模化后,即使每次查询的成本很低,累积起来也会形成高额的月度账单——在确定架构之前,务必先预测成本。

常见问题解答

「成本与延迟之间的权衡」课时是免费的吗?

是的 — 「成本与延迟之间的权衡」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Prompt Engineering 课程的其余内容,请升级到 CoddyKit PRO。 AI Prompt Engineering 课程共包含 4 节课。

「成本与延迟之间的权衡」这节课中我会学到什么?

思考词元预算、推理成本和混合路由策略。 你通过在浏览器中直接运行的动手代码来练习 AI Prompt Engineering,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AI Prompt Engineering 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AI Prompt Engineering 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「成本与延迟之间的权衡」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AI Prompt Engineering 课中编写并运行代码吗?

能。每节 AI Prompt Engineering 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 推理模型有何不同
  2. 适用于扩展思考的有效提示词
  3. 何时使用推理模型与标准模型
  4. 成本与延迟之间的权衡
← 返回 AI Prompt Engineering