La ingeniería de prompts rara vez es un proceso de un solo intento. Los mejores prompts emergen a través de iteración—probando, observando y refinando hasta lograr los resultados deseados.

<Callout type="info" title="Primer Borrador, No Borrador Final">
Piensa en tu primer prompt como un borrador. Incluso los ingenieros de prompts experimentados rara vez aciertan en el primer intento.
</Callout>

## El Ciclo de Iteración

El refinamiento efectivo de prompts sigue un ciclo predecible: escribir, probar, analizar y mejorar. Cada iteración te acerca a un prompt que produce confiablemente los resultados que necesitas.

<IterativeRefinementDemo />

## Patrones Comunes de Refinamiento

La mayoría de los fallos de prompts caen en un puñado de categorías. Aprender a reconocer estos patrones te permite diagnosticar y arreglar problemas rápidamente sin empezar desde cero.

### Problema: Salida Muy Larga

Uno de los problemas más comunes. Sin restricciones explícitas, los modelos tienden a ser exhaustivos en lugar de concisos.

<DiffView 
  before="Explica cómo funciona la fotosíntesis."
  after={`Explica cómo funciona la fotosíntesis en 3-4 oraciones adecuadas para un niño de 10 años.`}
  beforeLabel="Original"
  afterLabel="Refinado"
/>

### Problema: Salida Muy Vaga

Prompts vagos producen salidas vagas. El modelo no puede leer tu mente sobre lo que significa "mejor" o qué aspectos te importan más.

<DiffView 
  before="Dame consejos para mejores presentaciones."
  after={`Dame 5 consejos específicos y accionables para mejorar presentaciones técnicas a stakeholders no técnicos. Para cada consejo, incluye un ejemplo concreto.`}
  beforeLabel="Original"
  afterLabel="Refinado"
/>

### Problema: Tono Incorrecto

El tono es subjetivo y varía según el contexto. Lo que suena "profesional" para el modelo podría no coincidir con la voz de tu organización o la relación con tu destinatario.

<DiffView 
  before="Escribe un correo de disculpa por no cumplir un plazo."
  after={`Escribe un correo de disculpa profesional pero cálido por no cumplir un plazo de proyecto. El tono debe ser responsable sin ser excesivamente apologético. Incluye un plan concreto para prevenir futuros retrasos.`}
  beforeLabel="Original"
  afterLabel="Refinado"
/>

### Problema: Falta Información Clave

Las solicitudes abiertas obtienen respuestas abiertas. Si necesitas tipos específicos de retroalimentación, debes pedirlos explícitamente.

<DiffView 
  before="Revisa este código."
  after={`Revisa este código Python para:
1. Errores y problemas lógicos
2. Problemas de rendimiento
3. Vulnerabilidades de seguridad
4. Estilo de código (PEP 8)

Para cada problema encontrado, explica el problema y sugiere una corrección.

[código]`}
  beforeLabel="Original"
  afterLabel="Refinado"
/>

### Problema: Formato Inconsistente

Sin una plantilla, el modelo estructurará cada respuesta de manera diferente, haciendo difícil la comparación e imposible la automatización.

<DiffView 
  before="Analiza estos tres productos."
  after={`Analiza estos tres productos usando este formato exacto para cada uno:

## [Nombre del Producto]
**Precio:** X€
**Pros:** [lista con viñetas]
**Contras:** [lista con viñetas]
**Mejor Para:** [una oración]
**Puntuación:** X/10

[productos]`}
  beforeLabel="Original"
  afterLabel="Refinado"
/>

## Enfoque Sistemático de Refinamiento

Los cambios aleatorios desperdician tiempo. Un enfoque sistemático te ayuda a identificar problemas rápidamente y arreglarlos eficientemente.

### Paso 1: Diagnostica el Problema

Antes de cambiar nada, identifica qué está realmente mal. Usa esta tabla diagnóstica para mapear síntomas a soluciones:

