Prueba un prompt con casos fijos
Probar un prompt es pasar un conjunto fijo de casos y aplicar una regla a cada respuesta. La regla es simple: una palabra debe aparecer, otra no, y la respuesta debe ser corta.
Sin prueba, un prompt cambiado que arregla el caso que tienes delante puede romper en silencio otros dos que no mirabas.
Al final de esta lección
Nota
Puedo decir si un prompt cambiado es mejor.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Caso | una entrada con la que pruebas |
| Regla | una comprobación simple sobre una respuesta |
| Referencia | el prompt con el que comparas |
| Regresión | un caso que pasaba y ahora falla |
| Pasa | una respuesta que cumple su regla |
| Grabada | una respuesta guardada para repetir la prueba |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
¿Qué son un caso y una regla?
Un caso es una entrada, como una viajera que pide un reembolso. Una regla es una comprobación que el código hace sobre la respuesta. «Contiene la palabra reembolso» es una regla. «Suena amable» no lo es, porque el código no puede comprobarlo.
Guarda un conjunto pequeño y fijo de casos. Pasa cada prompt por el mismo conjunto, para que lo único que cambie sea el prompt.
Prompt A y prompt B en tres casos
| Caso | Prompt A | Prompt B |
|---|---|---|
| reembolso | pasa | falla (dice lo siento) |
| retraso | falla | pasa |
| gracias | pasa | falla (menciona el retraso) |
| Total | 2 de 3 | 1 de 3 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Escribe el ayudante del modelo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el ayudante del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el probador de prompts, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const cases = [' ' { name: \"reembolso\", must: [\"reembolso\"], not: [\"lo siento\"], max: 25 },' ' { name: \"retraso\", must: [\"retraso\"], not: [], max: 25 },' ' { name: \"gracias\", must: [\"gracias\"], not: [\"retraso\"], max: 25 },' '];' 'const A = [\"Te devolveremos el reembolso en cinco días.\", \"El autobús llega tarde, pedimos disculpas.\", \"Gracias por tu mensaje.\"];' 'const B = [\"Lo siento, te devolveremos el reembolso en cinco días.\", \"Hay un retraso de diez minutos.\", \"Gracias. Lo siento por el retraso.\"];' > test5.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el probador de prompts, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function passes(reply, c) {' ' const low = reply.toLowerCase();' ' const long = reply.split(\" \").length > c.max;' ' const has = c.must.every(function (m) { return low.includes(m); });' ' const bad = c.not.some(function (n) { return low.includes(n); });' ' return has && bad === false && long === false;' '}' 'function run(replies) {' ' return replies.map(function (r, i) { return passes(r, cases[i]); });' '}' >> test5.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el probador de prompts, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const ra = run(A);' ' const rb = run(B);' ' const names = function (flags, other) {' ' return cases.filter(function (c, i) { return flags[i] && other[i] === false; }).map(function (c) { return c.name; });' ' };' ' console.log(\"A pasa \" + ra.filter(Boolean).length + \" de 3, B pasa \" + rb.filter(Boolean).length + \" de 3\");' ' console.log(\"mejora: \" + names(rb, ra).join(\", \") + \" | empeora: \" + names(ra, rb).join(\", \"));' ' const ask1 = \"Responde a una viajera que pide un reembolso, en menos de 25 palabras.\";' ' const reply = await ask([{ role: \"user\", content: ask1 }], A[0], 50);' ' console.log(\"la respuesta real cumple la regla del reembolso: \" + (passes(reply.text, cases[0]) ? \"sí\" : \"no\"));' '}' 'main();' >> test5.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta y compara dos prompts
docker exec -w /home/node/project agent node test5.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué imprime el Run
La primera línea dice que A pasa 2 de 3 y B pasa 1 de 3. La segunda dice que B mejora el caso del retraso y empeora reembolso y gracias. Así que te quedas con A.
Esas dos líneas usan respuestas grabadas, y todos los estudiantes ven lo mismo. La última línea comprueba una respuesta real y puede salir sí o no. Muestra que una respuesta real puede incumplir una regla. Sin modelo, antes imprime una Muestra grabada.
Un error frecuente
Advertencia
Mucha gente cree que un prompt es mejor si arregló el caso que le molestaba. Un caso es una sola muestra. Pasa todo el conjunto y cuenta lo que mejoró y lo que empeoró antes de decidir.