Regressiotestaus mallipäivitysten yhteydessä
Testisarjojen suorittaminen, kun GPT-4 päivitetään GPT-4o:hon tai Claude 3 Claude 3.5:een
Regressiotestaus mallipäivitysten yhteydessä on ilmainen Tekoälyn prompt engineering-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Tekoälyn prompt engineering-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Miksi mallipäivitykset rikkovat promptit
LLM-palveluntarjoajat päivittävät mallejaan säännöllisesti: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Jokainen päivitys muuttaa mallin toimintaa. Useimmat tehtävät paranevat, mutta joidenkin tiettyjen promptien kohdalla suorituskyky voi toisinaan heikentyä.
Ilman testikokonaisuutta regressiot pysyvät piilossa, kunnes käyttäjät ilmoittavat niistä. Testikokonaisuuden avulla regressiot havaitaan muutamassa minuutissa mallipäivityksen jälkeen.
Mallipäivitysten ongelma
Mallipäivitykset voivat aiheuttaa kolmenlaisia muutoksia:
- Parannukset: aiemmin epäonnistuneet testitapaukset läpäistään nyt – hyvä
- Neutraalit muutokset: toiminta pysyy ennallaan – koskee useimpia testejä
- Regressiot: aiemmin läpäistyt testitapaukset epäonnistuvat nyt – tutkittava
Jo yhden prosentin regressioaste on merkittävä: jos testitapauksia on 200 ja mallipäivityksen jälkeen kaksi alkaa epäonnistua, nämä kaksi voivat liittyä tärkeimpiin käyttötapauksiinne.
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 productionTestikokonaisuuden suorittaminen uudella mallilla
Kun uusi malliversio julkistetaan, suorittakaa koko testikokonaisuus sekä vanhalla että uudella mallilla. Verratkaa läpäisyasteita. Selvittäkää, mitkä yksittäiset testitapaukset käyttäytyivät eri tavalla.
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%}')Malliversioiden välisten tulosten vertailu
Kun molemmat testikokonaisuudet on suoritettu, etsikää tapaukset, joiden tila muuttui: läpäisty → epäonnistunut (regressiot) ja epäonnistunut → läpäisty (parannukset).
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)Malliversion kirjaaminen testilokeihin
Jokaisen testiajon lokiin on sisällytettävä tarkka mallin tunniste – ei vain "gpt-4o", vaan koko versioitu merkkijono "gpt-4o-2024-11-20". OpenAI ja Anthropic päivittävät usein aliaksen taustalla olevan mallin (esimerkiksi "gpt-4o") muuttamatta aliaksen nimeä, joten loki on välttämätön aiemman toiminnan virheenkorjauksessa.
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)
}Regressioiden tutkiminen
Kun regressio havaitaan, tutkikaa se ennen promptin päivittämistä. Kysykää: heikkenikö prompti vai paraniko malli tavalla, joka muutti sen toimintaa?
Esimerkiksi GPT-4o:n seuraaja saattaa noudattaa muotoiluohjeita aiempaa tarkemmin, jolloin testi epäonnistuu, koska vanha testi odotti hieman vaatimustenvastaista tulosta. Tässä tapauksessa malli parani ja testiä pitää päivittää – ei promptia.
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 promptMilloin päivittää promptia ja milloin testiä
Valitkaa regressiotutkimuksen jälkeen yksi kolmesta toimenpiteestä:
- Päivittäkää prompti: uusi malli vaatii erilaisen ohjeistuksen, jotta sama toiminta saavutetaan
- Päivittäkää testi: vanha odotettu tulos oli virheellinen tai epäoptimaalinen; uusi tulos on tosiasiassa parempi
- Hyväksykää regressio: uusi malli ei pysty suorittamaan tehtävää luotettavasti; käyttäkää tässä käyttötapauksessa vanhaa mallialiasta
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.'
}
}Malliversioiden kiinnittäminen
Kun mallipäivitys aiheuttaa hyväksymättömiä regressioita, kiinnittäkää malli aiempaan versioituun tunnisteeseen tutkimuksen ajaksi. Älkää käyttäkö tuotannossa aliasta (esimerkiksi "gpt-4o"), vaan aina tiettyä versiota.
# 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',
}Automaattinen regressiotestaus CI:ssä
Suorittakaa regressiotestikokonaisuus automaattisesti, kun malliversio muuttuu asetustiedostossa. Käyttäkää GitHub Actionsia tai vastaavaa CI-järjestelmää regressioiden havaitsemiseen ennen käyttöönottoa.
# .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']Palveluntarjoajien välisten regressioiden käsittely
Regressiotestausta tarvitaan myös palveluntarjoajaa vaihdettaessa: GPT-4o → Claude, Claude → Gemini. Sama testikokonaisuus paljastaa, mitkä promptit vaativat muutoksia uuden palveluntarjoajan erilaisen toiminnan vuoksi.
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_resultsLäpäisyasteen kehityksen seuranta
Piirtäkää läpäisyaste ajan funktiona lukemalla tiedot testihistorialokista. Laskeva trendi viittaa promptin laadun heikkenemiseen tai mallin toiminnan muuttumiseen. Äkillinen pudotus viittaa regressiotapahtumaan, jonka on aiheuttanut mallipäivitys tai promptin muutos.
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()Tietotesti
Kun uusi malliversio aiheuttaa testin epäonnistumisen ja tutkimuksessa selviää, että uuden mallin tulos on itse asiassa parempi kuin vanha tulos, mikä on oikea toimenpide?
Kertaus: regressiotestaus mallipäivitysten välillä
Mallien päivittyessä regressiotestauksen keskeiset käytännöt ovat seuraavat:
- Suorittakaa koko testikokonaisuus sekä vanhalla että uudella mallilla – verratkaa läpäisyasteita ja yksittäisiä epäonnistumisia
- Kirjatkaa tarkka malliversio jokaiseen testilokiin – ei vain aliasta
- Tutkikaa jokainen regressio: onko kyse prompt-ongelmasta, testi-ongelmasta vai mallin kyvykkyyteen liittyvästä ongelmasta?
- Kiinnittäkää tuotantomallit tiettyihin versioituihin tunnisteisiin, ei aliaksiin
- Automatisoikaa CI:ssä – käynnistäkää testit malliasetusten tai prompt-tiedostojen muuttuessa
Seuraava oppitunti: täydellisen prompt-testikokonaisuuden rakentaminen työkaluja hyödyntäen.
Opi Tekoälyn prompt engineering tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 53
- Oppitunnit
- 199
Usein kysytyt kysymykset
Onko oppitunti ”Regressiotestaus mallipäivitysten yhteydessä” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Tekoälyn prompt engineering-oppimispolun 3 oppituntia, myös oppitunnin “Regressiotestaus mallipäivitysten yhteydessä”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Regressiotestaus mallipäivitysten yhteydessä”?
Testisarjojen suorittaminen, kun GPT-4 päivitetään GPT-4o:hon tai Claude 3 Claude 3.5:een Harjoittelet Tekoälyn prompt engineering-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyn prompt engineering-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyn prompt engineering-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Regressiotestaus mallipäivitysten yhteydessä”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyn prompt engineering-oppitunnilla?
Kyllä. Jokainen Tekoälyn prompt engineering-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Kehotteiden testitapausten kirjoittaminen
- Väitteisiin perustuva kehotteiden testaus
- Regressiotestaus mallipäivitysten yhteydessä
- Kehotteiden testisarjan rakentaminen