<div className="my-4 grid gap-2">
  <div className="grid grid-cols-3 gap-2 p-3 bg-muted/50 rounded-lg text-sm">
    <span className="font-semibold">Síntoma</span>
    <span className="font-semibold">Causa Probable</span>
    <span className="font-semibold">Solución</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Muy largo</span>
    <span className="text-muted-foreground">Sin restricción de longitud</span>
    <span className="text-green-600 dark:text-green-400">Agregar límites de palabras/oraciones</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Muy corto</span>
    <span className="text-muted-foreground">Falta solicitud de detalle</span>
    <span className="text-green-600 dark:text-green-400">Pedir elaboración</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Fuera de tema</span>
    <span className="text-muted-foreground">Instrucciones vagas</span>
    <span className="text-green-600 dark:text-green-400">Ser más específico</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Formato incorrecto</span>
    <span className="text-muted-foreground">Formato no especificado</span>
    <span className="text-green-600 dark:text-green-400">Definir estructura exacta</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Tono incorrecto</span>
    <span className="text-muted-foreground">Audiencia no clara</span>
    <span className="text-green-600 dark:text-green-400">Especificar audiencia/estilo</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Inconsistente</span>
    <span className="text-muted-foreground">Sin ejemplos proporcionados</span>
    <span className="text-green-600 dark:text-green-400">Agregar ejemplos de pocos ejemplos</span>
  </div>
</div>

### Paso 2: Haz Cambios Dirigidos

Resiste la urgencia de reescribir todo. Cambiar múltiples variables a la vez hace imposible saber qué ayudó y qué perjudicó. Haz un cambio, pruébalo, luego procede:

```
Iteración 1: Agregar restricción de longitud
Iteración 2: Especificar formato
Iteración 3: Agregar ejemplo
Iteración 4: Refinar instrucciones de tono
```

### Paso 3: Documenta Lo Que Funciona

El conocimiento de ingeniería de prompts se pierde fácilmente. Mantén un registro de lo que probaste y por qué. Esto ahorra tiempo cuando revisitas el prompt después o enfrentas desafíos similares:

```markdown
## Prompt: Respuesta de Email a Cliente

### Versión 1 (muy formal)
"Escribe una respuesta a esta queja de cliente."

### Versión 2 (mejor tono, aún falta estructura)
"Escribe una respuesta amigable pero profesional a esta queja. 
Muestra empatía primero."

### Versión 3 (final - buenos resultados)
"Escribe una respuesta a esta queja de cliente. Estructura:
1. Reconoce su frustración (1 oración)
2. Discúlpate específicamente (1 oración)  
3. Explica la solución (2-3 oraciones)
4. Ofrece ayuda adicional (1 oración)

Tono: Amigable, profesional, empático pero no servil."
```

## Ejemplo de Iteración del Mundo Real

Caminemos a través de un ciclo de iteración completo para ver cómo cada refinamiento se construye sobre el anterior. Nota cómo cada versión aborda deficiencias específicas de la anterior.

### Tarea: Generar Nombres de Producto

<VersionDiff versions={[
  {
    label: "Versión 1",
    content: "Genera nombres para una nueva app de productividad.",
    note: "Muy genérico, sin contexto"
  },
  {
    label: "Versión 2",
    content: `Genera nombres para una nueva app de productividad. La app usa IA para programar automáticamente tus tareas basándose en niveles de energía y disponibilidad de calendario.`,
    note: "Agregado contexto, aún genérico"
  },
  {
    label: "Versión 3",
    content: `Genera 10 nombres únicos y memorables para una app de productividad con estas características:
- Usa IA para programar tareas basándose en niveles de energía
- Audiencia objetivo: profesionales ocupados de 25-40 años
- Tono de marca: moderno, inteligente, ligeramente juguetón
- Evitar: palabras genéricas como "pro", "smart", "IA", "tarea"

Para cada nombre, explica por qué funciona.`,
    note: "Agregadas restricciones y razonamiento"
  },
  {
    label: "Versión 4 (final)",
    content: `Genera 10 nombres únicos y memorables para una app de productividad.

Contexto:
- Usa IA para programar tareas basándose en niveles de energía
- Objetivo: profesionales ocupados, 25-40
- Tono: moderno, inteligente, ligeramente juguetón

Requisitos:
- Máximo 2-3 sílabas
- Fácil de deletrear y pronunciar
- Disponible como dominio .com (verifica si es plausible)
- Evitar: palabras genéricas (pro, smart, IA, tarea, flow)

Formato:
Nombre | Pronunciación | Por Qué Funciona | Estimación de Disponibilidad de Dominio`,
    note: "Formato estructurado, requisitos específicos"
  }
]} />

## Estrategias de Refinamiento por Tipo de Tarea

Diferentes tareas fallan de maneras predecibles. Conocer los modos de fallo comunes te ayuda a diagnosticar y arreglar problemas más rápido.

### Para Generación de Contenido

La generación de contenido a menudo produce salidas genéricas, fuera de objetivo o mal formateadas. La solución usualmente implica ser más específico sobre restricciones, proporcionar ejemplos concretos, o definir tu voz de marca explícitamente.

