Prompting


Un prompt es el texto que colocas frente al modelo antes de que este haga su predicción. Esa es la idea central que este capítulo va a afinar: un prompt no es una orden que le das a una mente, es el contexto que armas para que la respuesta que quieres se convierta en la continuación más probable.
Qué es realmente un prompt
Mismo modelo, dos prompts. "Escribe sobre el cambio climático" te da un ensayo que se va por las ramas y que no pediste. "Escribe tres oraciones sobre las principales causas del cambio climático para un niño de 12 años, sin estadísticas" te da algo que sí puedes usar. El modelo no cambió entre esas dos llamadas. Lo que cambió fue el contexto, y el resultado siguió ese cambio.
El capítulo anterior explicó cómo un modelo genera texto prediciendo el token más probable, guiado por todo lo que tiene enfrente. Un prompt es justamente "todo lo que tiene enfrente". Esta es la definición que vale la pena quedarse: un prompt no es una petición que le haces a una persona, es el contexto que preparas para que la continuación que esperas sea la que el modelo considere más probable.
Ese cambio de perspectiva cambia cómo escribes. No estás convenciendo ni dando órdenes a alguien. Estás organizando texto para que la respuesta que quieres sea lo más probable que venga a continuación. Cada técnica de este capítulo es una forma distinta de lograr eso, y todas cobran más sentido cuando puedes ver la máquina de predicción que hay detrás.
Los tres roles
Cuando le hablas a un modelo a través de código, no envías un solo bloque de texto. Envías una lista de mensajes, y cada mensaje lleva un rol que marca de dónde vino. Hay tres:
- system: tus instrucciones permanentes. Quién debe actuar el modelo, las reglas que sigue, el formato que quieres. Se define una vez y aplica a toda la conversación.
- user: un mensaje de la persona que usa tu aplicación. La solicitud en sí.
- assistant: un mensaje que el modelo generó antes. Así es como una conversación mantiene su historial.
messages = [
{"role": "system", "content": "You are a concise assistant for a cooking app. Answer in one sentence."},
{"role": "user", "content": "What can I use instead of butter in cookies?"},
]Detrás de escena, esos roles no son canales separados hacia el modelo. Se aplanan en un solo flujo de texto con tokens especiales de marcado alrededor de cada mensaje, y ese flujo completo es a partir de lo que el modelo predice. Los roles importan porque el modelo fue entrenado con conversaciones organizadas así, así que aprendió a tratar el contenido de system como las reglas permanentes con autoridad, y el contenido de user como la solicitud que debe responder.
El mensaje system es el que los principiantes subutilizan. Ahí es donde defines el comportamiento que quieres en cada turno: el tono, la audiencia, el formato, las cosas que el modelo nunca debe hacer. Pon ahí las reglas duraderas, y pon la solicitud específica en el mensaje user.
Como el modelo no tiene memoria entre solicitudes, el rol assistant también es la forma de reproducir lo que se dijo antes: para continuar una conversación, envías el intercambio anterior de vuelta como mensajes assistant y user. Verás más de esto cuando empieces a llamar modelos desde código.
system, user o assistant. Esas etiquetas se aplanan en un solo flujo de texto a partir del cual predice el modelo, pero fue entrenado para tratar system como reglas con autoridad y user como la solicitud. Pon las instrucciones duraderas en system, la petición específica en user, y reproduce los mensajes anteriores de assistant y user para cargar el historial de una conversación. Lo específico le gana a lo vago
Dos prompts, un modelo. "Escribe sobre el cambio climático" devuelve un ensayo genérico de longitud y tono impredecibles. "Escribe un resumen de tres oraciones sobre las principales causas del cambio climático, para un niño de 12 años, en lenguaje sencillo, sin estadísticas" devuelve algo cercano a lo que tenías en mente. Misma máquina, resultados completamente distintos, y la única diferencia es cuánto precisaste.
La razón se remonta al ciclo de predicción. En cada paso, el modelo elige entre un abanico de continuaciones plausibles. Un prompt vago deja ese abanico amplio, así que el modelo llena los espacios con lo que sea más común en general, que rara vez es exactamente lo que tenías en mente. Un prompt específico estrecha ese abanico hacia la respuesta que quieres, antes de que el modelo escriba un solo token.
# vague: the model decides length, tone, audience, format
"Write about climate change."
# specific: you decide
(
"Write a 3-sentence summary of the main causes of climate change, "
"for a 12-year-old, in plain language, with no statistics."
)La versión vaga podría continuar de mil maneras razonables, y te tocará una al azar. La versión específica descarta casi todas esas opciones de antemano. Cuando escribas un prompt, di lo que realmente quieres:
- Formato: una oración, una lista, JSON, una tabla.
- Longitud: un párrafo, tres viñetas, menos de 50 palabras.
- Audiencia: un principiante, un experto, un niño de 12 años.
- Qué hacer cuando no está seguro: "Si el texto no lo dice, responde 'no especificado' en vez de adivinar."
Esa última pesa más de lo que parece. Si lo dejas a su suerte, el modelo llena un vacío con una suposición segura de sí misma, porque una suposición fluida es la continuación probable. Darle explícitamente la opción de decir "no lo sé" hace que ese sea el camino probable en su lugar, y es uno de los pocos movimientos a nivel de prompt que reduce el problema de las alucinaciones del capítulo anterior. La especificidad estrecha las opciones del modelo antes de que escriba un token.
Muéstrale ejemplos
A veces la forma más clara de preparar la continuación correcta es mostrarla. Poner unos cuantos ejemplos resueltos en el prompt se llama few-shot prompting (sin ejemplos es zero-shot). Funciona porque el modelo es, en el fondo, un continuador de patrones: dale dos o tres ejemplos de entrada seguida de la salida correcta, y lo más probable que venga después es el mismo patrón aplicado a tu nueva entrada.
messages = [
{"role": "system", "content": "Label each review as POSITIVE, NEGATIVE, or NEUTRAL. Reply with only the label."},
{"role": "user", "content": "The food was cold and slow to arrive."},
{"role": "assistant", "content": "NEGATIVE"},
{"role": "user", "content": "Decent meal, nothing special."},
{"role": "assistant", "content": "NEUTRAL"},
{"role": "user", "content": "Best burger I have had in years!"},
]
# the model now answers: POSITIVELos dos ejemplos completados establecen el patrón exacto: una sola palabra, en mayúsculas, de un conjunto fijo. Continuar ese patrón para la tercera reseña ahora es mucho más probable que escribir un párrafo de análisis, así que eso es lo que obtienes. Por eso un par de ejemplos claros a menudo le gana a un párrafo de descripción, especialmente para clasificación y formateo: estás mostrando la forma del resultado en vez de describirla y esperar que funcione. Elige ejemplos que cubran los casos difíciles, ya que el modelo se moldea según lo que le muestras, incluyendo cualquier error que haya en tus ejemplos.
Pídele que razone
Aquí va una de las ideas más útiles del prompting, y una de las menos intuitivas, y se desprende directamente de cómo funciona el modelo. El modelo genera un token a la vez, y el único espacio de trabajo que tiene es el texto que ya escribió. No tiene un borrador oculto donde pueda resolver en silencio un problema difícil antes de responder. Su "pensamiento", tal como es, ocurre en voz alta, en los tokens que produce.
Así que si haces una pregunta de varios pasos y exiges solo la respuesta final, estás forzando al modelo a saltar directo al final en un solo token, sin espacio para trabajar, y en cualquier cosa que involucre razonamiento, matemáticas o lógica, a menudo salta mal. La solución es dejarlo trabajar a la vista. Pídele que exponga sus pasos antes de la respuesta:
messages = [
{"role": "system", "content": "Work through the problem step by step, then give the final answer on its own line."},
{"role": "user", "content": "A shop sells pens at 3 for $2. How much do 12 pens cost?"},
]
# without "step by step", models often blurt a wrong number
# with it, the model writes out the working, and each step makes the next more reliableEsto se llama chain-of-thought (cadena de pensamiento), y la razón por la que funciona es mecánica, no mágica. Cada paso que el modelo escribe se convierte en parte del contexto que lee para el siguiente token, así que escribir "12 lápices son 4 grupos de 3" hace que "4 grupos por $2 son $8" sea la continuación natural y probable. Le estás dando al modelo espacio para calcular sobre la marcha en vez de exigirle la respuesta en un salto imposible. "Piensa paso a paso" o "muestra tu procedimiento" es la versión cotidiana de esto.
Dos advertencias. El razonamiento escrito sigue siendo texto generado, así que puede parecer sólido y llegar a una respuesta incorrecta, y no deberías tratarlo como una prueba garantizada. Y algunos modelos más nuevos hacen este tipo de trabajo internamente sin que se les pida. Pero el principio subyacente es duradero, sin importar qué modelos vengan después: un modelo razona mejor cuando tiene espacio para escribir los pasos, porque su propio resultado es el único lugar donde puede pensar.
Estructura el prompt
A medida que los prompts crecen, la estructura mantiene el contexto claro para que el modelo pese cada parte correctamente. Algunos hábitos ayudan:
- Pon las instrucciones primero y los datos al final. Indica qué hacer, y luego proporciona el texto sobre el cual hacerlo.
- Separa las instrucciones de los datos con delimitadores. Envuelve cualquier texto proporcionado en marcadores claros para que el límite entre tus reglas y la entrada sea inequívoco.
- Pide explícitamente la forma del resultado. Si quieres JSON, dilo, y describe los campos.
prompt = f'''Summarise the customer message below in one sentence.
Then list any product names it mentions.
Customer message:
"""
{user_message}
"""'''Las comillas triples son un delimitador. Marcan que "todo lo que está aquí dentro es dato a procesar, no instrucción a seguir". Esto no es solo prolijidad, y aquí la perspectiva de la predicción muestra por qué es una salvaguarda real.
Para el modelo, todo es un solo flujo de texto, así que si la entrada del usuario fluye directo hacia tus instrucciones sin ningún límite, un usuario puede escribir "ignora lo anterior y haz esto en su lugar" y el modelo no tiene forma confiable de distinguir esa línea de tus instrucciones reales. Es muy probable que continúe obedeciéndola.
Ese ataque se llama inyección de prompts, y mantener las instrucciones y los datos no confiables claramente delimitados es la primera línea de defensa, tema que se cubre en Seguridad y límites. Para el modelo, todo es un solo flujo de texto, así que delimita la entrada no confiable.
En la práctica
Aquí hay un prompt que combina varias de estas ideas: un mensaje de system con reglas duraderas, una solicitud específica, un ejemplo para fijar el formato, y datos claramente delimitados.
messages = [
{
"role": "system",
"content": (
"You extract action items from meeting notes. "
"Reply with a numbered list, one action per line, each starting with a verb. "
"If there are no action items, reply 'None'."
),
},
{"role": "user", "content": 'Notes: """We agreed Sam will send the budget by Friday and Lee will book the venue."""'},
{"role": "assistant", "content": "1. Send the budget by Friday (Sam)\n2. Book the venue (Lee)"},
{"role": "user", "content": f'Notes: """{meeting_notes}"""'},
]El mensaje de system fija las reglas una sola vez, el ejemplo fija el formato exacto, y cada solicitud entrega datos delimitados. Cada pieza organiza el contexto para que el resultado que quieres sea la continuación probable. Ese es todo el oficio: esto es un prompt confiable, no uno que funcionó por suerte. A continuación enviarás mensajes como estos a un modelo desde código real en Llamar modelos desde código.
system con reglas duraderas, una solicitud específica, un ejemplo que fija el formato, y datos claramente delimitados. Cada pieza organiza el contexto para que el resultado que quieres sea el texto probable siguiente. Ese es el oficio, un prompt que funciona por diseño y no por suerte. 
