0Pricing
AI Prompt Engineering · Leçon

Surveiller les performances des prompts en production

Suivez la latence, le coût, les scores de qualité et les taux d’échec pour chaque version de prompt.

Surveiller les performances des prompts en production est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

Pourquoi surveiller les performances des invites ?

Une invite déployée en production n'est pas « terminée ». Le comportement du modèle évolue avec les mises à jour, les saisies des utilisateurs changent au fil du temps et les coûts peuvent augmenter de manière inattendue. Une surveillance continue détecte les régressions avant qu'elles ne nuisent aux utilisateurs et permet de maîtriser les dépenses.

Métriques clés par version d'invite

Suivez ces cinq métriques pour chaque version d'invite en production :

  • Latence moyenne : durée entre la demande et la réponse complète (P50, P95, P99)
  • Coût par appel : jetons d'entrée × prix d'entrée + jetons de sortie × prix de sortie
  • Score de qualité : évaluation automatisée (LLM utilisé comme juge ou métrique de tâche)
  • Taux d'erreur : erreurs d'interface de programmation + échecs d'analyse des sorties mal formées
  • Satisfaction des utilisateurs : évaluation par pouce, taux de nouvelle tentative, abandon de session

Instrumentation : enregistrement des métriques

Entourez chaque appel de LLM d'une instrumentation qui enregistre toutes les métriques clés dans un stockage de séries temporelles ou une base de données, afin de permettre leur analyse et le déclenchement d'alertes ultérieurs.

import time
import openai

client = openai.OpenAI(api_key='YOUR_API_KEY')

def instrumented_call(prompt_id, version, messages, model):
    start = time.time()
    error = False
    response = None
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages
        )
    except Exception as e:
        error = True
        raise
    finally:
        latency_ms = (time.time() - start) * 1000
        usage = response.usage if response else None
        record_metric({
            'prompt_id': prompt_id,
            'version': version,
            'latency_ms': latency_ms,
            'input_tokens': usage.prompt_tokens if usage else 0,
            'output_tokens': usage.completion_tokens if usage else 0,
            'error': error,
            'timestamp': time.time()
        })
    return response

Calcul du coût par appel

Coût par appel = jetons d'entrée × prix d'entrée + jetons de sortie × prix de sortie. Le stockage des nombres bruts de jetons vous permet de recalculer le coût chaque fois que les tarifs changent.

# pricing.py — model pricing table (per 1M tokens)
PRICING = {
    'gpt-4o': {'input': 2.50, 'output': 10.00},
    'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
    'claude-3-5-sonnet-20241022': {'input': 3.00, 'output': 15.00},
}

def cost_usd(model, input_tokens, output_tokens):
    p = PRICING.get(model)
    if not p:
        return None
    cost = (input_tokens / 1_000_000) * p['input'] \
         + (output_tokens / 1_000_000) * p['output']
    return round(cost, 6)

# Example
c = cost_usd('gpt-4o-mini', input_tokens=800, output_tokens=200)
print(f'Cost per call: ${c}')   # Cost per call: $0.000240

# Daily cost estimate
calls_per_day = 50_000
print(f'Daily cost: ${round(c * calls_per_day, 2)}')  # $12.00

Évaluation automatisée de la qualité

Utilisez un LLM comme juge pour évaluer automatiquement la qualité des sorties à l'échelle de la production. Échantillonnez 5 à 10 % des appels pour l'évaluation de la qualité afin de maintenir les coûts à un niveau raisonnable.

import random

JUDGE_SAMPLE_RATE = 0.05  # score 5% of calls

JUDGE_PROMPT = '''Rate the quality of this AI response on a scale of 1-5.
1=Very poor, 3=Acceptable, 5=Excellent.
Return only the integer score.

User input: {input}
AI response: {output}'''

def maybe_score_quality(user_input, ai_output, model='gpt-4o-mini'):
    if random.random() > JUDGE_SAMPLE_RATE:
        return None  # not sampled

    judge_messages = [{'role': 'user', 'content':
        JUDGE_PROMPT.format(input=user_input, output=ai_output)}]
    response = client.chat.completions.create(
        model=model, messages=judge_messages, max_tokens=5
    )
    try:
        score = int(response.choices[0].message.content.strip())
        return max(1, min(5, score))  # clamp to 1-5
    except ValueError:
        return None

Stockage des métriques dans une base de données de séries temporelles

Les bases de données de séries temporelles (InfluxDB, TimescaleDB ou même une simple table PostgreSQL avec un index d'horodatage) stockent efficacement les métriques de chaque appel et prennent en charge les requêtes d'agrégation pour les tableaux de bord.

-- TimescaleDB / PostgreSQL schema for prompt metrics
CREATE TABLE prompt_metrics (
  ts              TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  prompt_id       VARCHAR(100),
  version         VARCHAR(20),
  model           VARCHAR(50),
  latency_ms      FLOAT,
  input_tokens    INT,
  output_tokens   INT,
  cost_usd        FLOAT,
  quality_score   FLOAT,   -- NULL if not sampled
  error           BOOLEAN DEFAULT FALSE
);

-- Convert to hypertable (TimescaleDB)
SELECT create_hypertable('prompt_metrics', 'ts');

-- Query: hourly P95 latency by version
SELECT
  date_trunc('hour', ts) AS hour,
  version,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency_ms) AS p95_latency
FROM prompt_metrics
WHERE prompt_id = 'summarize-article'
  AND ts > NOW() - INTERVAL '24 hours'
GROUP BY 1, 2
ORDER BY 1;

Création d'un tableau de bord des métriques

Les tableaux de bord présentent les cinq métriques clés en temps réel. Utilisez Grafana (avec TimescaleDB comme source de données) ou un tableau de bord web personnalisé. Panneaux clés :

  • Latence P50/P95/P99 au fil du temps, par version
  • Évolution du coût par appel (quotidienne/hebdomadaire)
  • Pourcentage du taux d'erreur
  • Moyenne glissante du score de qualité
  • Score de satisfaction des utilisateurs
# Simple dashboard query aggregation in Python
def get_dashboard_stats(conn, prompt_id, hours=24):
    with conn.cursor() as cur:
        cur.execute('''
            SELECT
              version,
              COUNT(*) AS calls,
              AVG(latency_ms) AS avg_latency,
              PERCENTILE_CONT(0.95)
                WITHIN GROUP (ORDER BY latency_ms) AS p95_latency,
              AVG(cost_usd) AS avg_cost,
              AVG(quality_score) FILTER (WHERE quality_score IS NOT NULL) AS avg_quality,
              SUM(error::int)::float / COUNT(*) AS error_rate
            FROM prompt_metrics
            WHERE prompt_id = %s
              AND ts > NOW() - INTERVAL %s
            GROUP BY version
            ORDER BY MAX(ts) DESC
        ''', (prompt_id, f'{hours} hours'))
        return cur.fetchall()

Détection des anomalies dans les régressions d'invites

La consultation manuelle des tableaux de bord ne permet pas de détecter les régressions lentes. La détection automatisée des anomalies compare une fenêtre glissante à une référence historique et déclenche une alerte lorsque l'écart dépasse un seuil.

import statistics

def detect_anomaly(recent_values, baseline_values, threshold_std=2.0):
    if len(baseline_values) < 10:
        return False  # not enough data
    baseline_mean = statistics.mean(baseline_values)
    baseline_std = statistics.stdev(baseline_values)
    recent_mean = statistics.mean(recent_values)

    if baseline_std == 0:
        return False
    z_score = abs(recent_mean - baseline_mean) / baseline_std
    return z_score > threshold_std

# Example: detect quality regression
baseline_quality = [4.1, 4.0, 4.2, 4.1, 4.0, 3.9, 4.1, 4.2, 4.0, 4.1]
recent_quality   = [3.2, 3.1, 3.4, 3.0]

if detect_anomaly(recent_quality, baseline_quality):
    print('ALERT: Quality score anomaly detected!')
    # fire_pagerduty_alert(...)
else:
    print('Quality within normal range')

Règles d'alerte et seuils

Définissez les règles d'alerte sous forme de code afin qu'elles soient gérées par versions et puissent être révisées. Alertes courantes pour la surveillance des invites :

  • Taux d'erreur > 5 % pendant 5 minutes consécutives
  • Latence P95 > 10 s pendant 3 minutes
  • Coût quotidien > 2× la moyenne hebdomadaire (pic de coût)
  • Le score de qualité baisse de > 20 % par rapport à la référence
# alerts.yaml (Grafana alerting or custom)
alerts:
  - name: HighErrorRate
    condition: error_rate > 0.05
    for: 5m
    severity: critical
    message: 'Prompt {prompt_id} error rate {error_rate:.1%} exceeds 5%'

  - name: HighLatencyP95
    condition: p95_latency_ms > 10000
    for: 3m
    severity: warning
    message: 'P95 latency {p95_latency_ms}ms exceeds 10s for {prompt_id}'

  - name: CostSpike
    condition: daily_cost_usd > weekly_avg_daily_cost * 2
    for: 1h
    severity: warning
    message: 'Daily cost ${daily_cost_usd:.2f} is 2x the weekly average'

  - name: QualityRegression
    condition: rolling_quality_avg < baseline_quality_avg * 0.80
    for: 15m
    severity: critical
    message: 'Quality dropped {pct_drop:.0%} for prompt {prompt_id}'

