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_linesLa 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 individuallyProbar 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 downPatrón de prompt mínimo reproducible
El MRP para una sesión de depuración de prompts sigue esta estructura:
- Rol en una frase (si es necesario)
- Instrucción de la tarea en una frase
- Instrucción de formato
- 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
- Diagnóstico de resultados inesperados
- Análisis de causa raíz de prompts
- Enfoque sistemático para depurar
- Estrategias de registro y documentación