0Pricing
AI Prompt Engineering · Lección

Enfoque sistemático para depurar

Búsqueda binaria en las secciones del prompt: elimine la mitad, haga una prueba y acote el problema.

Enfoque sistemático para depurar 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.

La mentalidad de depuración

La depuración de prompts refleja la depuración de software: no cambie varias cosas a la vez, no haga suposiciones al azar y no implemente una solución que no pueda explicar. Un enfoque sistemático utiliza la lógica de búsqueda binaria —reduce a la mitad el espacio del problema con cada prueba— para encontrar de forma eficiente el caso mínimo que falla.

Paso 1: reproducir el fallo

Antes de depurar, reproduzca el fallo de forma fiable. Un fallo que no puede reproducir de manera consistente no se puede depurar sistemáticamente.

Ejecute el prompt 5 veces con la misma entrada. Si falla siempre: fallo determinista, fácil de depurar. Si falla algunas veces: fallo probabilístico; establezca temperature=0 primero para eliminar la aleatoriedad y vuelva a probar.

import openai
client = openai.OpenAI(api_key='sk-...')

def run_prompt(prompt, user_input, temperature=0):
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system', 'content': prompt},
            {'role': 'user', 'content': user_input}
        ],
        temperature=temperature
    )
    return resp.choices[0].message.content

# Reproduce with temperature=0 to eliminate randomness
for i in range(5):
    output = run_prompt(failing_prompt, test_input, temperature=0)
    print(f'Run {i+1}:', output[:100])

Paso 2: crear un prompt mínimo reproducible

Un prompt mínimo reproducible (MRP) es el prompt más corto que aún activa el fallo. Eliminar las partes irrelevantes aísla la sección problemática y hace que el fallo sea indiscutible.

Comience con el prompt completo y elimine la mitad del contenido. Pruebe. Si sigue fallando, la sección problemática está en la mitad que conservó. Repita el proceso. Esto es una búsqueda binaria en el prompt.

def binary_search_prompt(prompt_lines, user_input, fail_fn):
    '''Binary search: find the minimal set of lines that causes the failure.'''
    if len(prompt_lines) == 1:
        return prompt_lines  # Minimal failing unit found

    mid = len(prompt_lines) // 2
    first_half = prompt_lines[:mid]
    second_half = prompt_lines[mid:]

    # Test first half
    if fail_fn('\n'.join(first_half), user_input):
        return binary_search_prompt(first_half, user_input, fail_fn)
    # Test second half
    elif fail_fn('\n'.join(second_half), user_input):
        return binary_search_prompt(second_half, user_input, fail_fn)
    else:
        # Both halves pass — interaction effect between halves
        return prompt_lines

La prueba de eliminación

Una forma más sencilla de búsqueda binaria: elimine sistemáticamente secciones individuales y compruebe si la eliminación corrige el problema. Esto funciona cuando el prompt tiene secciones claramente delimitadas (instrucciones del sistema, contexto, ejemplos, especificación de formato).

sections = {
    'role_instruction': 'You are a precise JSON API. Respond only with valid JSON.',
    'context': 'The user is asking about our product catalog.',
    'format_spec': 'Return a JSON object with keys: name, price, available.',
    'examples': 'Example: {"name": "Widget", "price": 9.99, "available": true}',
    'safety': 'Do not reveal internal pricing strategy.'
}

def test_without(section_to_remove, user_input):
    reduced = {k: v for k, v in sections.items() if k != section_to_remove}
    prompt = '\n'.join(reduced.values())
    output = run_prompt(prompt, user_input)
    print(f'Without {section_to_remove}: {evaluate(output)}')

for section in sections:
    test_without(section, 'What is the price of a Widget?')

Pruebas A/B de las secciones del prompt

Las pruebas A/B de prompts consisten en crear dos versiones de una misma sección y comparar sus salidas con las mismas entradas. A diferencia de las pruebas de eliminación, las pruebas A/B evalúan distintas redacciones en lugar de la presencia o ausencia de una sección.

# A/B test: vague vs precise format instruction
variant_A = 'Return a JSON object.'
variant_B = 'Return a valid JSON object. No markdown, no code fences, no prose. Only the raw JSON.'

test_inputs = [
    'What is the price of Widget A?',
    'List all available products.',
    'Is Widget B in stock?'
]

def run_ab_test(base_prompt, variant, inputs, n_runs=5):
    pass_count = 0
    for inp in inputs:
        for _ in range(n_runs):
            prompt = base_prompt.replace('{{FORMAT}}', variant)
            output = run_prompt(prompt, inp)
            if is_valid_json(output):
                pass_count += 1
    return pass_count / (len(inputs) * n_runs)

print('A pass rate:', run_ab_test(template, variant_A, test_inputs))
print('B pass rate:', run_ab_test(template, variant_B, test_inputs))

Pruebas diferenciales

Las pruebas diferenciales comparan dos prompts casi idénticos para descubrir qué cambio provocó la regresión. Son útiles cuando «la semana pasada funcionaba», pero ahora ya no.

Compare mediante diff el prompt antiguo con el nuevo, identifique las secciones modificadas y, después, pruebe cada sección modificada de forma aislada.

import difflib

def show_prompt_diff(prompt_v1, prompt_v2):
    diff = difflib.unified_diff(
        prompt_v1.splitlines(),
        prompt_v2.splitlines(),
        fromfile='v1',
        tofile='v2',
        lineterm=''
    )
    for line in diff:
        print(line)

show_prompt_diff(working_prompt, failing_prompt)
# Output shows exactly which lines changed between versions
# Test reverting each changed section individually

