Monitorizarea costurilor și a latenței (TTFT, tokeni, cache) în LLMOps, Evaluare & Securitate AI

Ce măsori la costul și latența apelurilor LLM: tokeni de intrare și de ieșire, timpul până la primul token, durata totală și efectul prompt caching.

Configurare & comandă
# Metrici de bază pentru un apel LLM
TTFT              = momentul primului fragment din stream - momentul cererii
Durata totală     = momentul ultimului fragment - momentul cererii
Viteza de ieșire  = tokeni de ieșire / (durata totală - TTFT)
Cost              = tokeni_intrare * preț_intrare + tokeni_ieșire * preț_ieșire
                    (+ tokenii scriși și citiți din cache, la prețurile lor)

Costul unui apel prin API se calculează din tokenii de intrare și de ieșire, fiecare cu prețul lui per milion de tokeni. La modelele Claude actuale prețul de ieșire este de 5 ori cel de intrare (de exemplu Claude Sonnet 5.5: 2 $ intrare, 10 $ ieșire per milion de tokeni, conform paginii de modele Anthropic). Lungimea răspunsurilor contează deci la fel de mult ca lungimea promptului.

Latența percepută depinde mai ales de TTFT (time to first token), vizibil doar când răspunsul vine în stream. Convențiile OpenTelemetry GenAI au pentru el atributul gen_ai.response.time_to_first_chunk. Pragurile acceptabile depind de aplicație; urmărește distribuția (p50, p95), nu doar media.

Prompt caching ieftinește prefixele de prompt repetate. La Anthropic, scrierea în cache costă 1,25× prețul de intrare (TTL 5 minute) sau 2× (TTL 1 oră), iar citirea 0,1× (0,05× la Claude Opus 5.5 și Sonnet 5.5). La OpenAI, pentru GPT-5.6 și modelele următoare, prefixul trebuie să aibă cel puțin 1.024 de tokeni, scrierea costă 1,25× (durată implicită 30 de minute), iar citirea 0,1× sau 0,05× după model. Economia reală depinde de cât de des se repetă exact același prefix.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
TTFT Timpul până la primul fragment al răspunsului. Depinde de lungimea promptului, de model și de încărcarea furnizorului.
usage Câmpul din răspunsul API cu tokenii de intrare și de ieșire; este baza calculului de cost.
Tokeni din cache Raportați separat: cache_read_input_tokens și cache_creation_input_tokens la Anthropic, cached_tokens la OpenAI.
max_tokens Limita de tokeni generați; plafonează costul de ieșire al unui apel.
Bugete și limite Plafoane pe cheie sau pe utilizator. OWASP LLM10:2025 (Unbounded Consumption) descrie atacurile de tip Denial of Wallet, care urmăresc tocmai epuizarea bugetului.

Exemple practice și scenarii reale

Exemplul 1: Măsurarea TTFT cu streaming (SDK OpenAI)

import time
from openai import OpenAI

client = OpenAI()
t0 = time.perf_counter()
ttft = None
stream = client.chat.completions.create(
    model="gpt-6-luna",
    messages=[{"role": "user", "content": "Rezumă articolul..."}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    if ttft is None and chunk.choices and chunk.choices[0].delta.content:
        ttft = time.perf_counter() - t0
    if chunk.usage:
        print(chunk.usage)
print("TTFT:", ttft, "total:", time.perf_counter() - t0)

Exemplul 2: Prompt caching automat la Anthropic

Un singur câmp cache_control la nivelul cererii pune punctul de cache după ultimul bloc care se poate memora. Prefixul se formează în ordinea tools, system, messages.

import anthropic

client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    cache_control={"type": "ephemeral"},
    system=DOCUMENTATIE_LUNGA,
    messages=[{"role": "user", "content": "Cum resetez parola?"}],
)
print(response.usage)

Greșeli frecvente și capcane

  • Pui conținut variabil (data, ID-ul cererii) la începutul promptului. Cache-ul se potrivește doar pe prefixe identice; partea care se schimbă trebuie să fie la final.
  • Calculezi costul doar din tokenii de intrare. Tokenii de ieșire sunt mai scumpi și variază mult de la o cerere la alta.
  • Urmărești doar media latenței. Câteva cereri foarte lente pot strica experiența fără să mute media; folosește percentile.

Noțiuni și module înrudite