Menu

Encadenamiento de prompts: divide una tarea

El encadenamiento de prompts (prompt chaining) divide un trabajo en una secuencia de prompts más pequeños, donde la salida de cada paso se convierte en la entrada del siguiente. Cada paso hace una sola cosa, y puedes revisar su resultado antes de que se ejecute el siguiente.

Puedes editar cada prompt de esta página y abrirlo después en ChatGPT, Claude u otra app de IA.

El encadenamiento de prompts (prompt chaining) consiste en dividir un trabajo en una secuencia de prompts, donde la salida de un prompt pasa a formar parte de la entrada del siguiente. En lugar de pedirle a un modelo que lea cincuenta reseñas, encuentre los problemas, los ordene y escriba un informe de una sola vez, le pides cada cosa por turno. Cada prompt tiene un solo trabajo, y entre pasos tú (o tu código) puedes mirar el resultado, corregirlo o detenerte.

El bloque de abajo es una cadena de tres pasos que convierte reseñas de clientes en una nota para un equipo de producto. Cada pestaña es un paso. La entrada del paso 2 es la respuesta del paso 1, pegada, y la entrada del paso 3 es la respuesta del paso 2.

Fill in
Enumera todas las quejas de las reseñas que están dentro de las etiquetas <reviews>. Ignora los elogios. Devuelve un array JSON de objetos con las claves "review" (el número de la reseña) y "complaint" (ocho palabras como máximo). Devuelve solo el JSON. <reviews> 1. La batería murió a las 4 horas, y el cable de carga es demasiado corto. 2. Suenan genial. Aunque la app me cierra la sesión todo el tiempo. 3. Me encantan, pero la batería apenas me dura el trayecto a casa. 4. La app se cerró dos veces al emparejar, y la batería se gasta rápido. 5. El cable es tan corto que no puedo usarlos mientras cargan en mi escritorio. </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "La batería murió a las 4 horas"},
  {"review": 1, "complaint": "Cable de carga demasiado corto"},
  {"review": 2, "complaint": "La app cierra la sesión"},
  {"review": 3, "complaint": "La batería no dura un trayecto"},
  {"review": 4, "complaint": "La app se cerró al emparejar"},
  {"review": 4, "complaint": "La batería se gasta rápido"},
  {"review": 5, "complaint": "Cable demasiado corto para usarlos cargando"}
]

El paso 1 solo lee y extrae. El paso 2 nunca ve las reseñas, solo la lista, así que no puede volver a resumirlas. El paso 3 solo redacta. Si el paso 3 sale con el tono equivocado, vuelves a ejecutar solo el paso 3; la extracción y la agrupación se quedan como estaban.

Fíjate en lo que el paso 3 no dice: que una batería murió a las 4 horas, o que los problemas de la app eran cierres de sesión y fallos. El paso 3 solo recibió los nombres de los temas, así que esos detalles no estaban en su entrada. Decidir qué recibe cada paso es la principal decisión de diseño de una cadena, y un detalle que quieras en la respuesta final tiene que pasarse hasta el final.

Por qué encadenar en lugar de escribir un prompt enorme

Cada paso tiene un trabajo y un estándar. Un solo prompt que pide extracción, análisis y redacción cuidada tiene tres objetivos que equilibrar, y nada te dice cuál recortó. Un prompt con un solo trabajo puede decir exactamente cómo es un buen resultado para ese trabajo, y puedes juzgar la respuesta con ese criterio.

Puedes revisar lo intermedio. En un solo prompt, una queja que se pierde desaparece dentro de un párrafo bien escrito y nunca la ves. En una cadena, la lista del paso 1 está ahí mismo. Revisarla lleva segundos, y corregirla antes del paso 2 sale más barato que encontrar el error en el informe final.

Cada paso puede usar sus propios ajustes. La extracción y la agrupación piden una temperatura baja y una salida estructurada que el código pueda analizar. El paso de redacción puede ser más libre. En código puedes incluso enviar pasos distintos a modelos distintos, como uno pequeño y rápido para la extracción.

Los fallos son locales. Cuando una cadena se rompe, sabes qué paso falló y vuelves a ejecutar solo ese.

Los costes también son reales. Una cadena hace más llamadas, así que tarda más y cuesta más que un solo prompt. Y un error que se cuela en un paso temprano se arrastra a todos los siguientes, por eso vale la pena revisar los pasos intermedios.

Cómo diseñar una cadena

  1. Escribe los pasos que darías a mano. Si primero harías una lista, luego la ordenarías y después la redactarías, son tres prompts. Los pasos que requieren tipos de pensamiento distintos son los puntos naturales para dividir.
  2. Decide el formato de salida de cada paso antes de escribir su prompt. Lo que consuma el siguiente paso debe ser fácil de leer y de revisar: un array JSON, una lista numerada, una tabla. La prosa libre solo está bien para el último paso.
  3. Pasa solo lo que necesita el siguiente paso. El paso 2 de arriba recibe la lista de quejas, no las reseñas. Menos entrada significa menos distracciones, y hace que cada paso se pueda probar por separado.
  4. Añade una comprobación entre pasos. En código, analiza el JSON y confirma que existen los campos. Para las decisiones de criterio, la comprobación puede ser a su vez un prompt: "¿Esta lista contiene todas las quejas de estas reseñas? Responde sí o no y luego enumera las que falten."
  5. Marca con claridad el material pegado. La entrada de cada paso es texto producido por un paso anterior, y los delimitadores evitan que el modelo lo lea como instrucciones nuevas.