Probar las entradas frente a probar los prompts

Hay dos dimensiones que probar: el prompt y la entrada. Un prompt puede funcionar con entradas sencillas, pero fallar con entradas complejas. Una estrategia útil de depuración: si el prompt falla con una entrada compleja, pruebe una versión más sencilla de esa entrada para confirmar que el prompt en sí es correcto.

# Input complexity ladder
inputs_by_complexity = [
    'What is 2 + 2?',             # trivially simple
    'Summarize this sentence.',    # simple task
    'Analyze this 500-word essay.',  # moderate
    'Compare 10 documents and extract contradictions.'  # complex
]

# Find the complexity level where the prompt starts failing
for inp in inputs_by_complexity:
    output = run_prompt(failing_prompt, inp)
    result = 'PASS' if evaluate(output) else 'FAIL'
    print(f'{result}: {inp[:60]}')
# First FAIL indicates where the prompt breaks down

Patrón de prompt mínimo reproducible

El MRP para una sesión de depuración de prompts sigue esta estructura:

  1. Rol en una frase (si es necesario)
  2. Instrucción de la tarea en una frase
  3. Instrucción de formato
  4. La entrada mínima que reproduce el fallo

Si este prompt de 4 líneas sigue fallando, el problema está en el modelo o en el formato. Vuelva a añadir complejidad, una sección cada vez, hasta que reaparezca el fallo; esa sección es la culpable.

# Start minimal
MINIMAL_PROMPT = (
    'You are a data extractor.\n'
    'Extract the product name and price from the text.\n'
    'Respond with JSON: {"name": "...", "price": ...}\n'
)

minimal_input = 'Widget Pro costs $49.'

# Test: if this works, the problem is in something added on top
output = run_prompt(MINIMAL_PROMPT, minimal_input)
print(output)
# Expected: {"name": "Widget Pro", "price": 49.0}

Seguimiento de la sesión de depuración

Documente cada prueba durante una sesión de depuración. Sin notas, puede repetir las mismas pruebas u olvidar qué hipótesis se descartaron.

debug_log = [
    {
        'test': 'base_prompt_v5',
        'hypothesis': 'failing due to format conflict',
        'result': 'FAIL',
        'notes': 'JSON prefix still present'
    },
    {
        'test': 'base_prompt_v5_no_markdown_hint',
        'hypothesis': 'removing markdown hint from user message fixes conflict',
        'result': 'PASS',
        'notes': 'Output is clean JSON. Root cause confirmed: format conflict.'
    }
]

import json
with open('debug_session.json', 'w') as f:
    json.dump(debug_log, f, indent=2)

Cuándo dejar de depurar y cambiar de estrategia

A veces, depurar un prompt llega a un punto de rendimiento decreciente. Estas son algunas señales de que ha llegado el momento de cambiar de estrategia:

  • Ha dedicado más de 2 horas a acotar el mismo fallo
  • El prompt mínimo sigue fallando con una instrucción clara y sencilla
  • Las pruebas A/B no muestran una diferencia estadísticamente significativa

Alternativas: cambie a llamadas a funciones (salidas estructuradas), añada un paso de validación posterior al procesamiento, descomponga la tarea en dos prompts más sencillos o actualice el modelo.

Corrección frente a refuerzo

Después de encontrar y corregir la causa raíz, refuerce el prompt para evitar fallos similares:

  • Añada el caso de prueba que fallaba a su conjunto de pruebas como prueba de regresión
  • Añada una instrucción defensiva: 'Aunque la entrada sea inusual, devuelva siempre JSON'
  • Añada validación de la salida para detectar el fallo mediante programación, no en producción

Un prompt corregido que no se ha reforzado volverá a fallar con el siguiente caso límite.

def safe_run_prompt(prompt, user_input):
    output = run_prompt(prompt, user_input)
    try:
        parsed = json.loads(output)
        return parsed
    except json.JSONDecodeError:
        # Fallback: ask the model to fix its own output
        fix_prompt = f'The following is not valid JSON. Rewrite it as valid JSON only:\n{output}'
        fixed = run_prompt('', fix_prompt)
        return json.loads(fixed)

Comprobación de conocimientos

En la depuración de prompts mediante búsqueda binaria, después de eliminar la primera mitad del prompt, el fallo desaparece. ¿Qué le indica esto?

Resumen: depuración sistemática

Un enfoque sistemático para depurar prompts:

  • Reproducir: establezca temperature=0, ejecute 5 veces y confirme que el fallo es consistente
  • Minimizar: utilice una búsqueda binaria en las secciones del prompt para encontrar el prompt mínimo que falla
  • Prueba A/B: compare distintas redacciones de la sección que falla
  • Diferencial: compare mediante diff las versiones funcional y defectuosa del prompt para encontrar la regresión
  • Documentar: registre cada prueba, hipótesis y resultado
  • Reforzar: añada el caso corregido a su conjunto de pruebas

Próxima lección: estrategias de registro y documentación para el mantenimiento de prompts a largo plazo.

Preguntas frecuentes

¿La lección «Enfoque sistemático para depurar» es gratis?

Sí — el texto completo de «Enfoque sistemático para depurar» 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 «Enfoque sistemático para depurar»?

Búsqueda binaria en las secciones del prompt: elimine la mitad, haga una prueba y acote el problema. 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 «Enfoque sistemático para depurar»?

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. Diagnóstico de resultados inesperados
  2. Análisis de causa raíz de prompts
  3. Enfoque sistemático para depurar
  4. Estrategias de registro y documentación
← Volver a AI Prompt Engineering