Pengujian Regresi pada Pembaruan Model
Jalankan rangkaian pengujian saat melakukan peningkatan dari GPT-4 ke GPT-4o atau dari Claude 3 ke 3.5.
Pengujian Regresi pada Pembaruan Model adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Mengapa Pembaruan Model Merusak Prompt
Penyedia LLM memperbarui model mereka secara berkala: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Setiap pembaruan mengubah perilaku model—sering kali meningkatkan sebagian besar tugas, tetapi sesekali menyebabkan regresi pada prompt tertentu.
Tanpa rangkaian pengujian, regresi tidak terlihat sampai pengguna melaporkannya. Dengan rangkaian pengujian, Anda dapat mendeteksi regresi dalam hitungan menit setelah pembaruan model.
Masalah Pembaruan Model
Pembaruan model dapat menyebabkan tiga jenis perubahan:
- Peningkatan: kasus pengujian yang sebelumnya gagal kini berhasil—bagus
- Netral: perilaku tidak berubah—sebagian besar pengujian
- Regresi: kasus pengujian yang sebelumnya berhasil kini gagal—harus diselidiki
Bahkan tingkat regresi 1% pun signifikan: jika Anda memiliki 200 kasus pengujian dan 2 mulai gagal setelah pembaruan model, kedua kasus tersebut mungkin merupakan kasus penggunaan Anda yang paling penting.
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 productionMenjalankan Rangkaian Pengujian pada Model Baru
Saat versi model baru diumumkan, jalankan seluruh rangkaian pengujian pada model lama dan baru. Bandingkan tingkat keberhasilannya. Identifikasi kasus pengujian tertentu yang perilakunya berubah.
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%}')Membandingkan Hasil Antarversi Model
Setelah menjalankan kedua rangkaian, identifikasi kasus yang statusnya berubah: berhasil → gagal (regresi) dan gagal → berhasil (peningkatan).
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)Melacak Versi Model dalam Log Pengujian
Log setiap proses pengujian harus menyertakan pengenal model yang tepat—bukan hanya 'gpt-4o', melainkan string versi lengkap 'gpt-4o-2024-11-20'. OpenAI dan Anthropic sering memperbarui model di balik alias (misalnya, 'gpt-4o') tanpa mengubah nama alias, sehingga log sangat penting untuk men-debug perilaku historis.
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)
}Menyelidiki Regresi
Saat regresi ditemukan, lakukan penyelidikan sebelum memperbarui prompt. Tanyakan: apakah prompt menjadi lebih buruk, atau model menjadi lebih baik dengan cara yang mengubah perilaku?
Contoh: penerus GPT-4o mungkin mengikuti instruksi format dengan lebih ketat, sehingga pengujian gagal karena pengujian lama mengharapkan keluaran yang sedikit tidak sesuai. Dalam hal ini, modelnya membaik dan pengujian yang perlu diperbarui—bukan prompt-nya.
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 promptKapan Memperbarui Prompt atau Pengujian
Setelah menyelidiki regresi, pilih salah satu dari tiga tindakan berikut:
- Perbarui prompt: model baru memerlukan susunan instruksi yang berbeda untuk mencapai perilaku yang sama
- Perbarui pengujian: keluaran yang diharapkan sebelumnya salah atau kurang optimal; keluaran baru sebenarnya lebih baik
- Terima regresi: model baru tidak dapat melakukan tugas ini secara andal; gunakan alias model lama untuk kasus penggunaan ini
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.'
}
}Mengunci Versi Model
Saat pembaruan model menyebabkan regresi yang tidak dapat diterima, kunci model pada ID versi sebelumnya selama Anda melakukan penyelidikan. Jangan gunakan alias (misalnya, 'gpt-4o') untuk produksi—selalu gunakan versi tertentu.
# 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',
}Regresi Otomatis dalam CI
Jalankan rangkaian pengujian regresi secara otomatis saat versi model dalam konfigurasi Anda berubah. Gunakan GitHub Actions atau CI serupa untuk mendeteksi regresi sebelum penerapan.
# .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']Menangani Regresi Lintas Penyedia
Pengujian regresi juga berlaku saat berpindah penyedia: GPT-4o → Claude, Claude → Gemini. Rangkaian pengujian yang sama menunjukkan prompt mana yang memerlukan perubahan karena perbedaan perilaku penyedia baru.
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_resultsMemantau Tren Tingkat Keberhasilan
Gambarkan tingkat keberhasilan dari waktu ke waktu dengan membaca log riwayat pengujian. Tren menurun menunjukkan penurunan kualitas prompt atau pergeseran model. Penurunan mendadak menunjukkan peristiwa regresi (pembaruan model atau perubahan 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()Pemeriksaan Pengetahuan
Saat versi model baru menyebabkan sebuah pengujian gagal, dan penyelidikan menunjukkan bahwa keluaran model baru sebenarnya lebih baik daripada keluaran lama, tindakan apa yang tepat?
Rangkuman: Pengujian Regresi di antara Pembaruan Model
Praktik utama untuk pengujian regresi saat model diperbarui:
- Jalankan seluruh rangkaian pengujian pada model lama dan baru—bandingkan tingkat keberhasilan dan bandingkan perbedaan kegagalan tertentu
- Lacak versi model yang tepat dalam setiap log pengujian—bukan hanya aliasnya
- Selidiki setiap regresi: apakah ini masalah prompt, masalah pengujian, atau masalah kemampuan model?
- Kunci model di produksi pada ID versi tertentu, bukan alias
- Otomatiskan dalam CI—picu saat konfigurasi model atau berkas prompt berubah
Pelajaran berikutnya: membangun rangkaian pengujian prompt lengkap dengan dukungan alat.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengujian Regresi pada Pembaruan Model” gratis?
Ya — teks lengkap “Pengujian Regresi pada Pembaruan Model” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengujian Regresi pada Pembaruan Model”?
Jalankan rangkaian pengujian saat melakukan peningkatan dari GPT-4 ke GPT-4o atau dari Claude 3 ke 3.5. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengujian Regresi pada Pembaruan Model” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menulis Kasus Uji Prompt
- Pengujian Prompt Berbasis Assertion
- Pengujian Regresi pada Pembaruan Model
- Membangun Rangkaian Pengujian Prompt