0Pricing
AI Prompt Engineering · Lezione

Test di regressione tra gli aggiornamenti dei modelli

Esecuzione delle suite di test durante l’aggiornamento da GPT-4 a GPT-4o o da Claude 3 a 3.5

Test di regressione tra gli aggiornamenti dei modelli è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Perché gli aggiornamenti dei modelli interrompono i prompt

I provider di LLM aggiornano regolarmente i propri modelli: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Ogni aggiornamento modifica il comportamento del modello: spesso migliora la maggior parte delle attività, ma può occasionalmente causare regressioni su prompt specifici.

Senza una suite di test, le regressioni restano invisibili finché gli utenti non le segnalano. Con una suite di test, rileva le regressioni entro pochi minuti dall'aggiornamento di un modello.

Il problema degli aggiornamenti dei modelli

Gli aggiornamenti dei modelli possono causare tre tipi di cambiamenti:

  • Miglioramenti: i casi di test che prima non riuscivano ora hanno esito positivo; un risultato positivo
  • Neutri: il comportamento resta invariato; è il caso della maggior parte dei test
  • Regressioni: i casi di test che prima avevano esito positivo ora non riescono; è necessario indagare

Anche un tasso di regressione dell'1% è significativo: se dispone di 200 casi di test e 2 iniziano a non riuscire dopo un aggiornamento del modello, quei 2 casi potrebbero riguardare i suoi casi d'uso più importanti.

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

Esecuzione della suite di test su un nuovo modello

Quando viene annunciata una nuova versione del modello, esegua la suite di test completa sia sul modello precedente sia su quello nuovo. Confronti i tassi di superamento e individui quali casi di test specifici hanno modificato il proprio comportamento.

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%}')

Confronto dei risultati tra versioni del modello

Dopo aver eseguito entrambe le suite, individui i casi il cui stato è cambiato: superato → non superato (regressioni) e non superato → superato (miglioramenti).

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)

Tracciamento della versione del modello nei log dei test

Il log di ogni esecuzione dei test deve includere l'identificatore esatto del modello, non solo 'gpt-4o', ma la stringa completa con la versione 'gpt-4o-2024-11-20'. OpenAI e Anthropic aggiornano frequentemente il modello alla base di un alias, ad esempio 'gpt-4o', senza modificare il nome dell'alias; per questo il log è essenziale per eseguire il debug del comportamento storico.

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)
    }

Analisi delle regressioni

Quando viene rilevata una regressione, svolga un'analisi prima di aggiornare il prompt. Si chieda: il prompt è peggiorato oppure il modello è migliorato in un modo che ne ha modificato il comportamento?

Esempio: il successore di GPT-4o potrebbe seguire più rigorosamente le istruzioni sul formato, causando il fallimento di un test perché il vecchio test si aspettava un output leggermente non conforme. In questo caso, il modello è migliorato e deve essere aggiornato il test, non il prompt.

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

Quando aggiornare il prompt e quando il test

Dopo aver analizzato una regressione, scelga una delle tre azioni seguenti:

  • Aggiornare il prompt: il nuovo modello richiede una formulazione diversa delle istruzioni per ottenere lo stesso comportamento
  • Aggiornare il test: l'output previsto in precedenza era errato o subottimale; il nuovo output è effettivamente migliore
  • Accettare la regressione: il nuovo modello non riesce a svolgere questa attività in modo affidabile; utilizzi l'alias del modello precedente per questo caso d'uso
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.'
    }
}

Blocco delle versioni dei modelli

Quando un aggiornamento del modello causa regressioni inaccettabili, blocchi il modello sull'ID con versione precedente mentre svolge l'analisi. Non utilizzi un alias, ad esempio 'gpt-4o', in produzione: utilizzi sempre una versione specifica.

# 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',
}

Test di regressione automatizzati in CI

Esegua automaticamente la suite di test di regressione quando cambia la versione del modello nella configurazione. Utilizzi GitHub Actions o una CI simile per rilevare le regressioni prima della distribuzione.

# .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']

Gestione delle regressioni tra provider

I test di regressione si applicano anche quando si cambia provider: GPT-4o → Claude, Claude → Gemini. La stessa suite di test rivela quali prompt richiedono modifiche per adattarsi alle differenze di comportamento del nuovo provider.

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

Monitoraggio dell'andamento del tasso di superamento

Tracci l'andamento del tasso di superamento nel tempo leggendo la cronologia dei test. Una tendenza al ribasso segnala il deterioramento del prompt o una deriva del modello. Un calo improvviso segnala un evento di regressione, causato da un aggiornamento del modello o da una modifica del prompt.

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()

Verifica delle conoscenze

Quando una nuova versione del modello causa il fallimento di un test e l'analisi rivela che l'output del nuovo modello è effettivamente migliore di quello precedente, qual è l'azione corretta?

Riepilogo: test di regressione tra gli aggiornamenti dei modelli

Pratiche principali per i test di regressione quando i modelli vengono aggiornati:

  • Esegua la suite di test completa sia sul modello precedente sia su quello nuovo: confronti i tassi di superamento e le differenze tra i singoli fallimenti
  • Tracci la versione esatta del modello in ogni log dei test, non solo l'alias
  • Analizzi ogni regressione: è un problema del prompt, un problema del test o un limite delle capacità del modello?
  • Blocchi i modelli in produzione su ID con versioni specifiche, non su alias
  • Automatizzi il processo in CI: lo attivi quando cambiano la configurazione del modello o i file dei prompt

Nella prossima lezione: creazione di una suite completa di test dei prompt con il supporto degli strumenti.

Domande Frequenti

La lezione «Test di regressione tra gli aggiornamenti dei modelli» è gratuita?

Sì — il testo completo di «Test di regressione tra gli aggiornamenti dei modelli» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Test di regressione tra gli aggiornamenti dei modelli»?

Esecuzione delle suite di test durante l’aggiornamento da GPT-4 a GPT-4o o da Claude 3 a 3.5 Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Test di regressione tra gli aggiornamenti dei modelli»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Scrittura di casi di test per i prompt
  2. Test dei prompt basati su asserzioni
  3. Test di regressione tra gli aggiornamenti dei modelli
  4. Creazione di una suite di test per i prompt
← Torna a AI Prompt Engineering