Prompt engineering, medido: qué cambia la salida
Sesenta tickets, las mismas palabras en seis órdenes y precisión del 26,7 % al 85,0 %. Cuatro trucos de internet con barras de error.
En esta página
Aquí tienes un ticket de soporte y cuatro colas a las que podría ir.
The label on the parcel has my old surname on it.
-> billing / technical / shipping / accountPara enrutarlo necesitas tres cosas en el prompt: las definiciones de las colas, el ticket y la instrucción de elegir una. Tres bloques. Hay seis órdenes en los que puedes ponerlos, y los bloques contienen exactamente los mismos caracteres en los seis.
En sesenta tickets con respuestas conocidas, los seis órdenes puntúan entre 26,7 % y 55,0 %. Mueve los mismos dos bloques fuera del turno del usuario y dentro del turno del sistema, sin cambiar ni una palabra, y el mismo modelo puntúa 76,7 %. Envuelve el ticket en una etiqueta estilo XML y llega al 85,0 %.
Nada del modelo cambió. Nada de la tarea cambió. No se reescribió ni una palabra. Una oscilación de cincuenta y ocho puntos salió de ordenar el mismo texto.
Esa es la razón por la que existe este capítulo, y también la razón por la que es el tema más infestado de culto cargo de todo el campo. Los efectos son reales y grandes, lo que hace que cada anécdota parezca confirmada; y son inestables entre modelos y tareas, lo que significa que una anécdota es todo lo que suele ser la mayoría de los consejos. Así que este capítulo tiene una regla, y todo lo que contiene está subordinado a ella:
Un prompt se mide, no se debate. Cuatro variantes sobre veinte casos no distinguen nada.
El prompt es todo el estado
Enlace a la sección: El prompt es todo el estadoAntes de las mediciones, un hecho que explica en silencio la mitad de lo que sigue.
El modelo no tiene memoria. Entre dos llamadas no conserva nada: ni tu última pregunta, ni su propia última respuesta, ni el archivo que adjuntaste, ni el hecho de que ya se lo hayas pedido dos veces. Cada llamada empieza desde una máquina vacía, y lo único que esa máquina sabe es la secuencia de tokens que acabas de entregarle.
Lo que parece memoria en una interfaz de chat es tu cliente reenviando toda la conversación, cada turno, desde el principio. El modelo lo lee todo otra vez desde cero, cada vez. El capítulo 13 midió lo que cuesta esa relectura en un forward pass; el capítulo 16 lo convierte en una línea de una factura. Lo que importa aquí es la consecuencia para el diseño: el prompt no es un mensaje a un sistema que tiene estado. Es el estado.
Eso jubila una familia de confusiones. «El modelo olvidó lo que le dije» suele significar que nunca se le envió. «Ignoró mi instrucción anterior» suele significar que la instrucción se salió de la ventana cuando se truncó el historial. «Se comportó de forma distinta en producción» suele significar que producción monta un prompt diferente del que probaste. Nada de esto es un problema del modelo, y nada se arregla reformulando nada.
El banco de pruebas
Enlace a la sección: El banco de pruebasLa afirmación «este prompt es mejor» es una afirmación sobre una distribución, y no puedes ver una distribución mirando una salida. Lo que necesitas es aburrido: casos con respuestas conocidas, N variantes y un intervalo.
El harness son cincuenta líneas de TypeScript con la misma forma que el cliente del capítulo 14: una petición, un plazo, algo de concurrencia, un recuento. Reaparece en el capítulo 19 para evaluar un recuperador y en el capítulo 29 como golden set.
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };
async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
const out: R[] = new Array(xs.length);
let i = 0;
await Promise.all(
Array.from({ length: n }, async () => {
while (i < xs.length) {
const k = i++;
out[k] = await f(xs[k]);
}
}),
);
return out;
}
export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
const hits = await pooled(cases, concurrency, async (c) => {
const answer = await complete(v.build(c));
return answer.trim().toLowerCase() === c.expected;
});
return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}El número que vuelve no es el resultado. Esto sí:
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
const p = k / n;
const d = 1 + (z * z) / n;
const centre = (p + (z * z) / (2 * n)) / d;
const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}El capítulo 4 planteó el argumento y este capítulo lo cobra. Diecisiete aciertos de veinte son un 85 %, y su intervalo del 95 % va del 64 % al 95 %. Una variante que puntúa 13 de 20 —65 %, que parece claramente peor— tiene un intervalo del 43 % al 82 %. Esos dos intervalos se solapan en casi toda su longitud. Veinte casos no pueden distinguir un buen prompt de uno mediocre, y la mayoría de los consejos publicados sobre prompts se validaron con menos.
Sesenta casos, que es lo que usa este capítulo, siguen sin ser muchos. Bastan para ver efectos grandes y son lo bastante honestos para admitir cuándo no pueden ver los pequeños; y eso se admitirá varias veces más abajo.
Posición: las mismas palabras, seis órdenes
Enlace a la sección: Posición: las mismas palabras, seis órdenesTres bloques —las reglas R, el ticket T, la instrucción I— concatenados en un único mensaje de usuario. Las seis permutaciones, contenido idéntico byte a byte, sesenta casos cada una.
| orden de los tres bloques | aciertos | precisión, Wilson 95 % |
|---|---|---|
| reglas, instrucción, ticket | 33/60 | 55,0 % [42,5, 66,9] |
| reglas, ticket, instrucción | 30/60 | 50,0 % [37,7, 62,3] |
| ticket, reglas, instrucción | 22/60 | 36,7 % [25,6, 49,3] |
| instrucción, ticket, reglas | 21/60 | 35,0 % [24,2, 47,6] |
| instrucción, reglas, ticket | 17/60 | 28,3 % [18,5, 40,8] |
| ticket, instrucción, reglas | 16/60 | 26,7 % [17,1, 39,0] |
Del mejor al peor hay 28,3 puntos, y los intervalos no se solapan, así que esto no es una historia sobre ruido. Como cada brazo se puntúa sobre los mismos sesenta ítems, la pregunta más afilada es la emparejada: en los casos donde dos brazos discrepan, ¿qué tan desequilibrado está el reparto? Pasar del peor orden al mejor convirtió 21 casos en correctos y 4 en incorrectos: probabilidad emparejada exacta 0,0009.3
Lee la tabla por su forma, no por su ganador. Las dos mejores filas terminan con el ticket; las dos peores entierran la instrucción en medio o la arrastran después de los datos. Es el mismo fenómeno que Liu et al. llamaron Lost in the Middle: el material en los bordes de un prompt se usa con más fiabilidad que el material en el centro.4 El capítulo 16 pone precio a la ventana y el capítulo 24 mide el efecto correctamente en largo, donde el centro se hunde como se describe y la recuperación justo al final no reaparece. Aquí la regla práctica sale sola: tarea arriba, datos abajo, nada importante en medio.
Ahora mueve las mismas palabras entre turnos. El capítulo 11 estableció que la plantilla de chat no es decoración alrededor del modelo, sino parte de él: <|im_start|>system y <|im_start|>user son tokens reales que el modelo vio millones de veces durante el fine-tuning, exactamente en esas posiciones. Así que debería importar a qué lado de esos marcadores cae tu instrucción, y de hecho importa:
| dónde viven las mismas palabras | aciertos | precisión, Wilson 95 % |
|---|---|---|
| reglas e instrucción en el turno del sistema, ticket solo en el turno del usuario | 46/60 | 76,7 % [64,6, 85,6] |
| reglas en el turno del sistema, instrucción y ticket en el turno del usuario | 44/60 | 73,3 % [61,0, 82,9] |
| reglas e instrucción en el turno del sistema, instrucción repetida después del ticket | 42/60 | 70,0 % [57,5, 80,1] |
| los tres bloques en un único turno de usuario | 33/60 | 55,0 % [42,5, 66,9] |
Mover las reglas y la instrucción al otro lado del límite de la plantilla compró 21,7 puntos —19 casos ganados, 6 perdidos, probabilidad emparejada 0,0146— sin cambiarles ni un carácter. Esta es la respuesta concreta a system prompt frente a user prompt: no son dos maneras de decir lo mismo. Son dos posiciones de token distintas en una estructura con la que se entrenó el modelo, y la posición del sistema es donde pertenecen las instrucciones que se aplican a toda la conversación.
Fíjate también en la tercera fila. Repetir la instrucción después del ticket —un truco ampliamente recomendado— puntuó por debajo de decirla una sola vez. En este modelo, en esta tarea, decirlo dos veces fue peor que decirlo una.
Delimitadores, y la lección estadística escondida en ellos
Enlace a la sección: Delimitadores, y la lección estadística escondida en ellosMismo prompt, mejor colocación, sesenta casos. Lo único que cambia es lo que rodea el texto del ticket.
| cómo se delimita el ticket | aciertos | precisión, Wilson 95 % |
|---|---|---|
| una etiqueta estilo XML | 51/60 | 85,0 % [73,9, 91,9] |
| nada en absoluto | 48/60 | 80,0 % [68,2, 88,2] |
| un encabezado Markdown | 47/60 | 78,3 % [66,4, 86,9] |
una etiqueta, Ticket: | 46/60 | 76,7 % [64,6, 85,6] |
| vallas con almohadillas | 45/60 | 75,0 % [62,8, 84,2] |
| triple backticks | 44/60 | 73,3 % [61,0, 82,9] |
| comillas dobles | 40/60 | 66,7 % [54,1, 77,3] |
Dieciocho puntos de diferencia por puntuación. Pero mira los dos intervalos extremos: [73,9, 91,9] y [54,1, 77,3]. Se solapan. Según la lectura burda —compara las barras de error y, si se tocan, no digas nada— esta tabla no demuestra nada en absoluto.
La lectura burda aquí es incorrecta, y entender por qué vale más que la tabla. Cada variante se puntuó sobre los mismos sesenta tickets, así que las dos mediciones no son muestras independientes; están emparejadas. La mayor parte de la anchura de cada intervalo viene de una fuente de incertidumbre que ambos brazos comparten: si esos sesenta tickets son representativos. Y esa fuente se cancela cuando los comparas entre sí. Haz en cambio la pregunta emparejada y la respuesta es nítida: pasar de comillas dobles a la etiqueta XML convirtió 12 casos en correctos y 1 en incorrecto, probabilidad emparejada 0,0034. Esa es una diferencia real.
Y luego la misma prueba desinfla el titular. La etiqueta XML superó a la etiqueta simple Ticket: por 8,3 puntos, que es el número que un blog pondría en el título. Emparejado: 6 ganados, 1 perdido, probabilidad 0,1250. No establecido. Siete casos es todo lo que sostiene esa mejora famosa.
Así que hay dos preguntas con dos instrumentos distintos, y confundirlas es la forma en que los consejos sobre prompts se equivocan en ambas direcciones a la vez:
¿Qué tan bueno es este prompt? El intervalo de Wilson sobre su propia precisión. Amplio salvo que tengas cientos de casos. Este es el número que comunicas a alguien que decide si lanzar.
¿B es mejor que A? La prueba emparejada sobre los casos en los que discrepan. Mucho más sensible, porque la dificultad compartida del conjunto se cancela. Este es el número que usas para decidir entre dos candidatos.
El hallazgo general —que los modelos son muy sensibles, y de forma impredecible, a elecciones de formato que no cargan contenido semántico— no es nuevo. Sclar et al. variaron solo separadores, espaciado y mayúsculas/minúsculas en decenas de tareas y encontraron dispersiones de precisión lo bastante amplias como para invertir rankings de modelos publicados.5 La consecuencia práctica no es «usa etiquetas XML». Es que el formato es un hyperparameter, no cuesta nada barrerlo, y cualquier comparación entre dos modelos que fija un formato compara formatos tanto como modelos.
Cuántos ejemplos son realmente suficientes
Enlace a la sección: Cuántos ejemplos son realmente suficientesIn-context learning —mostrar al modelo ejemplos resueltos en el prompt y hacer que generalice a partir de ellos sin ninguna actualización de pesos— es la capacidad que hizo famoso a GPT-3.6 La pregunta práctica nunca es si funciona. Es cuántos ejemplos pagar.
Los ejemplos entran como turnos previos reales, alternando usuario y asistente, porque esa es la estructura con la que se entrenó la plantilla. Cada k se ejecutó con cinco extracciones aleatorias distintas de un pool disjunto de dieciséis tickets etiquetados:
| ejemplos | precisión media | peor y mejor extracción | dispersión entre extracciones |
|---|---|---|---|
| 0 | 76,7 % | — | — |
| 1 | 78,7 % | 78,3 – 80,0 % | 1,7 puntos |
| 2 | 83,7 % | 80,0 – 86,7 % | 6,7 puntos |
| 4 | 81,7 % | 78,3 – 86,7 % | 8,3 puntos |
| 8 | 83,7 % | 78,3 – 88,3 % | 10,0 puntos |
| 16 | 89,3 % | 85,0 – 93,3 % | 8,3 puntos |
Dos ejemplos compraron siete puntos. Los seis ejemplos siguientes no compraron nada medible: 83,7, luego 81,7, luego 83,7, una secuencia que deambula dentro de su propio ruido. Dieciséis compraron otros cinco puntos y medio. La curva no es una subida suave; es un escalón, una meseta y un escalón.
La columna que más importa es la última. En k = 8, qué ocho ejemplos elegiste por casualidad movió la precisión 10 puntos, más que toda la ganancia de pasar de dos ejemplos a ocho. Y la fila inferior es la versión más nítida: en k = 16 el pool se agota, así que las cinco ejecuciones contienen exactamente los mismos dieciséis ejemplos, con la única diferencia del orden en que aparecen. Solo el orden movió la precisión 8,3 puntos.
Ese es el resultado que reportaron Lu et al. y sobrevive allí donde se ha buscado: el orden de los ejemplos es un hyperparameter genuino con efectos comparables al número de ejemplos.7 Así que el consejo honesto sobre few-shot prompting no es un número. Es:
Empieza en cero y añade ejemplos solo contra una medición
Enlace a la sección: Empieza en cero y añade ejemplos solo contra una mediciónLos dos primeros suelen merecer la pena. Más allá de eso estás adivinando, y la apuesta cuesta tokens en cada llamada durante el resto de la vida del producto.
Trata la selección como parte del prompt
Enlace a la sección: Trata la selección como parte del promptDos ejemplos bien elegidos ganan a ocho elegidos sin cuidado. Si tus ejemplos venían de la parte superior de una hoja de cálculo, esa es la variable que debes barrer antes de añadir más.
Barre el orden una vez y luego congélalo
Enlace a la sección: Barre el orden una vez y luego congélaloEs gratis, es un efecto real y, a diferencia de la mayoría de este capítulo, no requiere reescritura para probarlo.
Comprueba el equilibrio de clases
Enlace a la sección: Comprueba el equilibrio de clasesCuatro ejemplos que son todos de la misma etiqueta enseñan al modelo la etiqueta, no la tarea. El colapso de este modelo hacia la cola que aparecía en último lugar es el mismo fallo con otro disfraz.
Cuatro frases de internet
Enlace a la sección: Cuatro frases de internetAhora el folclore. Cada una de estas es una sola frase antepuesta a un system prompt que por lo demás es idéntico, sobre los mismos sesenta casos.
| frase añadida al system prompt | aciertos | precisión, Wilson 95 % | emparejada contra la línea base |
|---|---|---|---|
| no se añade nada | 46/60 | 76,7 % [64,6, 85,6] | — |
| «Respira hondo y trabaja este problema con cuidado.» | 47/60 | 78,3 % [66,4, 86,9] | +4 / −3, p = 1,000 |
| «Esto es muy importante para mi carrera.» | 46/60 | 76,7 % [64,6, 85,6] | +5 / −5, p = 1,000 |
| «Eres una persona experta de primer nivel mundial en operaciones de atención al cliente, con veinte años de experiencia.» | 42/60 | 70,0 % [57,5, 80,1] | +3 / −7, p = 0,344 |
| «Te daré una propina de $200 si respondes correctamente.» | 41/60 | 68,3 % [55,8, 78,7] | +1 / −6, p = 0,125 |
| «Se te penalizará por cada ticket que envíes a la cola equivocada.» | 25/60 | 41,7 % [30,1, 54,3] | +3 / −24, p < 0,001 |
Cuatro de las cinco no hicieron nada. No «hicieron un poco»; nada que sesenta casos emparejados puedan ver. La persona experta y el soborno puntuaron ambos por debajo de la línea base intacta, e incluso esas caídas no superan la prueba emparejada: son ruido apuntando cuesta abajo.
La tercera fila es la que conviene digerir. «Esto es muy importante para mi carrera» produjo exactamente la misma precisión, 46 de 60, y cambiaron diez de las sesenta respuestas, cinco en cada dirección. La estadística resumen era idéntica y el comportamiento no. Si tu evaluación es un único número sobre un conjunto pequeño, un cambio que reescribe una sexta parte de tus salidas puede parecer un cambio que no hizo nada, y lo lanzarás creyendo que era gratis.
Y luego la amenaza, que es la única frase que movió la aguja y la movió 35 puntos hacia abajo, convirtiendo 24 casos de correctos a incorrectos. No es un artefacto de redondeo; es un comportamiento de modelo distinto. La lección no es «nunca amenaces a un modelo». Es que el encuadre emocional no es inerte. Desplaza la distribución, a veces con fuerza, en una dirección que nadie puede predecir leyendo la frase; precisamente por eso hay que medirlo en lugar de razonar sobre ello.
Una salvedad que este capítulo te debe: estas cinco frases se probaron en un modelo pequeño y una tarea. Algunas tienen respaldo publicado en otros sitios: «respira hondo» salió de un paper que buscó instrucciones con alta puntuación en vez de inventarlas, lo cual es una afirmación distinta y mejor que la que circuló después.8 Lo que generaliza no son las frases. Es que la lista que sobrevivió en posts de blog y la lista que sobrevive a la medición son dos listas distintas, y la única forma de saber cuál tienes delante es ejecutar el banco.
Por qué «no hagas» falla
Enlace a la sección: Por qué «no hagas» fallaUna regla que todo el mundo repite —di lo que quieres, no lo que no quieres— con la ausencia habitual de un número. Aquí está el número. El mismo requisito de formato, escrito de tres formas, con el modelo generando libremente para que pueda observarse el cumplimiento:
| cómo se escribe la regla de formato | la salida fue exactamente una palabra permitida | tokens de salida medios |
|---|---|---|
| «Responde con una palabra.» | 10/60 (16,7 %) | 2,6 |
| «No te expliques. No escribas una frase. No añadas puntuación.» | 1/60 (1,7 %) | 14,0 |
| ambas juntas | 41/60 (68,3 %) | 2,3 |
Tres prohibiciones rindieron peor que una instrucción y llevaron al modelo a escribir cinco veces más texto: lo contrario exacto de las tres a la vez. Añadir de nuevo la frase positiva lo rescató hasta el 68 %.
El mecanismo no es misterioso si recuerdas el capítulo 8. El modelo elige un siguiente token de una distribución condicionada por todo lo anterior, y una prohibición mete lo prohibido dentro de ese condicionamiento. No hay un operador de negación; hay un contexto en el que ahora aparece una palabra.
Y eso se puede medir directamente. Toma el prompt base y añade una línea: Do not use the shipping queue for software problems. Luego mira solo los cuarenta y cinco tickets que no son de envíos:
shipping elegida | probabilidad media sobre shipping | precisión global | |
|---|---|---|---|
| línea base | 11,1 % de los 45 casos | 0,131 | 76,7 % [64,6, 85,6] |
| después de prohibirla por su nombre | 37,8 % | 0,374 | 51,7 % [39,3, 63,8] |
Nombrar una cola para descartarla hizo que el modelo la eligiera tres veces más a menudo, casi triplicó la masa de probabilidad que le asignaba y costó 25 puntos de precisión global: 16 casos perdidos frente a 1 ganado, probabilidad emparejada 0,0003.
No pienses en un elefante, medido. La reescritura es siempre la misma: sustituye la prohibición por la regla positiva que la vuelve innecesaria. No «no uses envíos para problemas de software», sino «usa envíos solo cuando haya un paquete físico implicado».
El contraejemplo honesto: chain of thought que cuesta y no compensa
Enlace a la sección: El contraejemplo honesto: chain of thought que cuesta y no compensaEl capítulo 12 construyó chain of thought correctamente —primero como técnica de prompting,910 luego como algo entrenado con recompensas verificables— y terminó con una advertencia que aplazó hasta este capítulo: decirle a un modelo que piense paso a paso deja de ayudar cuando el modelo razona por sí solo, y puede perjudicar. Aquí está esa advertencia con una tabla debajo, en una tarea donde es fácil asumir que pensar más debe ser mejor.
Ambos brazos se leen con el mismo instrumento en la misma posición. La única diferencia es si una chain of thought que escribió el propio modelo se sienta antes en el contexto.
| brazo | aciertos | precisión, Wilson 95 % | tokens de salida extra por caso |
|---|---|---|---|
| sin chain of thought | 37/60 | 61,7 % [49,0, 72,9] | 0 |
| chain of thought, hasta 60 tokens | 34/60 | 56,7 % [44,1, 68,4] | 53,1 |
| chain of thought, hasta 200 tokens | 34/60 | 56,7 % [44,1, 68,4] | 97,7 |
La precisión bajó y el coste subió, y la propia regla de este capítulo se aplica al propio resultado de este capítulo: la caída es 7 casos ganados frente a 10 perdidos, probabilidad emparejada 0,629, lo que no queda establecido. Lo que sí queda establecido es que produjo noventa y ocho tokens de salida extra por llamada y no compró nada medible con ellos. La incertidumbre está por completo en el lado del beneficio. La factura es segura.
Una cadena que falla enseña más que una que funciona. Al pedirle que razonara sobre «Tu integración de Slack dejó de publicar mensajes después del martes», el modelo escribió:
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.Eso es un consejo competente de resolución de problemas y no es la tarea. Cuando se le pidió pensar, el modelo derivó hacia el género al que más se parece «piensa paso a paso sobre este ticket de soporte» en sus datos de entrenamiento, y luego respondió a una pregunta de clasificación con quinientos caracteres de razonamiento no relacionado en su propio contexto. Chain of thought ayuda en problemas con estado intermedio que merece la pena calcular: aritmética, búsquedas de varios saltos, satisfacción de restricciones. Enrutar una frase a uno de cuatro cubos no tiene estado intermedio. No hay nada que la cadena deba sostener, así que lo único que hace es añadir texto plausible que la decisión final tiene que sobrevivir.
Dos corolarios prácticos. Primero, para un modelo entrenado para razonar —los modelos RLVR del capítulo 12— la instrucción es peor que redundante: puede sustituir la cadena larga que el modelo habría producido por una corta, con forma de prompt. Y muestrear varias cadenas y votar, que es lo que hace self-consistency,11 no puede rescatar una tarea sin nada sobre lo que discrepar: multiplica el coste por el número de muestras para deshacer empates que no existen. El capítulo 12 midió ese intercambio donde sí aplica. Segundo, fíjate en lo que costó el propio andamiaje de comparación. Forzar la respuesta a una línea Final queue: bajó el brazo sin razonamiento del 76,7 % al 61,7 %. Quince puntos, pagados para hacer comparables los dos brazos. La estructura que existe para tu comodidad tampoco es gratis.
La misma llamada, dos veces
Enlace a la sección: La misma llamada, dos vecesUna última medición, porque es la pregunta que todo el mundo hace después del primer resultado sorprendente. Sesenta prompts, greedy decoding, ejecutados repetidamente:
- La misma llamada repetida con todo fijo devolvió probabilidades idénticas bit a bit. Determinista.
- La misma llamada agrupada en batch con vecinos distintos —tamaños de batch 1, 4, 12, 30 y 60— devolvió probabilidades que diferían hasta 0,0128. La etiqueta elegida no cambió nunca, en 0 de 60 casos.
La etiqueta sobrevivió porque tenía margen: entre los sesenta casos, la brecha más estrecha entre las dos colas principales fue 0,0459, tres veces y media la deriva. La estabilidad no era una propiedad del algoritmo. Era un margen, y los márgenes se acaban. El capítulo 17 es donde vive la razón aritmética y donde se desmontan los mandos de muestreo que ensanchan y estrechan esas brechas. La razón para plantarlo aquí es que limita lo que puede significar cualquier medición de prompts: el banco mide un sistema reproducible solo hasta una tolerancia, y una diferencia de dos puntos entre variantes cae dentro de esa tolerancia en un mal día.
Deja de opinar y empieza a buscar
Enlace a la sección: Deja de opinar y empieza a buscarTodo lo anterior es un humano eligiendo una variante y una máquina puntuándola. El siguiente paso obvio es dejar que la máquina elija también las variantes.
APE hace exactamente eso: un modelo propone instrucciones candidatas, se puntúan sobre ejemplos retenidos y las mejores sobreviven.8 Las instrucciones que encuentra a menudo son cosas que ningún humano escribiría, que es precisamente la cuestión: la búsqueda es sobre lo que puntúa, no sobre lo que suena profesional.
DSPy va más lejos y es la idea más útil para un producto.12 Declaras qué toma y devuelve cada paso de un pipeline, y el framework lo compila en prompts, selecciona demostraciones y optimiza instrucciones contra tu métrica. Cambias de modelo y recompilas en lugar de reescribir. El prompt deja de ser código fuente que alguien ajusta a mano y se convierte en un artefacto generado contra una métrica, que es lo que debería haber sido desde el principio.
Ninguno elimina la necesidad del banco. Ambos lo convierten en lo único que necesitas, porque un optimizador sin métrica no optimiza nada.
Queda la disciplina. Los prompts pertenecen al control de versiones, en archivos, junto al código que los envía; no en una fila de base de datos que alguien editó un martes. Necesitan un identificador de versión almacenado junto a cada salida que produjeron, o el día que algo regrese no podrás averiguar qué cambió. Necesitan el banco en integración continua, porque un prompt es la única parte de tu sistema que un proveedor puede invalidar en silencio desplegando un modelo nuevo. Y necesitan casos: no cien casos ingeniosos, solo los veinte aburridos que se rompieron el trimestre pasado, guardados para siempre. El banco es el entregable. El prompt es un subproducto suyo.
A dónde va esto ahora
Enlace a la sección: A dónde va esto ahoraTodo lo de este capítulo se midió en precisión. Cada una de esas variantes también tiene un precio.
El system prompt que compró 21,7 puntos se envía en cada llamada, para siempre. Los dos ejemplos que compraron siete puntos se envían en cada llamada, para siempre. Los dieciséis que compraron doce se envían en cada llamada, para siempre, y son aproximadamente diez veces más largos que la pregunta que hizo realmente el usuario. La chain of thought que no compró nada produjo noventa y ocho tokens extra por petición, y los tokens de salida son los caros.
Nada de eso es visible en una tabla de precisiones, y todo es visible en una factura.
El capítulo 16 trata de la unidad en la que realmente se denominan esas decisiones. El token como unidad de facturación, la context window como presupuesto en lugar de memoria, por qué una conversación de cuarenta turnos cuesta mucho más que cuarenta veces el primer turno, qué paga y qué no paga el prompt caching, y por qué el orden de tu prompt decide si la caché acierta siquiera; lo que resulta ser una segunda razón, totalmente económica, para poner primero el material estable y al final el material variable.
Fuentes y método
Enlace a la sección: Fuentes y métodoEl banco y todas las tablas se produjeron con Qwen/Qwen2.5-0.5B-Instruct bajo greedy decoding, así que se reproducen exactamente. La documentación de Hugging Face sobre plantillas de chat es la referencia de a qué se expanden realmente los marcadores de plantilla del capítulo 11, y del hecho de que un modelo enviado con la plantilla equivocada es un fallo real y recurrente. Para los efectos de posición y formato a escala de producción en lugar de escala de laboratorio, las citas anteriores son las fuentes primarias; las guías de prompting de los proveedores son útiles por sus ejemplos y conviene leerlas sabiendo que ninguna publica un intervalo.
Referencias
Enlace a la sección: Referencias-
Anthropic, Effective context engineering for AI agents (29 de septiembre de 2025), por la distinción prompt frente a contexto usada en este capítulo y desarrollada en el capítulo 24. ↩
-
Zhao, Z., Wallace, E., Feng, S., Klein, D. and Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Sesgo de etiqueta mayoritaria, de recencia y de common-token, y por qué la rotación en el banco de este capítulo no es opcional. ↩
-
McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), pp. 153–157 (1947). Las comparaciones emparejadas de este capítulo usan la forma binomial exacta en lugar de la aproximación chi-cuadrado, porque los recuentos discordantes son pequeños. ↩
-
Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Citado aquí por el efecto de posición; medido en largo en el capítulo 24. ↩
-
Sclar, M., Choi, Y., Tsvetkov, Y. and Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Solo los separadores y el espaciado mueven la precisión lo suficiente para reordenar rankings de modelos. ↩
-
Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). El paper que presentó in-context learning como una capacidad y no como una curiosidad; la sección 3 es la fuente del vocabulario zero-shot / one-shot / few-shot que ahora usa todo el mundo. ↩
-
Lu, Y., Bartolo, M., Moore, A., Riedel, S. and Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). El resultado reproducido en la tabla few-shot anterior. ↩
-
Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Prompt engineering automático por propuesta y puntuación. La instrucción tan citada «respira hondo» viene de Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), que la encontró por búsqueda en una tarea con un modelo; una afirmación que no sobrevivió intacta al viaje hacia los posts de blog. ↩ ↩2
-
Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022). ↩
-
Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. and Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). El resultado de «pensemos paso a paso», y merece la pena leerlo para ver lo estrechas que eran las condiciones. ↩
-
Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Medido con su coste adjunto en el capítulo 12. ↩
-
Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023). ↩