Testes de regressão entre atualizações de modelos
Execute conjuntos de testes ao atualizar de GPT-4 para GPT-4o ou de Claude 3 para 3.5.
Testes de regressão entre atualizações de modelos é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.
Por que as atualizações de modelos quebram as instruções
Os provedores de LLM atualizam regularmente seus modelos: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Cada atualização altera o comportamento do modelo — geralmente melhorando a maioria das tarefas, mas ocasionalmente causando regressões em instruções específicas.
Sem um conjunto de testes, as regressões ficam invisíveis até que os usuários as relatem. Com um conjunto de testes, você detecta regressões poucos minutos após uma atualização do modelo.
O problema das atualizações de modelos
As atualizações de modelos podem causar três tipos de mudança:
- Melhorias: casos de teste que falhavam anteriormente agora são aprovados — ótimo
- Neutras: comportamento inalterado — a maioria dos testes
- Regressões: casos de teste que eram aprovados anteriormente agora falham — é preciso investigar
Mesmo uma taxa de regressão de 1% é significativa: se você tiver 200 casos de teste e 2 começarem a falhar após uma atualização do modelo, esses 2 podem representar seus casos de uso mais críticos.
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 productionExecutando o conjunto de testes em um modelo novo
Quando uma nova versão do modelo for anunciada, execute o conjunto completo de testes nos modelos antigo e novo. Compare as taxas de aprovação. Identifique quais casos de teste específicos tiveram o comportamento alterado.
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%}')Comparando resultados entre versões de modelos
Depois de executar os dois conjuntos de testes, identifique os casos que mudaram de estado: aprovados → falhos (regressões) e falhos → aprovados (melhorias).
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)Rastreando a versão do modelo nos registros de testes
O registro de cada execução de teste deve incluir o identificador exato do modelo — não apenas 'gpt-4o', mas a cadeia completa com a versão, 'gpt-4o-2024-11-20'. A OpenAI e a Anthropic atualizam frequentemente o modelo por trás de um alias (por exemplo, 'gpt-4o') sem alterar o nome do alias, o que torna o registro essencial para depurar comportamentos históricos.
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)
}Investigando regressões
Quando uma regressão for encontrada, investigue antes de atualizar a instrução. Pergunte: a instrução piorou ou o modelo melhorou de uma maneira que alterou o comportamento?
Exemplo: o sucessor do GPT-4o pode seguir as instruções de formato com mais rigor, fazendo um teste falhar porque o teste antigo esperava uma saída ligeiramente fora de conformidade. Nesse caso, o modelo melhorou e o teste precisa ser atualizado — não a instrução.
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 promptQuando atualizar a instrução ou o teste
Após investigar uma regressão, escolha uma das três ações:
- Atualizar a instrução: o novo modelo exige uma formulação diferente das instruções para alcançar o mesmo comportamento
- Atualizar o teste: a saída esperada antiga estava errada ou era inferior; a nova saída é, na verdade, melhor
- Aceitar a regressão: o novo modelo não consegue executar essa tarefa de maneira confiável; use o alias do modelo antigo para esse caso de 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.'
}
}Fixando versões de modelos
Quando uma atualização do modelo causar regressões inaceitáveis, fixe o modelo no ID com versão anterior enquanto investiga. Não use um alias (por exemplo, 'gpt-4o') em produção — use sempre uma versão específica.
# 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',
}Regressão automatizada no CI
Execute o conjunto de testes de regressão automaticamente quando a versão do modelo na sua configuração for alterada. Use GitHub Actions ou um CI semelhante para detectar regressões antes da implantação.
# .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']Lidando com regressões entre provedores
Os testes de regressão também se aplicam ao trocar de provedor: GPT-4o → Claude, Claude → Gemini. O mesmo conjunto de testes revela quais instruções exigem alterações devido às diferenças de comportamento do novo provedor.
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_resultsMonitorando tendências da taxa de aprovação
Trace a taxa de aprovação ao longo do tempo lendo o registro histórico de testes. Uma tendência de queda indica degradação da instrução ou deriva do modelo. Uma queda repentina indica um evento de regressão (atualização do modelo ou alteração da instrução).
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ção de conhecimento
Quando uma nova versão do modelo fizer um teste falhar e a investigação revelar que a saída do novo modelo é, na verdade, melhor que a saída antiga, qual é a ação correta?
Recapitulação: testes de regressão entre atualizações de modelos
Práticas principais para testes de regressão quando os modelos são atualizados:
- Execute o conjunto completo de testes nos modelos antigo e novo — compare as taxas de aprovação e compare as falhas específicas
- Rastreie a versão exata do modelo em cada registro de teste — não apenas o alias
- Investigue cada regressão: é um problema da instrução, um problema do teste ou uma limitação de capacidade do modelo?
- Fixe os modelos em produção em IDs com versões específicas, não em aliases
- Automatize no CI — acione a execução quando houver alterações na configuração do modelo ou no arquivo de instruções
Próxima lição: criando um conjunto completo de testes de instruções com suporte de ferramentas.
Perguntas Frequentes
A aula “Testes de regressão entre atualizações de modelos” é grátis?
Sim — o texto completo de “Testes de regressão entre atualizações de modelos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.
O que vou aprender em “Testes de regressão entre atualizações de modelos”?
Execute conjuntos de testes ao atualizar de GPT-4 para GPT-4o ou de Claude 3 para 3.5. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Prompt Engineering?
Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Testes de regressão entre atualizações de modelos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Prompt Engineering?
Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Escrevendo casos de teste para prompts
- Testes de prompts baseados em asserções
- Testes de regressão entre atualizações de modelos
- Criando um conjunto de testes para prompts