Prueba un prompt antes de entrenar
Una tienda online de bicicletas recibe mensajes de clientes y un modelo los reparte en montones: factura, envío, devolución. Falla con algunos, y el equipo piensa en entrenarlo.
Adaptar un modelo es cambiar el modelo con tus propios ejemplos. Cuesta tiempo, datos y cuidado. Muchos problemas que lo parecen se arreglan con un prompt mejor.
Al final de esta lección
Nota
Puedo comprobar si un prompt basta antes de pensar en entrenar.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Base | los resultados antes de cambiar nada |
| Caso | una entrada con respuesta correcta conocida |
| Porcentaje de acierto | el porcentaje de casos bien resueltos |
| Adaptar | cambiar un modelo con tus propios ejemplos |
| Objetivo | el porcentaje con el que quedas conforme |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Empieza por una base
Primero anota un conjunto de casos. Un caso es una entrada con la respuesta que quieres. Pasa tu prompt actual por todos los casos y cuenta los aciertos.
Esa cuenta es la base. Sin ella no puedes decir que un cambio ayudó. Mantén los casos fijos, para que cada prueba posterior sea justa.
Ejemplo resuelto: el clasificador de la tienda
| Tipo de mensaje | Casos | Aciertos de la base | Aciertos con el prompt mejor |
|---|---|---|---|
| factura | 2 | 2 | 2 |
| envío | 2 | 1 | 2 |
| devolución | 2 | 0 | 2 |
| tono | 2 | 0 | 0 |
| todos | 8 | 3 (37 %) | 6 (75 %) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué arregla un prompt y qué no
Un prompt arregla una instrucción que faltaba, un ejemplo que faltaba o una forma de salida equivocada. Es barato y se deshace en un segundo.
Le cuesta cuando el modelo debe seguir un estilo que nunca vio, o conocer datos que la ventana no cabe. Ahí puede compensar adaptar. Antes lee el módulo 68, que enseña a medir.
Un error frecuente
Advertencia
Mucha gente cree que una respuesta mala significa que el modelo necesita entrenamiento. Muchas veces el prompt nunca dijo lo que se quería. Revisa primero el prompt y unos ejemplos, y entrena solo si una prueba justa no muestra mejora real.
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 informe de la base, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '// Resultados grabados: 1 es que el clasificador acertó el montón del mensaje.' 'const kinds = [\"factura\", \"factura\", \"envio\", \"envio\", \"devolucion\", \"devolucion\", \"tono\", \"tono\"];' 'const baseline = [1, 1, 1, 0, 0, 0, 0, 0];' 'const prompted = [1, 1, 1, 1, 1, 1, 0, 0];' > adapt1.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 informe de la base, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function rate(list) {' ' let ok = 0;' ' for (const r of list) ok = ok + r;' ' return Math.floor((ok * 100) / list.length);' '}' 'function failing(list) {' ' const out = [];' ' list.forEach(function (r, i) {' ' if (r === 0 && out.includes(kinds[i]) === false) out.push(kinds[i]);' ' });' ' return out;' '}' >> adapt1.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 informe de la base, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"resultados grabados, 8 casos\");' ' console.log(\"base \" + rate(baseline) + \" %, siguen fallando: \" + failing(baseline).join(\", \"));' ' console.log(\"prompt mejor \" + rate(prompted) + \" %, siguen fallando: \" + failing(prompted).join(\", \"));' ' const q = \"En una frase, ¿puede un prompt enseñar a un modelo el estilo de escritura de una casa que nunca ha visto?\";' ' const sample = \"Un prompt puede mostrar unos ejemplos del estilo, pero no cambia lo que el modelo hace por defecto.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 40);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> adapt1.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 el informe de la base
docker exec -w /home/node/project agent node adapt1.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los resultados están grabados, no son en vivo
Las dos listas de resultados están grabadas y escritas en el script. No las hace un modelo, así que todos los estudiantes ven los mismos números. Solo la última línea llama al modelo del laboratorio, y sin modelo imprime una Muestra grabada.