El encadenamiento de prompts divide tareas complejas en secuencias de prompts más simples, donde la salida de cada paso alimenta el siguiente. Esta técnica mejora dramáticamente la confiabilidad y permite flujos de trabajo sofisticados que serían imposibles con un solo prompt.

<Callout type="tip" title="Piensa en Líneas de Ensamblaje">
Así como una línea de ensamblaje de fábrica divide la manufactura en estaciones especializadas, el encadenamiento de prompts divide las tareas de IA en pasos especializados. Cada paso hace una cosa bien, y la salida combinada es mucho mejor que intentar hacer todo a la vez.
</Callout>

## ¿Por Qué Encadenar Prompts?

Los prompts individuales tienen dificultades con tareas complejas porque intentan hacer demasiado a la vez. La IA tiene que simultáneamente entender, analizar, planificar y generar, lo que lleva a errores e inconsistencias.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <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" /> Problemas del Prompt Único</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">El razonamiento multi-paso se confunde</p>
      <p className="m-0!">Diferentes "modos" de pensamiento chocan</p>
      <p className="m-0!">Salidas complejas carecen de consistencia</p>
      <p className="m-0!">Sin oportunidad para control de calidad</p>
    </div>
  </div>
  <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" /> El Encadenamiento Resuelve Esto</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Cada paso se enfoca en una tarea</p>
      <p className="m-0!">Prompts especializados para cada modo</p>
      <p className="m-0!">Validar entre pasos</p>
      <p className="m-0!">Depurar y mejorar pasos individuales</p>
    </div>
  </div>
</div>

## Patrón Básico de Encadenamiento

La cadena más simple pasa la salida de un prompt directamente al siguiente. Cada paso tiene un propósito claro y enfocado.

<div className="my-6 flex items-center justify-center gap-3 p-6 bg-muted/30 rounded-lg overflow-x-auto">
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-blue-100 dark:bg-blue-900/50 border border-blue-200 dark:border-blue-800 rounded-lg text-center">
      <p className="text-sm font-medium text-blue-700 dark:text-blue-300 m-0!">Prompt 1</p>
      <p className="text-xs text-blue-600 dark:text-blue-400 m-0!">(Extraer)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Entrada</p>
  </div>
  <div className="text-blue-400 dark:text-blue-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-purple-100 dark:bg-purple-900/50 border border-purple-200 dark:border-purple-800 rounded-lg text-center">
      <p className="text-sm font-medium text-purple-700 dark:text-purple-300 m-0!">Prompt 2</p>
      <p className="text-xs text-purple-600 dark:text-purple-400 m-0!">(Analizar)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Intermedio</p>
  </div>
  <div className="text-purple-400 dark:text-purple-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-green-100 dark:bg-green-900/50 border border-green-200 dark:border-green-800 rounded-lg text-center">
      <p className="text-sm font-medium text-green-700 dark:text-green-300 m-0!">Prompt 3</p>
      <p className="text-xs text-green-600 dark:text-green-400 m-0!">(Generar)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Salida</p>
  </div>
</div>

<Callout type="info" title="El Patrón ETG">
El patrón de cadena más común es **Extraer → Transformar → Generar**. Primero extrae datos crudos, luego reformatéalos para tu propósito, luego genera la salida final. Este patrón funciona para casi cualquier tarea de contenido.
</Callout>

## Tipos de Cadenas

Diferentes tareas requieren diferentes arquitecturas de cadena. Elige el patrón que coincida con tu flujo de trabajo.

<ChainFlowDemo />

### Cadena Secuencial

El patrón más directo: cada paso depende del anterior. Piénsalo como una carrera de relevos donde cada corredor pasa el testigo al siguiente.

<ChainExample 
  type="sequential"
  steps={[
    { step: "Paso 1: Extraer", prompt: "Extrae todas las fechas, nombres y números de: [texto]", output: '{ fechas: ["2024-01-15", "2024-02-20"], nombres: ["Juan García", "Acme Corp"], numeros: [15000, 42] }' },
    { step: "Paso 2: Analizar", prompt: "Dados estos datos extraídos: [salida_paso1], identifica relaciones y patrones.", output: '{ patrones: ["Reuniones mensuales programadas"], relaciones: ["Juan García trabaja en Acme Corp"] }' },
    { step: "Paso 3: Generar", prompt: "Basándote en este análisis: [salida_paso2], escribe un resumen ejecutivo.", output: "Resumen Ejecutivo: Juan García de Acme Corp ha programado reuniones mensuales con un presupuesto de $15,000..." }
  ]}
/>

### Cadena de Ramificación

Cuando necesitas explorar múltiples direcciones simultáneamente, usa ramificación. Piénsalo como un equipo trabajando en paralelo en diferentes aspectos del mismo proyecto.

<ChainExample 
  type="branch"
  steps={[
    { step: "Entrada", prompt: "Concepto de producto: 'App de productividad impulsada por IA'", output: "→ Se ramifica a análisis paralelos" },
    { step: "Rama A: Investigación de Mercado", prompt: "Analiza oportunidades de mercado para: [entrada]", output: "Tamaño del mercado: $5B, Competidores: Notion, Todoist..." },
    { step: "Rama B: Análisis Técnico", prompt: "Evalúa requisitos técnicos para: [entrada]", output: "Stack: React + GPT-4, Timeline estimado: 6 meses..." },
    { step: "Rama C: Evaluación de Riesgos", prompt: "Identifica riesgos para: [entrada]", output: "Riesgo principal: competencia, Mitigación: diferenciación..." },
    { step: "Fusionar", prompt: "Sintetiza estos tres análisis en una recomendación.", output: "Recomendación: Proceder con MVP enfocado en..." }
  ]}
