Kompromisy między kosztem a opóźnieniem
Budżety tokenów na rozumowanie, koszty inferencji i hybrydowe strategie routingu.
Kompromisy między kosztem a opóźnieniem to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Trójkąt koszt–jakość–opóźnienie
W projektowaniu systemów LLM istnieje podstawowy trójkąt obejmujący koszt, jakość i opóźnienie. W danym momencie można optymalizować najwyżej dwa z tych trzech parametrów.
- Niski koszt + wysoka jakość = wolne działanie (modele rozumujące, wolne generowanie)
- Niski koszt + małe opóźnienie = niższa jakość (małe i szybkie modele)
- Wysoka jakość + małe opóźnienie = wysoki koszt (model rozumujący ze strumieniowaniem)
Każda decyzja architektoniczna wiąże się z kompromisem w ramach tego trójkąta.
Cennik modeli rozumujących
Tokeny rozumowania wiążą się z dodatkowym kosztem, niezależnie od standardowych tokenów wejściowych i wyjściowych. Koszt wywołania modelu rozumującego obejmuje: tokeny wejściowe + tokeny rozumowania + tokeny wyjściowe.
W porównaniu z szybkimi lub małymi modelami: o3 jest mniej więcej 20 razy droższy za token niż GPT-4o-mini, a Claude Opus z rozszerzonym trybem rozumowania jest mniej więcej 10–15 razy droższy za token wyjściowy niż Claude Haiku.
# 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}')Narzut tokenów rozumowania
Liczba tokenów rozumowania jest często znacznie większa niż liczba tokenów wyjściowych. Zwięzła odpowiedź o długości 200 słów może być poprzedzona rozumowaniem obejmującym od 5000 do 15 000 tokenów. Te tokeny rozumowania kosztują tyle samo co tokeny wyjściowe.
Dlatego mnożnik kosztu modeli rozumujących zależy przede wszystkim od liczby tokenów rozumowania, a nie od długości odpowiedzi.
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
)Opóźnienia: czego się spodziewać
Zaobserwowane zakresy opóźnień dla różnych konfiguracji modeli. Mogą się znacznie różnić w zależności od obciążenia i trudności problemu:
- Claude Haiku: 0,5–2 sekundy
- Claude Sonnet: 2–8 sekund
- Claude Opus (bez rozumowania): 5–15 sekund
- Claude Opus (rozumowanie 5K): 15–40 sekund
- Claude Opus (rozumowanie 16K): 40–90 sekund
- o3 (wysoki poziom wysiłku): 30–120 sekund
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)Czas do pierwszego tokena w trybie strumieniowym
Chociaż całkowite opóźnienie modeli rozumujących jest duże, czas do pierwszego tokena (TTFT) w trybie strumieniowym może być znacznie krótszy — model zaczyna przesyłać odpowiedź natychmiast po zakończeniu rozumowania. Aby szybko pokazać użytkownikowi pierwsze dane, należy użyć strumieniowania.
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.')Wzorzec architektury hybrydowej
Praktyczny wzorzec stosowany w środowisku produkcyjnym polega na tym, aby najpierw użyć szybkiego modelu standardowego. Jeśli wynik jest zadowalający, co należy sprawdzić za pomocą wskaźnika jakości, należy od razu go zwrócić. W przeciwnym razie należy przekazać żądanie do modelu rozumującego. Zapewnia to małe średnie opóźnienie i niski średni koszt, a jednocześnie wysoką dokładność w trudnych przypadkach.
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'Koszt w dużej skali: obliczenia
Modele rozumujące, które podczas testów wydają się niedrogie, mogą generować znaczące koszty przy dużej skali. Przed wyborem architektury należy zawsze oszacować koszty.
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)Buforowanie promptów w celu obniżenia kosztów
W przypadku wywołań modeli rozumujących z długimi, powtarzającymi się promptami systemowymi lub kontekstem należy używać buforowania promptów. Buforowane tokeny kosztują o 90% mniej niż tokeny niebuforowane. Jest to szczególnie korzystne, gdy ten sam obszerny kontekst, na przykład dokumenty lub kod, jest wysyłany wielokrotnie.
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 tokensPrzetwarzanie wsadowe w celu obniżenia kosztów
OpenAI i Anthropic oferują interfejsy API do przetwarzania wsadowego z 50-procentową zniżką dla żądań, które nie są wrażliwe na czas. Jeśli mają Państwo dużą liczbę zapytań, które mogą czekać na wyniki przez kilka godzin, przetwarzanie wsadowe jest najbardziej opłacalną opcją.
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'Optymalizacja budżetu tokenów
Należy dobrać wartość budget_tokens odpowiednio do klasy problemu. Użycie budżetu 16K dla prostego problemu marnuje tokeny i zwiększa opóźnienie. Należy utworzyć tabelę wartości budżetu na podstawie poziomów trudności problemów.
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')) # 8000Ustalanie umów SLA dla aplikacji LLM
Przed wyborem między modelami standardowymi a rozumującymi należy określić wymagania dotyczące umowy SLA (Service Level Agreement) aplikacji:
- Opóźnienie P50: typowe doświadczenie użytkownika
- Opóźnienie P99: najgorsze doświadczenie użytkownika
- Budżet tokenów: maksymalny koszt jednego zapytania użytkownika
- Minimalny poziom jakości: minimalna akceptowalna dokładność na zbiorze testowym
Modele rozumujące z łatwością przekraczają limity opóźnień P99 określone w umowach SLA dla aplikacji interaktywnych. Przed podjęciem ostatecznych decyzji dotyczących architektury należy znać swoje ograniczenia.
Sprawdzenie wiedzy: koszty modeli rozumujących
Co jest głównym czynnikiem wysokich kosztów korzystania z modeli rozumujących w porównaniu z modelami standardowymi?
Podsumowanie: kompromisy między kosztem a opóźnieniem
Modele rozumujące są drogie: tokeny rozumowania są rozliczane jak tokeny wyjściowe, a ich liczba może być od 10 do 50 razy większa niż liczba tokenów widocznej odpowiedzi. W przypadku trudnych problemów opóźnienie wynosi od 15 do 120 sekund. Można je ograniczyć za pomocą wzorca hybrydowego, czyli użycia szybkiego modelu w pierwszej kolejności i przekazywania żądania do modelu rozumującego tylko przy niskiej pewności, buforowania promptów dla powtarzających się obszernych kontekstów, co zapewnia 90-procentową zniżkę na buforowane tokeny, interfejsu API do przetwarzania wsadowego dla zadań wykonywanych offline, co zapewnia 50-procentową zniżkę, oraz dostosowania wartości budget_tokens do trudności problemu. Przy dużej skali nawet niewielkie koszty pojedynczych zapytań składają się na wysokie miesięczne rachunki. Przed wyborem architektury należy zawsze oszacować koszty.
Często zadawane pytania
Czy lekcja „Kompromisy między kosztem a opóźnieniem” jest bezpłatna?
Tak — pełny tekst „Kompromisy między kosztem a opóźnieniem” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Kompromisy między kosztem a opóźnieniem”?
Budżety tokenów na rozumowanie, koszty inferencji i hybrydowe strategie routingu. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Kompromisy między kosztem a opóźnieniem”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym różnią się modele rozumujące
- Skuteczne prompty dla extended thinking
- Kiedy używać modeli rozumujących, a kiedy standardowych
- Kompromisy między kosztem a opóźnieniem