<InfoGrid items={[
  { icon: "target", title: "Muy Genérico", description: "Agregar restricciones y contexto específico", example: "\"Escribe sobre perros\" → \"Escribe sobre golden retrievers para dueños primerizos, enfocándote en entrenamiento y necesidades de ejercicio\"" },
  { icon: "scissors", title: "Muy Largo", description: "Establecer límites de palabras/párrafos", example: "Agregar: \"Mantén la respuesta bajo 150 palabras\" o \"Máximo 3 párrafos\"" },
  { icon: "palette", title: "Estilo Incorrecto", description: "Proporcionar ejemplos de estilo", example: "\"Escribe en el estilo de este ejemplo: [pegar texto de muestra]\"" },
  { icon: "megaphone", title: "Fuera de Marca", description: "Incluir directrices de voz de marca", example: "\"Usa tono amigable y casual. Evita jerga. Dirígete al lector como 'tú'.\"" }
]} />

### Para Generación de Código

La salida de código puede fallar técnicamente (errores de sintaxis, características de lenguaje incorrectas) o arquitectónicamente (patrones pobres, casos faltantes). Los problemas técnicos necesitan especificaciones de versión/entorno; los problemas arquitectónicos necesitan guía de diseño.

<InfoGrid items={[
  { icon: "code", title: "Errores de Sintaxis", description: "Especificar versión del lenguaje", example: "\"Usa sintaxis Python 3.11+ con type hints\" o \"JavaScript ES2022\"" },
  { icon: "git-branch", title: "Enfoque Incorrecto", description: "Describir patrones preferidos", example: "\"Usa enfoque funcional, evita clases\" o \"Sigue patrón repositorio\"" },
  { icon: "shield", title: "Casos Límite Faltantes", description: "Listar escenarios a manejar", example: "\"Manejar: entrada vacía, valores nulos, timeouts de red, formatos inválidos\"" },
  { icon: "tag", title: "Nomenclatura Pobre", description: "Incluir convenciones de nombrado", example: "\"Usa camelCase para variables, PascalCase para clases, UPPER_SNAKE para constantes\"" }
]} />

### Para Análisis

Las tareas de análisis a menudo producen resultados superficiales o no estructurados. Guía al modelo con frameworks específicos (FODA, Cinco Fuerzas de Porter), solicita múltiples puntos de vista, o proporciona una plantilla para la estructura de salida.

<InfoGrid items={[
  { icon: "layers", title: "Muy Superficial", description: "Pedir frameworks específicos", example: "\"Analiza usando framework FODA\" o \"Aplica las Cinco Fuerzas de Porter\"" },
  { icon: "scale", title: "Sesgado", description: "Solicitar múltiples perspectivas", example: "\"Presenta argumentos a favor y en contra\" o \"Incluye punto de vista escéptico\"" },
  { icon: "database", title: "Datos Faltantes", description: "Especificar qué analizar", example: "\"Enfócate en: tamaño de mercado, tasa de crecimiento, actores clave, barreras de entrada\"" },
  { icon: "layout", title: "Sin Estructura", description: "Proporcionar plantilla de análisis", example: "\"Formatea como: Resumen → Hallazgos Clave → Implicaciones → Recomendaciones\"" }
]} />

### Para Preguntas y Respuestas

Las preguntas y respuestas pueden ser muy tersas o muy verbosas, y pueden carecer de indicadores de confianza o fuentes. Especifica el nivel de detalle que necesitas y si quieres citas o incertidumbre expresada.

<InfoGrid items={[
  { icon: "plus", title: "Muy Corto", description: "Pedir elaboración", example: "\"Explica en detalle con ejemplos\" o \"Elabora cada punto\"" },
  { icon: "minus", title: "Muy Largo", description: "Solicitar respuesta concisa", example: "\"Responde en 2-3 oraciones\" o \"Dame el resumen\"" },
  { icon: "help-circle", title: "Incierto", description: "Pedir nivel de confianza", example: "\"Califica tu confianza 1-10\" o \"Nota cualquier suposición hecha\"" },
  { icon: "link", title: "Sin Fuentes", description: "Solicitar citas", example: "\"Cita fuentes para afirmaciones\" o \"Incluye referencias donde sea posible\"" }
]} />

## La Técnica del Ciclo de Retroalimentación

Aquí hay una meta-técnica: usa el modelo mismo para ayudar a mejorar tus prompts. Comparte lo que probaste, lo que obtuviste y lo que querías. El modelo a menudo puede sugerir mejoras que no habías considerado.

