Mejor en una cosa, peor en otra
Un modelo ajustado saca mejor nota en la tarea para la que lo entrenaste. ¿Es mejor? Todavía no. Puede haber empeorado en otra cosa, o costar el doble de ejecutar.
Juzgar un modelo ajustado es compararlo con la base sobre los mismos casos, en cada área que importa.
Al final de esta lección
Nota
Puedo decir si un modelo ajustado es mejor que la base.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Mejora | los resultados ajustados menos los de la base |
| Margen | la mejora mínima que cuenta como real |
| Regresión | un caso que la versión ajustada ahora falla |
| Área | un tipo de caso, como el tono o el cálculo |
| Grabado | guardado de antes, no hecho en vivo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Compara sobre los mismos casos
Pasa las dos versiones por un conjunto fijo de casos que ninguna vio en el entrenamiento. Cuenta los aciertos de cada una. La diferencia es la mejora.
Una mejora de un caso sobre ocho es demasiado pequeña para fiarse. Decide el margen que necesitas antes de mirar, para que el resultado no te convenza de otra cosa.
Ejemplo resuelto: ocho casos, tres áreas
| Área | Aciertos de la base | Aciertos del ajustado | Cambio |
|---|---|---|---|
| mensajes | 2 de 4 | 3 de 4 | +1 |
| tono | 1 de 2 | 2 de 2 | +1 |
| cálculo | 2 de 2 | 1 de 2 | -1 |
| todas | 5 de 8 | 6 de 8 | +1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una respuesta mejor puede costar más
Un modelo ajustado puede responder con más palabras o necesitar un plan mayor para ejecutarse. Calcula cuánto sube el coste como porcentaje del coste de la base.
Fija antes lo máximo que aceptarás. Una mejora pequeña que duplica la factura casi nunca compensa.
Un error frecuente
Advertencia
Mucha gente cree que una nota más alta en la tarea entrenada prueba que el modelo es mejor. Solo prueba que es mejor ahí. Revisa las otras áreas, cuenta los casos que empeoraron y mira el coste antes de decidir.
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 comparación, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '// Grabado: 1 es acierto. Los mismos ocho casos para las dos versiones.' 'const cases = [' ' { id: \"c1\", area: \"mensajes\", base: 0, tuned: 1 }, { id: \"c2\", area: \"mensajes\", base: 0, tuned: 1 },' ' { id: \"c3\", area: \"mensajes\", base: 1, tuned: 1 }, { id: \"c4\", area: \"mensajes\", base: 1, tuned: 0 },' ' { id: \"c5\", area: \"tono\", base: 0, tuned: 1 }, { id: \"c6\", area: \"tono\", base: 1, tuned: 1 },' ' { id: \"c7\", area: \"calculo\", base: 1, tuned: 1 }, { id: \"c8\", area: \"calculo\", base: 1, tuned: 0 },' '];' > adapt5.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 comparación, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function total(which) {' ' let n = 0;' ' for (const c of cases) n = n + c[which];' ' return n;' '}' 'const worse = cases.filter(function (c) { return c.base === 1 && c.tuned === 0; });' 'const change = {};' 'for (const c of cases) change[c.area] = (change[c.area] || 0) + c.tuned - c.base;' >> adapt5.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 comparación, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"base \" + total(\"base\") + \" de 8, ajustada \" + total(\"tuned\") + \" de 8\");' ' console.log(\"empeoraron: \" + worse.map(function (c) { return c.id; }).join(\", \"));' ' console.log(\"cambio por área: \" + JSON.stringify(change));' ' const q = \"En una frase, ¿por qué hay que revisar áreas para las que no se hizo el ajuste?\";' ' const sample = \"Ajustar para una tarea puede empeorar en silencio otras, y solo una prueba sobre ellas lo muestra.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 40);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> adapt5.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 comparación
docker exec -w /home/node/project agent node adapt5.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 comparación
Los dos conjuntos de resultados están grabados y escritos en el script. El Run cuenta cada versión, lista los casos que empeoraron y muestra el cambio en cada área.
La última línea es una llamada corta al modelo, o una Muestra grabada.