Cuatro partes forman un prompt claro
Un prompt es el texto que envías a un modelo de lenguaje. El modelo lee solo ese texto, así que no puede adivinar lo que querías añadir.
«Cuéntame algo del partido» da una respuesta distinta cada vez. Un prompt con rol, tarea, límites y formato da una respuesta que puedes usar.
Al final de esta lección
Nota
Puedo convertir una petición vaga en un prompt con rol, tarea, límites y formato.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Prompt | el texto que envías a un modelo |
| Rol | quién debe ser el modelo |
| Tarea | el único trabajo que hacer ahora |
| Límites | hasta dónde puede llegar la respuesta |
| Formato | la forma que debe tener la respuesta |
| Lista de comprobación | una lista de cosas que marcar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
¿Cuáles son las cuatro partes de un prompt?
El rol dice quién es el modelo. La tarea dice el único trabajo. Los límites dicen hasta dónde puede llegar, por ejemplo en longitud o en fuentes. El formato dice la forma de la respuesta, como una frase o una lista.
Pon cada parte en su propia línea, con una etiqueta. Así el prompt se lee y se comprueba fácilmente.
La misma petición, mal y bien
| Parte | Vaga | Clara |
|---|---|---|
| Rol | (nada) | Eres periodista de un club deportivo. |
| Tarea | Cuéntame algo del partido. | Escribe un titular sobre el resultado de abajo. |
| Límites | (nada) | Una frase. Usa solo los datos dados. |
| Formato | (nada) | Texto plano, sin título. |
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 comprobador de prompts, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const vague = \"Cuéntame algo del partido.\";' 'const good = [' ' \"Rol: Eres periodista de un club deportivo.\",' ' \"Tarea: Escribe un titular sobre el resultado del partido.\",' ' \"Límites: Una frase. Usa solo los datos dados.\",' ' \"Formato: Texto plano, sin título.\",' ' \"Datos: Unión Ribera 3, Deportivo Colina 1. Dos goles de Sara.\",' '].join(\"\n\");' > say1.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 comprobador de prompts, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const PARTS = [\"Rol\", \"Tarea\", \"Límites\", \"Formato\"];' 'function missing(prompt) {' ' const lines = prompt.split(\"\n\");' ' const gone = [];' ' for (const part of PARTS) {' ' const has = lines.some(function (l) {' ' return l.startsWith(part + \": \") && l.length > part.length + 2;' ' });' ' if (has === false) gone.push(part);' ' }' ' return gone;' '}' >> say1.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 comprobador de prompts, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const p of [vague, good]) {' ' const gone = missing(p);' ' console.log(\"puntuación \" + (4 - gone.length) + \" de 4, falta: \" + (gone.join(\", \") || \"nada\"));' ' }' ' const sample = \"La Unión Ribera ganó 3 a 1 al Deportivo Colina, con dos goles de Sara.\";' ' const reply = await ask([{ role: \"user\", content: good }], sample, 60);' ' console.log(\"modelo: \" + reply.text);' '}' 'main();' >> say1.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 puntúa dos prompts
docker exec -w /home/node/project agent node say1.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
Las dos primeras líneas puntúan el prompt vago y el bien escrito. El vago saca 0 de 4 y le faltan las cuatro partes. El bien escrito saca 4 de 4.
La última línea es una respuesta corta del modelo del laboratorio. Sin modelo, antes imprime una Muestra grabada. Las palabras de una respuesta pueden cambiar en cada ejecución, y es normal.
Un error frecuente
Advertencia
Mucha gente cree que un prompt más largo es un prompt mejor. No es así. Un prompt es mejor cuando cada parte está y dice una sola cosa. Añade una línea solo si limita la respuesta o le da forma.