Este es un paso de comprobación para la cadena de arriba, ejecutado sobre una versión de la salida del paso 1 a la que le faltaba una queja. Una comprobación así es un prompt aparte con una sola pregunta concreta, así que es más fácil acertarla que la propia extracción.

Revisar un paso antes de pasarlo
Compara las reseñas de las etiquetas <reviews> con la lista de quejas de las etiquetas <complaints>. ¿La lista contiene todas las quejas de las reseñas? Responde "Completa" o "Incompleta" en la primera línea. Si está incompleta, enumera cada queja que falte con su número de reseña. <reviews> 1. La batería murió a las 4 horas, y el cable de carga es demasiado corto. 2. Suenan genial. Aunque la app me cierra la sesión todo el tiempo. 3. Me encantan, pero la batería apenas me dura el trayecto a casa. 4. La app se cerró dos veces al emparejar, y la batería se gasta rápido. 5. El cable es tan corto que no puedo usarlos mientras cargan en mi escritorio. </reviews> <complaints> Reseña 1: La batería murió a las 4 horas Reseña 1: Cable de carga demasiado corto Reseña 2: La app cierra la sesión Reseña 3: La batería no dura un trayecto Reseña 4: La app se cerró al emparejar Reseña 5: Cable demasiado corto para usarlos cargando </complaints>
Try it
Example replyReplies vary between models and runs.

Incompleta

  • Reseña 4: la batería se gasta rápido

Si la comprobación dice "Incompleta", vuelve a ejecutar el paso 1 o añade a mano el elemento que falta antes de que se ejecute el paso 2.

Una cadena en código

En código, una cadena es una secuencia de llamadas en la que cada prompt se construye con la respuesta anterior. Esta versión usa el SDK de Python de Anthropic; la misma forma funciona con cualquier proveedor.

import json
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt):
    response = client.messages.create(
        model=MODEL,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

reviews = open("reviews.txt", encoding="utf-8").read()

complaints = ask(
    "List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
    'Return a JSON array of objects with the keys "review" and "complaint". '
    "Return only the JSON, with no code fence.\n\n"
    f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints)  # raises an error here if step 1 did not return valid JSON

themes = ask(
    "Group these complaints into themes. Return only a JSON array with the keys "
    '"theme", "count" and "reviews", sorted by count, highest first.\n\n'
    f"<complaints>\n{complaints}\n</complaints>"
)

note = ask(
    "Write a note of at most four sentences to the product team based on these "
    f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)

La línea json.loads es la comprobación más sencilla posible: si el paso 1 respondió con prosa, la cadena se detiene ahí en lugar de pasar una entrada defectuosa. Una cadena en producción también comprobaría los campos, reintentaría una vez un paso fallido y registraría cada resultado intermedio para que una mala respuesta final pueda rastrearse hasta el paso que la causó.

Encadenar en una app de chat

No necesitas código para encadenar prompts. Ejecuta el paso 1, lee la respuesta, corrige lo que esté mal y pégala en el prompt del paso 2. Hacer cada paso en un chat nuevo deja la conversación anterior fuera del contexto, así que una instrucción escrita para un paso no afecta al siguiente. Quedarte en un mismo chat es más rápido y funciona cuando los pasos están muy relacionados, pero todo el historial viaja con cada mensaje nuevo.

El encadenamiento frente a técnicas relacionadas

La cadena de pensamiento es razonamiento escrito dentro de una respuesta; una cadena de prompts son varias respuestas y tú controlas lo que pasa entre ellas. Las dos se combinan bien: cualquier paso de una cadena puede pedir razonamiento paso a paso.

En una cadena, los pasos los fijas tú de antemano. Cuando es el propio modelo el que decide qué paso viene después, como buscar, leer un resultado y luego elegir otra acción, el patrón es un bucle de agente, descrito en prompting ReAct. Las cadenas fijas son más fáciles de probar y de predecir, así que son el mejor punto de partida siempre que ya conozcas los pasos.

Preguntas frecuentes

¿Qué es el encadenamiento de prompts?

El encadenamiento de prompts es una técnica en la que divides una tarea en varios prompts que se ejecutan uno tras otro, y la salida de cada prompt se inserta en el siguiente. Por ejemplo, un prompt extrae las quejas de unas reseñas, un segundo las agrupa en temas y un tercero escribe un informe a partir de los temas.

¿Qué diferencia hay entre el encadenamiento de prompts y la cadena de pensamiento?

La cadena de pensamiento ocurre dentro de una sola respuesta: el modelo escribe su razonamiento antes de la respuesta. El encadenamiento de prompts usa varias llamadas separadas, y tú o tu código pasan el resultado de una a la siguiente. Puedes revisar, corregir o volver a ejecutar cualquier paso de una cadena, algo que no puedes hacer con el razonamiento dentro de una respuesta.

¿Puedo encadenar prompts en ChatGPT o Claude sin programar?

Sí. Ejecuta el primer prompt, revisa la respuesta y luego pégala en el siguiente prompt, en el mismo chat o en uno nuevo. Empezar un chat nuevo para cada paso evita que los borradores e instrucciones anteriores influyan en los pasos siguientes.

¿Cuándo debo encadenar prompts en lugar de usar uno solo?

Usa una cadena cuando un solo prompt pide varios tipos de trabajo distintos, como extraer, analizar y redactar, o cuando necesitas revisar o reutilizar un resultado intermedio. Si un solo prompt ya da una respuesta fiable, una cadena solo añade llamadas, coste y tiempo de espera.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR