0Pricing
AI Prompt Engineering · Leçon

Tests de régression lors des mises à jour des modèles

Exécutez les suites de tests lors du passage de GPT-4 à GPT-4o ou de Claude 3 à 3.5.

Tests de régression lors des mises à jour des modèles est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 3 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 les mises à jour des modèles perturbent les instructions

Les fournisseurs de LLM mettent régulièrement leurs modèles à jour : GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Chaque mise à jour modifie le comportement du modèle : elle améliore souvent la plupart des tâches, mais peut parfois provoquer une régression pour certaines instructions.

Sans suite de vérifications, les régressions restent invisibles jusqu’à ce que les utilisateurs les signalent. Avec une suite de vérifications, vous détectez les régressions en quelques minutes après une mise à jour du modèle.

Le problème des mises à jour des modèles

Les mises à jour des modèles peuvent entraîner trois types de changements :

  • Améliorations : des cas de vérification qui échouaient auparavant réussissent désormais — c’est positif
  • Neutres : le comportement reste inchangé — c’est le cas de la plupart des vérifications
  • Régressions : des cas de vérification qui réussissaient auparavant échouent désormais — il faut enquêter

Même un taux de régression de 1 % est significatif : si vous avez 200 cas de vérification et que 2 commencent à échouer après une mise à jour du modèle, ces 2 cas correspondent peut-être à vos utilisations les plus critiques.

MODEL_HISTORY = [
    {'model': 'gpt-4', 'deployed': '2023-03-14', 'pass_rate': 0.87},
    {'model': 'gpt-4-turbo', 'deployed': '2023-11-06', 'pass_rate': 0.91},
    {'model': 'gpt-4o', 'deployed': '2024-05-13', 'pass_rate': 0.93},
    {'model': 'gpt-4o-2024-11-20', 'deployed': '2024-11-20', 'pass_rate': None},  # to be measured
]

# Goal: measure pass_rate for the new model before deploying to production

Exécuter la suite de vérifications sur un nouveau modèle

Lorsqu’une nouvelle version de modèle est annoncée, exécutez votre suite complète de vérifications avec l’ancien et le nouveau modèle. Comparez les taux de réussite. Identifiez les cas précis dont le comportement a changé.

import openai
client = openai.OpenAI(api_key='sk-...')

def run_suite_on_model(test_cases, system_prompt, model):
    results = []
    for test in test_cases:
        resp = client.chat.completions.create(
            model=model,
            messages=[
                {'role': 'system', 'content': system_prompt},
                {'role': 'user', 'content': test['input']}
            ],
            temperature=0
        )
        output = resp.choices[0].message.content
        passed = test['evaluator'](output)
        results.append({'id': test['id'], 'passed': passed, 'output': output})
    pass_rate = sum(r['passed'] for r in results) / len(results)
    return results, pass_rate

old_results, old_rate = run_suite_on_model(TEST_CASES, PROMPT, 'gpt-4o')
new_results, new_rate = run_suite_on_model(TEST_CASES, PROMPT, 'gpt-4o-2024-11-20')
print(f'Old: {old_rate:.1%} | New: {new_rate:.1%} | Delta: {(new_rate-old_rate):+.1%}')

Comparer les résultats entre les versions d’un modèle

Après avoir exécuté les deux suites, identifiez les cas dont le statut a changé : réussite → échec (régressions) et échec → réussite (améliorations).

def diff_results(old_results, new_results):
    old_by_id = {r['id']: r for r in old_results}
    new_by_id = {r['id']: r for r in new_results}

    regressions = []
    improvements = []

    for test_id, new_r in new_by_id.items():
        old_r = old_by_id.get(test_id)
        if old_r is None:
            continue
        if old_r['passed'] and not new_r['passed']:
            regressions.append({'id': test_id, 'old_output': old_r['output'], 'new_output': new_r['output']})
        elif not old_r['passed'] and new_r['passed']:
            improvements.append({'id': test_id})

    print(f'Regressions: {len(regressions)}')
    print(f'Improvements: {len(improvements)}')
    for reg in regressions:
        print(f'  REGRESSED: {reg["id"]}')
        print(f'    Old: {reg["old_output"][:60]}')
        print(f'    New: {reg["new_output"][:60]}')
    return regressions, improvements

regressions, improvements = diff_results(old_results, new_results)

Suivre la version du modèle dans les journaux de vérification

Le journal de chaque exécution de vérification doit inclure l’identifiant exact du modèle, et pas seulement « gpt-4o », mais la chaîne complète incluant la version, « gpt-4o-2024-11-20 ». OpenAI et Anthropic mettent fréquemment à jour le modèle associé à un alias (par exemple « gpt-4o ») sans modifier le nom de l’alias ; le journal est donc essentiel pour déboguer les comportements historiques.

import openai, json
from datetime import datetime, timezone

client = openai.OpenAI(api_key='sk-...')

def run_test_with_version_tracking(test, system_prompt, model_alias):
    resp = client.chat.completions.create(
        model=model_alias,
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': test['input']}
        ],
        temperature=0
    )
    output = resp.choices[0].message.content
    return {
        'test_id': test['id'],
        'model_alias': model_alias,
        'model_actual': resp.model,  # The exact versioned model ID returned by the API
        'timestamp': datetime.now(timezone.utc).isoformat(),
        'output': output,
        'passed': test['evaluator'](output)
    }

Enquêter sur les régressions

Lorsqu’une régression est détectée, enquêtez avant de mettre à jour l’instruction. Demandez-vous si l’instruction est devenue moins bonne ou si le modèle s’est amélioré d’une manière qui a modifié son comportement.

Exemple : le successeur de GPT-4o pourrait suivre les consignes de format plus strictement, ce qui ferait échouer une vérification parce que l’ancienne vérification attendait une sortie légèrement non conforme. Dans ce cas, le modèle s’est amélioré et c’est la vérification qu’il faut mettre à jour, pas l’instruction.

def investigate_regression(test_id, old_output, new_output, prompt, user_input):
    # Step 1: check if old behavior was actually wrong
    judge_prompt = (
        f'Given this task prompt: {prompt}\n'
        f'And this user input: {user_input}\n\n'
        f'Which output is better?\n'
        f'A) {old_output}\n'
        f'B) {new_output}\n\n'
        'Reply with A or B and one sentence explanation.'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': judge_prompt}],
        temperature=0
    )
    verdict = resp.choices[0].message.content
    print(f'Judge verdict for {test_id}: {verdict}')
    # If judge says B (new output) is better: update the test, not the prompt

Quand mettre à jour l’instruction plutôt que la vérification

Après avoir enquêté sur une régression, choisissez l’une des trois actions suivantes :

  • Mettre à jour l’instruction : le nouveau modèle nécessite une formulation différente des consignes pour obtenir le même comportement
  • Mettre à jour la vérification : la sortie attendue précédente était incorrecte ou sous-optimale ; la nouvelle sortie est en réalité meilleure
  • Accepter la régression : le nouveau modèle ne peut pas réaliser cette tâche de manière fiable ; utilisez l’ancien alias de modèle pour ce cas d’usage
REGRESSION_ACTIONS = {
    'prompt_updated': {
        'when': 'New model ignores instruction the old model followed. Same behavior needed.',
        'action': 'Add stronger/rephrased instruction. Re-run tests on new model.'
    },
    'test_updated': {
        'when': 'New model output is objectively better but fails old test criteria.',
        'action': 'Update expected output in test. Document the improvement.'
    },
    'model_pinned': {
        'when': 'New model cannot perform this task reliably despite prompt changes.',
        'action': 'Pin the model alias to the old versioned ID for this endpoint.'
    }
}

Épingler les versions des modèles

Lorsqu’une mise à jour du modèle entraîne des régressions inacceptables, épinglez le modèle à l’ID de la version précédente pendant votre enquête. N’utilisez pas d’alias (par exemple « gpt-4o ») en production : utilisez toujours une version précise.

# Bad practice: alias can point to different model versions over time
client.chat.completions.create(
    model='gpt-4o',  # could be any version at any time
    messages=[...]
)

# Good practice: pin to a specific version for production
client.chat.completions.create(
    model='gpt-4o-2024-11-20',  # guaranteed behavior
    messages=[...]
)

# Track in config
MODEL_CONFIG = {
    'sentiment_classifier': 'gpt-4o-2024-11-20',
    'code_generator': 'gpt-4o-2024-11-20',
    'summarizer': 'gpt-4o-mini-2024-07-18',
}

Régression automatisée dans l’intégration continue

Exécutez automatiquement la suite de vérifications de régression lorsque la version du modèle indiquée dans votre configuration change. Utilisez GitHub Actions ou un outil CI similaire pour détecter les régressions avant le déploiement.

# .github/workflows/prompt_regression.yml (YAML, shown as comment)
# name: Prompt Regression Tests
# on:
#   push:
#     paths:
#       - 'config/models.json'  # triggers when model version changes
#       - 'prompts/*.txt'       # triggers when prompts change
# jobs:
#   test:
#     runs-on: ubuntu-latest
#     steps:
#       - uses: actions/checkout@v4
#       - name: Install dependencies
#         run: pip install pytest openai jsonschema
#       - name: Run prompt test suite
#         run: pytest tests/prompts/ -v --junitxml=results.xml
#         env:
#           OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

# In Python: read model version from config
import json
with open('config/models.json') as f:
    MODEL_CONFIG = json.load(f)
MODEL = MODEL_CONFIG['sentiment_classifier']

Gérer les régressions entre fournisseurs

La vérification des régressions s’applique également lors d’un changement de fournisseur : GPT-4o → Claude, Claude → Gemini. La même suite de vérifications révèle quelles instructions doivent être modifiées pour tenir compte des différences de comportement du nouveau fournisseur.

def cross_provider_test(test_cases, system_prompt, providers):
    all_results = {}
    for provider, config in providers.items():
        results, rate = run_suite_on_model(
            test_cases, system_prompt, model=config['model']
        )
        all_results[provider] = {'rate': rate, 'results': results}
        print(f'{provider}: {rate:.1%}')

    # Find cases that fail on one provider but not another
    for test in test_cases:
        outcomes = {
            p: next(r for r in all_results[p]['results'] if r['id'] == test['id'])['passed']
            for p in providers
        }
        if not all(outcomes.values()):
            failing = [p for p, passed in outcomes.items() if not passed]
            print(f'  {test["id"]}: FAILS on {failing}')

    return all_results

Suivre l’évolution du taux de réussite

Tracez le taux de réussite au fil du temps en lisant le journal historique des vérifications. Une tendance à la baisse indique une dégradation de l’instruction ou une dérive du modèle. Une chute soudaine signale un événement de régression, tel qu’une mise à jour du modèle ou une modification de l’instruction.

import json

def plot_pass_rate_trend(history_file='test_history.jsonl'):
    runs = []
    with open(history_file) as f:
        for line in f:
            runs.append(json.loads(line))

    runs.sort(key=lambda r: r['run_id'])

    print('Pass rate trend:')
    for run in runs[-10:]:  # last 10 runs
        bar = '#' * int(run['pass_rate'] * 40)
        print(f"{run['run_id'][:10]} {run['model']:30} {run['pass_rate']:.0%} |{bar}|")

    # Detect regression
    if len(runs) >= 2:
        delta = runs[-1]['pass_rate'] - runs[-2]['pass_rate']
        if delta < -0.05:
            print(f'ALERT: pass rate dropped {delta:.0%} since last run!')

plot_pass_rate_trend()

Vérification des connaissances

Lorsqu’une nouvelle version du modèle fait échouer une vérification, mais que l’enquête révèle que la sortie du nouveau modèle est en réalité meilleure que l’ancienne, quelle est l’action correcte ?

Récapitulatif : vérification des régressions lors des mises à jour des modèles

Principales pratiques de vérification des régressions lors des mises à jour des modèles :

  • Exécutez la suite complète de vérifications sur l’ancien et le nouveau modèle — comparez les taux de réussite et comparez les échecs précis
  • Suivez la version exacte du modèle dans chaque journal de vérification, et pas seulement l’alias
  • Enquêtez sur chaque régression : s’agit-il d’un problème d’instruction, de vérification ou de capacité du modèle ?
  • Épinglez les modèles en production sur des ID de version précis, et non sur des alias
  • Automatisez dans l’intégration continue — déclenchez les vérifications lors des modifications de la configuration du modèle ou du fichier d’instruction

Prochaine leçon : créer une suite complète de vérifications d’instructions avec l’aide d’outils.

Questions Fréquemment Posées

La leçon « Tests de régression lors des mises à jour des modèles » est-elle gratuite ?

Oui — le texte complet de « Tests de régression lors des mises à jour des modèles » 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 « Tests de régression lors des mises à jour des modèles » ?

Exécutez les suites de tests lors du passage de GPT-4 à GPT-4o ou de Claude 3 à 3.5. 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 3 sur 4.

Combien de temps prend la leçon « Tests de régression lors des mises à jour des modèles » ?

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. Rédiger des cas de test pour les prompts
  2. Tester les prompts par assertions
  3. Tests de régression lors des mises à jour des modèles
  4. Créer une suite de tests pour les prompts
← Retour à AI Prompt Engineering