Regressionstests über Modellaktualisierungen hinweg
Testsuites ausführen, wenn Sie von GPT-4 auf GPT-4o oder von Claude 3 auf 3.5 aktualisieren.
Regressionstests über Modellaktualisierungen hinweg ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Warum Modellaktualisierungen Prompts beeinträchtigen
LLM-Anbieter aktualisieren ihre Modelle regelmäßig: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Jede Aktualisierung verändert das Verhalten des Modells — häufig werden die meisten Aufgaben besser gelöst, bei bestimmten Prompts kann es jedoch gelegentlich zu Regressionen kommen.
Ohne Testsuite bleiben Regressionen unsichtbar, bis Benutzer sie melden. Mit einer Testsuite erkennen Sie Regressionen innerhalb von Minuten nach einer Modellaktualisierung.
Das Problem mit Modellaktualisierungen
Modellaktualisierungen können drei Arten von Änderungen verursachen:
- Verbesserungen: Zuvor fehlgeschlagene Testfälle bestehen nun — gut
- Neutral: Das Verhalten bleibt unverändert — die meisten Tests
- Regressionen: Zuvor erfolgreiche Testfälle schlagen nun fehl — muss untersucht werden
Selbst eine Regressionsrate von 1 % ist erheblich: Wenn Sie 200 Testfälle haben und nach einer Modellaktualisierung 2 fehlschlagen, gehören diese 2 möglicherweise zu Ihren wichtigsten Anwendungsfällen.
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 productionTestsuite mit einem neuen Modell ausführen
Wenn eine neue Modellversion angekündigt wird, führen Sie Ihre vollständige Testsuite sowohl mit dem alten als auch mit dem neuen Modell aus. Vergleichen Sie die Erfolgsquoten. Ermitteln Sie, bei welchen konkreten Testfällen sich das Verhalten geändert hat.
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%}')Ergebnisse zwischen Modellversionen vergleichen
Ermitteln Sie nach der Ausführung beider Testsuites die Fälle, deren Status sich geändert hat: bestanden → fehlgeschlagen (Regressionen) und fehlgeschlagen → bestanden (Verbesserungen).
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)Modellversion in Testprotokollen erfassen
Jedes Testlaufprotokoll muss die genaue Modellkennung enthalten — nicht nur „gpt-4o“, sondern die vollständige Version „gpt-4o-2024-11-20“. OpenAI und Anthropic aktualisieren das Modell hinter einem Alias (z. B. „gpt-4o“) häufig, ohne den Aliasnamen zu ändern. Dadurch wird das Protokoll für die Analyse historischen Verhaltens unverzichtbar.
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)
}Regressionen untersuchen
Wenn eine Regression gefunden wird, untersuchen Sie sie, bevor Sie den Prompt aktualisieren. Fragen Sie: Ist der Prompt schlechter geworden, oder ist das Modell auf eine Weise besser geworden, die das Verhalten verändert hat?
Beispiel: Der Nachfolger von GPT-4o befolgt möglicherweise Formatvorgaben strenger, sodass ein Test fehlschlägt, weil der alte Test eine leicht inkompatible Ausgabe erwartet hat. In diesem Fall hat sich das Modell verbessert und der Test muss aktualisiert werden — nicht der 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 promptWann Sie den Prompt und wann Sie den Test aktualisieren
Wählen Sie nach der Untersuchung einer Regression eine von drei Maßnahmen:
- Den Prompt aktualisieren: Das neue Modell benötigt eine andere Formulierung der Anweisungen, um dasselbe Verhalten zu erzielen
- Den Test aktualisieren: Die alte erwartete Ausgabe war falsch oder suboptimal; die neue Ausgabe ist tatsächlich besser
- Die Regression akzeptieren: Das neue Modell kann diese Aufgabe nicht zuverlässig ausführen; verwenden Sie für diesen Anwendungsfall den alten Modellalias
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.'
}
}Modellversionen festschreiben
Wenn eine Modellaktualisierung zu nicht akzeptablen Regressionen führt, legen Sie das Modell während der Untersuchung auf die vorherige versionierte ID fest. Verwenden Sie in der Produktion keinen Alias (z. B. „gpt-4o“) — nutzen Sie immer eine bestimmte Version.
# 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',
}Automatisierte Regressionstests in CI
Führen Sie die Regressionstestsuite automatisch aus, wenn sich die Modellversion in Ihrer Konfiguration ändert. Verwenden Sie GitHub Actions oder eine ähnliche CI-Lösung, um Regressionen vor der Bereitstellung zu erkennen.
# .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']Umgang mit anbieterübergreifenden Regressionen
Regressionstests gelten auch beim Wechsel des Anbieters: GPT-4o → Claude, Claude → Gemini. Dieselbe Testsuite zeigt, für welche Prompts aufgrund der unterschiedlichen Verhaltensweisen des neuen Anbieters Änderungen erforderlich sind.
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_resultsTrends der Erfolgsquote überwachen
Stellen Sie die Erfolgsquote im Zeitverlauf dar, indem Sie die Testverlaufsprotokolle auslesen. Ein sinkender Trend weist auf eine Verschlechterung des Prompts oder ein Driftverhalten des Modells hin. Ein plötzlicher Abfall signalisiert ein Regressionsevent (Modellaktualisierung oder Promptänderung).
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()Wissensüberprüfung
Wenn eine neue Modellversion einen Test fehlschlagen lässt und die Untersuchung ergibt, dass die Ausgabe des neuen Modells tatsächlich besser ist als die alte Ausgabe, welche Maßnahme ist dann richtig?
Zusammenfassung: Regressionstests bei Modellaktualisierungen
Wichtige Vorgehensweisen für Regressionstests bei Modellaktualisierungen:
- Die vollständige Testsuite mit dem alten und dem neuen Modell ausführen — Erfolgsquoten vergleichen und konkrete Fehler vergleichen
- Die genaue Modellversion erfassen — in jedem Testprotokoll, nicht nur den Alias
- Jede Regression untersuchen: Liegt ein Problem mit dem Prompt, dem Test oder den Modellfähigkeiten vor?
- Modelle in der Produktion festschreiben — auf bestimmte versionierte IDs, nicht auf Aliase
- In CI automatisieren — bei Änderungen an der Modellkonfiguration oder Prompt-Datei auslösen
Nächste Lektion: Eine vollständige Prompt-Testsuite mit Tool-Unterstützung erstellen.
Häufig gestellte Fragen
Ist die Lektion „Regressionstests über Modellaktualisierungen hinweg“ kostenlos?
Ja — der vollständige Text von „Regressionstests über Modellaktualisierungen hinweg“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Regressionstests über Modellaktualisierungen hinweg“?
Testsuites ausführen, wenn Sie von GPT-4 auf GPT-4o oder von Claude 3 auf 3.5 aktualisieren. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Regressionstests über Modellaktualisierungen hinweg“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Prompt-Testfälle schreiben
- Assertion-basiertes Prompt-Testing
- Regressionstests über Modellaktualisierungen hinweg
- Eine Prompt-Testsuite erstellen