```
Usé este prompt:
"[tu prompt]"

Y obtuve esta salida:
"[salida del modelo]"

Quería algo más [describe la brecha]. ¿Cómo debería modificar 
mi prompt para obtener mejores resultados?
```

## Pruebas A/B de Prompts

Para prompts que se usarán repetidamente o a escala, no solo elijas el primero que funcione. Prueba variaciones para encontrar el enfoque más confiable y de mayor calidad.

```
Prompt A: "Resume este artículo en 3 viñetas."
Prompt B: "Extrae las 3 ideas más importantes de este artículo."
Prompt C: "¿Cuáles son los puntos clave de este artículo? Lista 3."
```

Ejecuta cada uno múltiples veces, compara:
- Consistencia de la salida
- Calidad de la información
- Relevancia para tus necesidades

## Cuándo Dejar de Iterar

La perfección es enemiga de lo suficientemente bueno. Sabe cuándo tu prompt está listo para usar y cuándo solo estás puliendo para rendimientos decrecientes.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> Listo para Enviar</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">La salida cumple consistentemente los requisitos</p>
      <p className="m-0!">Los casos límite se manejan apropiadamente</p>
      <p className="m-0!">El formato es confiable y parseable</p>
      <p className="m-0!">Mejoras adicionales muestran rendimientos decrecientes</p>
    </div>
  </div>
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> Sigue Iterando</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">La salida es inconsistente entre ejecuciones</p>
      <p className="m-0!">Los casos límite causan fallos</p>
      <p className="m-0!">Se pierden requisitos críticos</p>
      <p className="m-0!">No has probado suficientes variaciones</p>
    </div>
  </div>
</div>

## Control de Versiones para Prompts

Los prompts son código. Para cualquier prompt usado en producción, trátalo con el mismo rigor: control de versiones, registros de cambios y la capacidad de revertir si algo se rompe.

<Callout type="tip" title="Versionado Integrado">
prompts.chat incluye historial de versiones automático para tus prompts. Cada edición se guarda, así que puedes comparar versiones y restaurar iteraciones anteriores con un clic.
</Callout>

Para prompts autogestionados, usa una estructura de carpetas:

```
prompts/
├── respuesta-cliente/
│   ├── v1.0.txt    # Versión inicial
│   ├── v1.1.txt    # Arreglado problema de tono
│   ├── v2.0.txt    # Reestructuración mayor
│   └── current.txt # Symlink a versión activa
└── changelog.md    # Documentar cambios
```

## Resumen

<Callout type="tip" title="Puntos Clave">
Comienza simple, observa cuidadosamente, cambia una cosa a la vez, documenta lo que funciona, y sabe cuándo parar. Los mejores prompts no se escriben—se descubren a través de iteración sistemática.
</Callout>

<Quiz 
  question="¿Cuál es el mejor enfoque al refinar un prompt que produce resultados incorrectos?"
  options={[
    "Reescribir el prompt completo desde cero",
    "Agregar más ejemplos hasta que funcione",
    "Cambiar una cosa a la vez y probar cada cambio",
    "Hacer el prompt lo más largo posible"
  ]}
  correctIndex={2}
  explanation="Cambiar una cosa a la vez te permite aislar qué funciona y qué no. Si cambias múltiples cosas a la vez, no sabrás qué cambio arregló el problema o cuál lo empeoró."
/>

## Práctica: Mejora Este Prompt

Intenta mejorar este prompt débil tú mismo. Edítalo, luego usa IA para comparar tu versión con el original:

<BeforeAfterEditor
  title="Refina Este Prompt de Email"
  badPrompt="Escribe un email."
  idealPrompt={`Eres un escritor de negocios profesional.

Tarea: Escribe un email de seguimiento a un cliente potencial después de una reunión de ventas.

Contexto:
- Me reuní con Sara García, VP de Marketing en TechCorp
- Discutimos nuestra plataforma de analítica
- Ella expresó interés en las funciones de reportes
- La reunión fue ayer

Requisitos:
- Tono profesional pero cálido
- Referencia puntos específicos de nuestra reunión
- Incluye un próximo paso claro (programar una demo)
- Mantén bajo 150 palabras

Formato: Línea de asunto + cuerpo del email`}
  task="Transforma este prompt vago de email en algo que producirá un resultado profesional y efectivo."
/>

En el próximo capítulo, exploraremos el prompting JSON y YAML para aplicaciones de datos estructurados.