Signaux de satisfaction des utilisateurs

Les métriques automatisées ne rendent pas compte de tout. Recueillez les signaux explicites et implicites des utilisateurs pour compléter les scores de qualité :

  • Évaluation par pouce : 👍/👎 explicite sur les réponses de l'IA
  • Taux de nouvelle tentative : l'utilisateur soumet immédiatement à nouveau la même requête (insatisfaction implicite)
  • Taux de copie/d'utilisation : l'utilisateur copie la sortie de l'IA (satisfaction implicite)
  • Taux de correction : l'utilisateur modifie la sortie de l'IA avant de l'utiliser
# feedback_collector.py
def record_feedback(prompt_id, version, call_id, signal_type, value):
    '''
    signal_type: 'thumbs' | 'retry' | 'copy' | 'edit'
    value: for thumbs: 1 (up) or -1 (down); others: 1 (occurred)
    '''
    db.execute(
        'INSERT INTO prompt_feedback '
        '(prompt_id, version, call_id, signal_type, value, ts) '
        'VALUES (%s, %s, %s, %s, %s, NOW())',
        (prompt_id, version, call_id, signal_type, value)
    )

# Aggregate satisfaction score
def satisfaction_score(prompt_id, version):
    rows = db.fetch(
        'SELECT signal_type, AVG(value) as avg_val FROM prompt_feedback '
        'WHERE prompt_id=%s AND version=%s GROUP BY signal_type',
        (prompt_id, version)
    )
    return {r['signal_type']: round(r['avg_val'], 3) for r in rows}

Rapports de comparaison des versions

Lorsque vous évaluez la promotion ou le retour à la version précédente d'un déploiement canari, générez une comparaison côte à côte de toutes les métriques entre la nouvelle version et la référence. Ce rapport guide la décision de promotion.

def version_comparison_report(prompt_id, version_a, version_b, hours=48):
    stats_a = get_dashboard_stats_for_version(prompt_id, version_a, hours)
    stats_b = get_dashboard_stats_for_version(prompt_id, version_b, hours)

    print(f'=== Comparison: {version_a} vs {version_b} ===')
    metrics = ['avg_latency', 'p95_latency', 'avg_cost', 'avg_quality', 'error_rate']
    for m in metrics:
        va = stats_a.get(m, 0)
        vb = stats_b.get(m, 0)
        delta = vb - va
        pct = (delta / va * 100) if va else 0
        direction = '+' if delta > 0 else ''
        print(f'{m:20s}: {va:.4f} -> {vb:.4f}  ({direction}{pct:.1f}%)')

# Example output:
# avg_latency         : 1234.5000 -> 1189.2000  (-3.7%)
# p95_latency         : 3210.0000 -> 3050.0000  (-5.0%)
# avg_cost            : 0.000240 -> 0.000255  (+6.2%)
# avg_quality         : 4.1000 -> 4.3000  (+4.9%)
# error_rate          : 0.0120 -> 0.0080  (-33.3%)

Vérification rapide

Vous souhaitez détecter automatiquement les régressions de qualité sans vérifier manuellement les tableaux de bord. Quelle approche permet le mieux d'y parvenir ?

Résumé de la surveillance

La surveillance des invites en production nécessite le suivi de cinq dimensions pour chaque version :

  • Latence (P50/P95/P99) — expérience utilisateur
  • Coût par appel — santé financière
  • Score de qualité — échantillonnage automatisé avec un LLM comme juge
  • Taux d'erreur — fiabilité
  • Satisfaction des utilisateurs — évaluation par pouce, nouvelles tentatives, signaux de copie

Stockez les métriques dans une base de données de séries temporelles, visualisez-les dans des tableaux de bord et déclenchez des alertes lorsque les seuils sont dépassés. Les rapports de comparaison des versions éclairent les décisions de promotion et de retour à la version précédente.

Questions Fréquemment Posées

La leçon « Surveiller les performances des prompts en production » est-elle gratuite ?

Oui — le texte complet de « Surveiller les performances des prompts en production » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Surveiller les performances des prompts en production » ?

Suivez la latence, le coût, les scores de qualité et les taux d’échec pour chaque version de prompt. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Surveiller les performances des prompts en production » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Architecture d’un registre de prompts
  2. Contrôle de version des prompts
  3. Stratégies de déploiement et de restauration
  4. Surveiller les performances des prompts en production
← Retour à AI Prompt Engineering