Mesurer et analyser la latence
Pourquoi la latence est votre métrique numéro un
Lorsque vous déployez une application alimentée par un LLM en production, la latence perçue par vos utilisateurs détermine directement l’adoption. Une réponse qui met 8 secondes à apparaître fait fuir 70 % des utilisateurs. Cette leçon vous apprend à mesurer, décomposer et diagnostiquer la latence de bout en bout.
Les composantes de la latence
La latence totale d’un appel API se décompose en plusieurs segments :
- Latence réseau : temps de transit entre votre serveur et l’API OpenAI
- Time to First Token (TTFT) : temps avant que le premier token ne soit généré
- Time Per Output Token (TPOT) : vitesse de génération de chaque token suivant
- Latence applicative : traitement côté serveur avant et après l’appel API
Mesurer avec Python
Voici comment instrumenter un appel à la Responses API pour capturer chaque segment :
import time
import openai
client = openai.OpenAI()
def mesurer_latence(prompt: str, model: str = "gpt-5.3") -> dict:
"""Mesure la latence décomposée d'un appel API."""
metriques = {}
debut_total = time.perf_counter()
# Appel en streaming pour mesurer le TTFT
stream = client.responses.create(
model=model,
input=prompt,
stream=True,
)
premier_token = True
tokens_sortie = 0
for event in stream:
if event.type == "response.output_text.delta":
if premier_token:
metriques["ttft"] = time.perf_counter() - debut_total
debut_generation = time.perf_counter()
premier_token = False
tokens_sortie += 1
metriques["duree_totale"] = time.perf_counter() - debut_total
metriques["tokens_sortie"] = tokens_sortie
if tokens_sortie > 1:
metriques["tpot"] = (
(metriques["duree_totale"] - metriques["ttft"]) / (tokens_sortie - 1)
)
return metriques
resultat = mesurer_latence("Expliquez le théorème de Bayes en 3 phrases.")
for cle, valeur in resultat.items():
print(f"{cle}: {valeur:.4f}" if isinstance(valeur, float) else f"{cle}: {valeur}")
Diagnostiquer les goulots d’étranglement
TTFT élevé
Un TTFT élevé (> 2 secondes) indique généralement :
- Un prompt système trop long non mis en cache
- L’utilisation d’un modèle de raisonnement (o3-pro, o4-mini) qui réfléchit avant de répondre
- Un pic de charge côté OpenAI
TPOT élevé
Un TPOT élevé (> 50 ms/token) peut venir de :
- Un
max_output_tokenstrès élevé qui force des séquences longues - L’utilisation de function calling complexe avec de nombreux outils
Outils de monitoring
Pour un suivi continu en production, intégrez ces métriques dans votre stack d’observabilité :
import logging
from dataclasses import dataclass, field
@dataclass
class MetriquesLatence:
"""Agrège les métriques de latence sur une fenêtre glissante."""
mesures: list[dict] = field(default_factory=list)
def ajouter(self, mesure: dict) -> None:
self.mesures.append(mesure)
if len(self.mesures) > 1000:
self.mesures = self.mesures[-1000:]
@property
def ttft_p50(self) -> float:
valeurs = sorted(m["ttft"] for m in self.mesures if "ttft" in m)
if not valeurs:
return 0.0
return valeurs[len(valeurs) // 2]
@property
def ttft_p99(self) -> float:
valeurs = sorted(m["ttft"] for m in self.mesures if "ttft" in m)
if not valeurs:
return 0.0
idx = int(len(valeurs) * 0.99)
return valeurs[min(idx, len(valeurs) - 1)]
def rapport(self) -> str:
return (
f"TTFT p50={self.ttft_p50:.3f}s p99={self.ttft_p99:.3f}s | "
f"Échantillons: {len(self.mesures)}"
)
Points clés à retenir
- La latence se décompose en TTFT + génération (TPOT x tokens) + réseau
- Mesurez toujours en streaming pour obtenir le TTFT réel
- Suivez les percentiles p50 et p99, pas seulement la moyenne
- Le choix du modèle impacte directement la latence : GPT-5.3 est plus rapide que o3-pro