Guarda prompts en archivos con versión y prueba
Una biblioteca de prompts es una carpeta de prompts guardados como archivos, cada uno con una versión y una prueba. Un prompt que vive en un mensaje de chat se pierde, se copia mal y lo edita quien lo encuentra.
En un archivo se puede revisar, probar y deshacer, como el código.
Al final de esta lección
Nota
Puedo guardar prompts en archivos con una versión y una prueba.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Biblioteca | una carpeta de prompts guardados como archivos | |
| Variable | un hueco con nombre que rellena el código | {nombre} |
| Versión | un número que dice qué edición es | |
| Registro de cambios | una lista de lo que cambió y por qué | |
| Regla | una frase que un prompt debe tener siempre | |
| Auditoría | una revisión de todos los prompts a la vez |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
¿Qué contiene un archivo de prompt?
Cada prompt es un archivo, como respuesta-reembolso.txt. Los huecos son variables entre llaves, como {nombre}, para que el código las rellene. Junto al archivo va un número de versión, y una línea del registro de cambios dice qué cambió.
Al lado va una prueba. La prueba guarda las reglas que el prompt debe contener siempre.
Qué te dice un número de versión
| Cambio | Sube | De 1.2.3 a |
|---|---|---|
| Corregir una errata | parche | 1.2.4 |
| Añadir un límite o un ejemplo | menor | 1.3.0 |
| Cambiar las variables, y los llamadores deben cambiar | mayor | 2.0.0 |
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 revisor de la biblioteca, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const OLD = \"Rol: Eres ayudante de una empresa de autobuses.\nTarea: Responde a {nombre} sobre un reembolso.\nLímites: Menos de 25 palabras. Nunca prometas una fecha.\";' 'const RULES = [\"menos de 25 palabras\", \"nunca prometas una fecha\"];' > lib6.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 revisor de la biblioteca, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function variables(text) {' ' const names = [];' ' for (const f of text.match(/\{[a-z_]+\}/g) || []) {' ' if (names.includes(f.slice(1, -1)) === false) names.push(f.slice(1, -1));' ' }' ' return names;' '}' 'function fill(text, values) {' ' const gone = variables(text).filter(function (n) { return (n in values) === false; });' ' if (gone.length > 0) return { ok: false, missing: gone };' ' let out = text;' ' for (const n of Object.keys(values)) out = out.split(\"{\" + n + \"}\").join(values[n]);' ' return { ok: true, text: out };' '}' >> lib6.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 revisor de la biblioteca, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function lost(oldText, newText) {' ' const o = oldText.toLowerCase();' ' const n = newText.toLowerCase();' ' return RULES.filter(function (r) { return o.includes(r) && n.includes(r) === false; });' '}' 'async function main() {' ' console.log(\"variables: \" + variables(OLD).join(\", \"));' ' const bad = fill(OLD, {});' ' console.log(\"rellenar sin valores: ok \" + bad.ok + \", falta \" + bad.missing.join(\", \"));' ' const edit = OLD.replace(\"Nunca prometas una fecha.\", \"\");' ' console.log(\"la edición pierde: \" + lost(OLD, edit).join(\", \"));' ' const filled = fill(OLD, { nombre: \"Mina\" });' ' const reply = await ask([{ role: \"user\", content: filled.text }], \"Hola, Mina: estamos revisando tu reembolso.\", 50);' ' console.log(\"modelo: \" + reply.text);' '}' 'main();' >> lib6.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 rechaza una mala edición
docker exec -w /home/node/project agent node lib6.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
Lista la variable y muestra que rellenar sin valores se rechaza y nombra la que falta. Después edita el prompt para quitar un límite y lista la regla que pierde la edición. Esa edición se rechazaría.
La última línea es una respuesta corta al prompt relleno. Sin modelo, antes imprime una Muestra grabada.
Un error frecuente
Advertencia
Mucha gente cree que un cambio pequeño en un prompt compartido es seguro. Una edición corta puede quitar un límite en el que confiaba otro código. Pasa siempre la prueba de reglas antes de guardar, por pequeña que sea la edición.