0Pricing
AI Prompt Engineering · Lección

Pruebas de regresión entre actualizaciones de modelos

Ejecute conjuntos de pruebas al actualizar de GPT-4 a GPT-4o o de Claude 3 a 3.5.

Pruebas de regresión entre actualizaciones de modelos es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

Por qué las actualizaciones de modelos rompen los prompts

Los proveedores de LLM actualizan periódicamente sus modelos: GPT-4 → GPT-4o → GPT-4o-2024-11-20, Claude 3 → Claude 3.5 → Claude 3.7. Cada actualización modifica el comportamiento del modelo; normalmente mejora la mayoría de las tareas, pero en ocasiones introduce regresiones en prompts específicos.

Sin un conjunto de pruebas, las regresiones pasan inadvertidas hasta que los usuarios las notifican. Con un conjunto de pruebas, detectará las regresiones en cuestión de minutos después de una actualización del modelo.

El problema de las actualizaciones de modelos

Las actualizaciones de modelos pueden provocar tres tipos de cambios:

  • Mejoras: los casos de prueba que antes fallaban ahora pasan; es positivo
  • Neutrales: el comportamiento no cambia; ocurre en la mayoría de las pruebas
  • Regresiones: los casos de prueba que antes pasaban ahora fallan; es necesario investigarlas

Incluso una tasa de regresión del 1 % es significativa: si tiene 200 casos de prueba y 2 empiezan a fallar después de una actualización del modelo, esos 2 pueden corresponder a sus casos de uso más 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 production

Ejecución del conjunto de pruebas con un modelo nuevo

Cuando se anuncie una nueva versión del modelo, ejecute el conjunto completo de pruebas tanto con el modelo anterior como con el nuevo. Compare las tasas de aprobación e identifique qué casos de prueba específicos cambiaron de comportamiento.

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%}')

Comparación de resultados entre versiones de modelos

Después de ejecutar ambos conjuntos de pruebas, identifique los casos cuyo estado cambió: aprobado → fallido (regresiones) y fallido → aprobado (mejoras).

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)

Seguimiento de la versión del modelo en los registros de pruebas

El registro de cada ejecución de pruebas debe incluir el identificador exacto del modelo, no solo «gpt-4o», sino la cadena completa con la versión, «gpt-4o-2024-11-20». OpenAI y Anthropic actualizan con frecuencia el modelo que se encuentra detrás de un alias (por ejemplo, «gpt-4o») sin cambiar el nombre del alias, por lo que el registro es esencial para depurar el comportamiento histórico.

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)
    }

Investigación de regresiones

Cuando encuentre una regresión, investigue antes de actualizar el prompt. Pregúntese: ¿el prompt empeoró o el modelo mejoró de una forma que modificó el comportamiento?

Ejemplo: el sucesor de GPT-4o podría seguir las instrucciones de formato de forma más estricta y provocar que una prueba falle porque la prueba anterior esperaba una salida ligeramente no conforme. En este caso, el modelo mejoró y es necesario actualizar la prueba, no el 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 prompt

Cuándo actualizar el prompt y cuándo actualizar la prueba

Después de investigar una regresión, elija una de estas tres acciones:

  • Actualizar el prompt: el nuevo modelo necesita una redacción distinta de las instrucciones para lograr el mismo comportamiento
  • Actualizar la prueba: la salida esperada anterior era incorrecta o subóptima; la nueva salida es en realidad mejor
  • Aceptar la regresión: el nuevo modelo no puede realizar esta tarea de forma fiable; utilice el alias del modelo anterior para este 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.'
    }
}

Fijación de versiones de modelos

Cuando una actualización del modelo provoque regresiones inaceptables, fije el modelo al ID versionado anterior mientras investiga. No utilice un alias (por ejemplo, «gpt-4o») en producción; utilice siempre una versión 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',
}

Regresión automatizada en CI

Ejecute automáticamente el conjunto de pruebas de regresión cuando cambie la versión del modelo en su configuración. Utilice GitHub Actions o una herramienta de CI similar para detectar regresiones antes del despliegue.

# .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']

Gestión de regresiones entre proveedores

Las pruebas de regresión también se aplican al cambiar de proveedor: GPT-4o → Claude, Claude → Gemini. El mismo conjunto de pruebas revela qué prompts requieren cambios debido a las diferencias de comportamiento del nuevo proveedor.

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_results

Seguimiento de las tendencias de la tasa de aprobación

Represente gráficamente la tasa de aprobación a lo largo del tiempo leyendo el historial de pruebas. Una tendencia descendente indica una degradación del prompt o una deriva del modelo. Una caída repentina indica un evento de regresión, como una actualización del modelo o un cambio en el 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()

Comprobación de conocimientos

Cuando una nueva versión del modelo provoca que una prueba falle y la investigación revela que la salida del nuevo modelo es en realidad mejor que la anterior, ¿cuál es la acción correcta?

Recapitulación: pruebas de regresión entre actualizaciones de modelos

Prácticas clave para las pruebas de regresión cuando se actualizan los modelos:

  • Ejecute el conjunto completo de pruebas con el modelo anterior y con el nuevo: compare las tasas de aprobación y analice las diferencias entre los fallos específicos
  • Registre la versión exacta del modelo en cada registro de pruebas, no solo el alias
  • Investigue cada regresión: ¿es un problema del prompt, de la prueba o de las capacidades del modelo?
  • Fije los modelos en producción a IDs versionados específicos, no a aliases
  • Automatice el proceso en CI: active las pruebas cuando cambien la configuración del modelo o los archivos de prompts

Siguiente lección: creación de un conjunto completo de pruebas de prompts con herramientas de apoyo.

Preguntas frecuentes

¿La lección «Pruebas de regresión entre actualizaciones de modelos» es gratis?

Sí — el texto completo de «Pruebas de regresión entre actualizaciones de modelos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Pruebas de regresión entre actualizaciones de modelos»?

Ejecute conjuntos de pruebas al actualizar de GPT-4 a GPT-4o o de Claude 3 a 3.5. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Pruebas de regresión entre actualizaciones de modelos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Redacción de casos de prueba para prompts
  2. Pruebas de prompts basadas en aserciones
  3. Pruebas de regresión entre actualizaciones de modelos
  4. Creación de un conjunto de pruebas para prompts
← Volver a AI Prompt Engineering