Un modelo ajustado puede quedarse viejo
La deriva es que un modelo empeore con el tiempo sin que nadie lo cambie. El mundo sigue. Llegan productos nuevos, palabras nuevas y tipos de mensaje nuevos, y el modelo se ajustó con los del año pasado.
Si nadie vigila la nota, la primera señal es un cliente enfadado.
Al final de esta lección
Nota
Puedo darme cuenta de que un modelo ajustado se ha quedado viejo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Deriva | un modelo que empeora porque el mundo cambia |
| Seguimiento | mirar una nota una y otra vez |
| Disparador | una señal que dice actúa ahora |
| Calendario | una fecha fija para actuar, pase lo que pase |
| Reentrenamiento | ajustar otra vez con ejemplos más nuevos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Vigila una nota cada semana
Guarda un conjunto pequeño de casos nuevos y puntúa el modelo con ellos cada semana. Anota los números. Las primeras semanas tras una versión te dan una base.
Una mala semana puede ser casualidad. Exige dos semanas seguidas por debajo de tu línea de alerta antes de decir que la nota ha bajado.
Ejemplo resuelto: notas semanales
| Semanas | Notas | Qué muestra |
|---|---|---|
| 1 a 3 | 88, 90, 89 | Base 89 (la media, redondeada hacia abajo) |
| 4 a 6 | 88, 87, 86 | Un pequeño bajón, por encima de la línea de alerta de 84 |
| 7 y 8 | 80, 79 | Dos semanas por debajo de 84: la nota ha bajado |
| 9 a 12 | 78, 79, 77, 76 | Se mantiene baja |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Busca la causa en las entradas
Cuando la nota baja, lee las entradas nuevas. ¿Traen palabras, productos o temas que los datos de entrenamiento nunca tuvieron? Haz la lista de las palabras nuevas.
Eso te dice qué ejemplos añadir. Una lista larga de palabras nuevas es una señal clara de que las entradas han cambiado.
Un disparador o un calendario
Un calendario reentrena en una fecha fija, por ejemplo cada cuarta semana. Es sencillo, pero puede reentrenar cuando nada cambió, o tarde cuando algo cambió.
Un disparador reentrena cuando la nota baja. Actúa con pruebas. Muchos equipos usan primero el disparador y dejan el calendario como red de seguridad.
Un error frecuente
Advertencia
Mucha gente cree que un modelo ajustado sigue bien una vez que pasa sus pruebas. Las pruebas solo describen el día en que se hicieron. Sigue puntuando casos nuevos, y reentrena y compara de nuevo cuando la nota baje.
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 la comprobación de deriva, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '// Notas semanales grabadas de un clasificador de mensajes, en porcentaje. La semana 1 es la primera.' 'const scores = [88, 90, 89, 88, 87, 86, 80, 79, 78, 79, 77, 76];' 'const THRESHOLD = 5;' > adapt6.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 la comprobación de deriva, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function baseline(list) {' ' return Math.floor((list[0] + list[1] + list[2]) / 3);' '}' 'function findDrop(list, drop) {' ' const cut = baseline(list) - drop;' ' for (let i = 3; i < list.length - 1; i++) {' ' if (list[i] < cut && list[i + 1] < cut) return i + 1;' ' }' ' return 0;' '}' >> adapt6.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 la comprobación de deriva, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function newWords(oldTexts, newTexts) {' ' const seen = oldTexts.join(\" \").toLowerCase().split(\" \");' ' const out = [];' ' for (const w of newTexts.join(\" \").toLowerCase().split(\" \")) {' ' if (seen.includes(w) === false && out.includes(w) === false) out.push(w);' ' }' ' return out;' '}' >> adapt6.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 la comprobación de deriva, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"base \" + baseline(scores) + \" %, alerta por debajo de \" + (baseline(scores) - THRESHOLD) + \" %\");' ' console.log(\"la nota bajó en la semana \" + findDrop(scores, THRESHOLD));' ' console.log(\"palabras nuevas: \" + newWords([\"dónde está mi paquete\"], [\"dónde está mi patinete\", \"código taquilla\"]).join(\" \"));' ' const q = \"En una frase, ¿por qué un modelo puede empeorar aunque nadie lo haya cambiado?\";' ' const sample = \"El mundo y las entradas cambian, así que un modelo ajustado con entradas viejas encaja peor con las nuevas.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 40);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> adapt6.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 la comprobación de deriva
docker exec -w /home/node/project agent node adapt6.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que imprimió la comprobación
Las doce notas están grabadas y escritas en el script. La comprobación calcula la base, halla la semana en que bajó la nota y lista las palabras nuevas de unos mensajes inventados.
La última línea es una llamada corta al modelo, o una Muestra grabada.