Testy regresji po aktualizacji modelu
Uruchamianie zestawów testów podczas aktualizacji z GPT-4 do GPT-4o lub z Claude 3 do 3.5.
Testy regresji po aktualizacji modelu to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Dlaczego aktualizacje modeli powodują nieprawidłowe działanie promptów
Dostawcy LLM regularnie aktualizują swoje modele: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Każda aktualizacja zmienia zachowanie modelu — zwykle poprawiając działanie w większości zadań, ale czasem powodując regresję w przypadku konkretnych promptów.
Bez zestawu testów regresje pozostają niewidoczne, dopóki użytkownicy ich nie zgłoszą. Z zestawem testów można wykryć regresje w ciągu kilku minut od aktualizacji modelu.
Problem aktualizacji modeli
Aktualizacje modeli mogą powodować trzy rodzaje zmian:
- Ulepszenia: przypadki testowe, które wcześniej kończyły się niepowodzeniem, teraz przechodzą — dobrze
- Brak zmian: zachowanie pozostaje niezmienione — dotyczy większości testów
- Regresje: przypadki testowe, które wcześniej przechodziły, teraz kończą się niepowodzeniem — wymagają analizy
Nawet wskaźnik regresji na poziomie 1% ma znaczenie: jeśli ma Pan lub Pani 200 przypadków testowych i po aktualizacji modelu 2 zaczynają kończyć się niepowodzeniem, te 2 przypadki mogą dotyczyć najważniejszych zastosowań.
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 productionUruchamianie zestawu testów na nowym modelu
Po ogłoszeniu nowej wersji modelu uruchom pełny zestaw testów zarówno na starym, jak i na nowym modelu. Porównaj wskaźniki zaliczeń. Ustal, które konkretne przypadki testowe zmieniły swoje zachowanie.
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%}')Porównywanie wyników między wersjami modeli
Po uruchomieniu obu zestawów zidentyfikuj przypadki, w których zmienił się status: zaliczony → niezaliczony (regresje) oraz niezaliczony → zaliczony (ulepszenia).
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)Śledzenie wersji modelu w logach testów
Każdy log uruchomienia testów musi zawierać dokładny identyfikator modelu — nie tylko 'gpt-4o', ale pełny identyfikator wersji 'gpt-4o-2024-11-20'. OpenAI i Anthropic często aktualizują model stojący za aliasem (na przykład 'gpt-4o') bez zmiany nazwy aliasu, dlatego log jest niezbędny do analizowania historycznego zachowania.
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)
}Analizowanie regresji
Po wykryciu regresji należy przeprowadzić analizę przed aktualizacją promptu. Należy ustalić: czy prompt się pogorszył, czy model stał się lepszy w sposób, który zmienił jego zachowanie?
Przykład: następca GPT-4o może bardziej rygorystycznie stosować instrukcje dotyczące formatu, powodując niepowodzenie testu, ponieważ stary test oczekiwał wyniku, który nie był w pełni zgodny z wymaganiami. W takim przypadku model się poprawił, a aktualizacji wymaga test — nie 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 promptKiedy zaktualizować prompt, a kiedy test
Po przeanalizowaniu regresji należy wybrać jedno z trzech działań:
- Zaktualizować prompt: nowy model wymaga innego sformułowania instrukcji, aby uzyskać takie samo zachowanie
- Zaktualizować test: oczekiwany wcześniej wynik był nieprawidłowy lub nieoptymalny; nowy wynik jest w rzeczywistości lepszy
- Zaakceptować regresję: nowy model nie potrafi niezawodnie wykonać tego zadania; w tym zastosowaniu należy używać aliasu starego modelu
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.'
}
}Przypinanie wersji modeli
Gdy aktualizacja modelu powoduje niedopuszczalne regresje, przypnij model do poprzedniego identyfikatora wersji na czas analizy. W środowisku produkcyjnym nie używaj aliasu (na przykład 'gpt-4o') — zawsze używaj konkretnej wersji.
# 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',
}Automatyczna regresja w CI
Uruchamiaj zestaw testów regresyjnych automatycznie, gdy zmieni się wersja modelu w konfiguracji. Użyj GitHub Actions lub podobnego systemu CI, aby wykrywać regresje przed wdrożeniem.
# .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']Obsługa regresji między dostawcami
Testowanie regresji ma zastosowanie również podczas zmiany dostawcy: GPT-4o → Claude, Claude → Gemini. Ten sam zestaw testów ujawnia, które prompty wymagają zmian ze względu na różnice w zachowaniu nowego dostawcy.
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_resultsMonitorowanie trendów wskaźnika zaliczeń
Twórz wykres wskaźnika zaliczeń w czasie na podstawie historii testów. Trend spadkowy sygnalizuje pogorszenie promptu lub dryf modelu. Nagły spadek sygnalizuje zdarzenie regresji, takie jak aktualizacja modelu lub zmiana promptu.
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()Sprawdzenie wiedzy
Gdy nowa wersja modelu powoduje niepowodzenie testu, a analiza wykazuje, że wynik nowego modelu jest w rzeczywistości lepszy od starego wyniku, jakie działanie należy podjąć?
Podsumowanie: testowanie regresji przy aktualizacjach modeli
Najważniejsze praktyki testowania regresji podczas aktualizacji modeli:
- Uruchamiaj pełny zestaw testów na starym i nowym modelu — porównuj wskaźniki zaliczeń i analizuj różnice w konkretnych przypadkach zakończonych niepowodzeniem
- Śledź dokładną wersję modelu w każdym logu testów — nie tylko alias
- Analizuj każdą regresję: czy problem dotyczy promptu, testu czy możliwości modelu?
- Przypinaj modele w środowisku produkcyjnym do konkretnych identyfikatorów wersji, a nie aliasów
- Automatyzuj testy w CI — uruchamiaj je po zmianie konfiguracji modelu lub pliku promptu
Następna lekcja: tworzenie kompletnego zestawu testów promptów przy użyciu narzędzi.
Często zadawane pytania
Czy lekcja „Testy regresji po aktualizacji modelu” jest bezpłatna?
Tak — pełny tekst „Testy regresji po aktualizacji modelu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Testy regresji po aktualizacji modelu”?
Uruchamianie zestawów testów podczas aktualizacji z GPT-4 do GPT-4o lub z Claude 3 do 3.5. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Testy regresji po aktualizacji modelu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Pisanie przypadków testowych promptów
- Testowanie promptów oparte na asercjach
- Testy regresji po aktualizacji modelu
- Tworzenie zestawu testów promptów