/>

### Cadena Condicional

Rutas dinámicas basadas en salidas intermedias. El camino a través de la cadena depende de lo que descubras en el camino.

<ChainExample 
  type="conditional"
  steps={[
    { step: "Clasificar", prompt: "Clasifica esta consulta del cliente:\n'¡Mi pedido nunca llegó y quiero un reembolso!'", output: '{ tipo: "queja", urgencia: "alta", sentimiento: "enojado" }' },
    { step: "Enrutar", prompt: "Si urgencia es alta Y sentimiento es negativo → manejar_escalamiento\nDe lo contrario → respuesta_estandar", output: "→ Ruta: manejar_escalamiento" },
    { step: "Ejecutar", prompt: "[prompt_escalamiento] Redacta respuesta empática con oferta de resolución inmediata", output: "Estimado cliente, Lamento profundamente escuchar sobre..." }
  ]}
/>

## Ejemplo Práctico: Pipeline de Creación de Contenido

Veamos un flujo de trabajo de creación de contenido del mundo real usando encadenamiento.

<TryIt 
  title="Paso 1: Extracción de Tema"
  description="Primero, extrae los elementos clave del brief de contenido."
  prompt={`Extrae los elementos clave del contenido de este brief:

Brief: "Necesitamos un post de blog sobre prácticas de codificación sustentable para desarrolladores web. Debe cubrir eficiencia energética, optimización del lado del servidor y diseño verde. Apuntando a desarrolladores intermedios. Objetivo: 1500 palabras."

Extrae como JSON:
{
  "tema": "string",
  "subtemas": ["array"],
  "audiencia": "string",
  "longitud_objetivo": "number",
  "tono": "string (inferido)"
}`}
/>

<TryIt 
  title="Paso 2: Generación de Esquema"
  description="Usa los datos extraídos para crear un esquema estructurado."
  prompt={`Crea un esquema de post de blog basado en estos datos extraídos:

{
  "tema": "Prácticas de Codificación Sustentable",
  "subtemas": ["eficiencia energética", "optimización del servidor", "diseño verde"],
  "audiencia": "desarrolladores intermedios",
  "longitud_objetivo": 1500,
  "tono": "técnico pero accesible"
}

Genera un esquema con:
- Título atractivo
- Secciones con conteos estimados de palabras
- Puntos clave para cada sección
- Lugares sugeridos para ejemplos de código`}
/>

<TryIt 
  title="Paso 3: Generación de Sección"
  description="Genera cada sección basándote en el esquema."
  prompt={`Escribe la introducción para este post de blog:

Esquema:
# Código Verde: Prácticas de Codificación Sustentable para Desarrolladores Web

## Introducción (150 palabras)
- Gancho: el impacto ambiental del desarrollo web
- Relevancia para desarrolladores
- Vista previa del contenido

Requisitos:
- Tono técnico pero accesible
- Incluir una estadística sobre uso de energía de centros de datos
- Terminar con una vista previa de lo que cubrirá el artículo`}
/>

## Validación Entre Pasos

El encadenamiento te permite validar antes de continuar. Esto captura errores temprano y previene que se propaguen.

### Patrón de Validación

<TryIt compact prompt={`Antes de proceder al siguiente paso, valida esta salida:

Salida a validar:
{
  "fecha_evento": "2024-13-45",
  "asistentes": -5,
  "ubicacion": ""
}

Verifica:
1. Todas las fechas son válidas (formato y valores)
2. Los números están en rangos razonables
3. Los campos requeridos no están vacíos

Devuelve:
{
  "valido": boolean,
  "errores": ["lista de problemas encontrados"],
  "corregido": { ... datos corregidos si es posible ... }
}`} />

## Manejo de Errores en Cadenas

Cuando un paso falla, necesitas estrategias de recuperación:

<div className="my-4 grid gap-2">
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-24">Reintentar</span>
    <span className="text-muted-foreground">Intenta el mismo prompt de nuevo (para errores transitorios)</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-24">Fallback</span>
    <span className="text-muted-foreground">Usa un prompt alternativo más simple</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-24">Escalar</span>
    <span className="text-muted-foreground">Pasa a revisión humana</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-24">Omitir</span>
    <span className="text-muted-foreground">Continúa sin el paso fallido (si es opcional)</span>
  </div>
</div>

## Resumen

<Callout type="tip" title="Técnicas Clave">
Divide tareas complejas en pasos simples y enfocados. Usa datos estructurados entre pasos. Valida salidas antes de proceder. Elige el tipo de cadena que coincida con tu flujo de trabajo. Planifica el manejo de errores para cada paso.
</Callout>

<Quiz 
  question="¿Cuándo deberías usar una cadena de ramificación en lugar de una secuencial?"
  options={[
    "Cuando cada paso depende del anterior",
    "Cuando necesitas explorar múltiples direcciones independientes simultáneamente",
    "Cuando quieres reducir llamadas a la API",
    "Cuando la tarea es simple y directa"
  ]}
  correctIndex={1}
  explanation="Las cadenas de ramificación son ideales cuando necesitas analizar la misma entrada desde múltiples ángulos independientes (como mercado, técnico y riesgo) y luego sintetizar los resultados. Las cadenas secuenciales son mejores cuando cada paso depende del anterior."
/>

En el próximo capítulo, exploraremos cómo manejar casos límite y entradas inesperadas.
