Un modelo nuevo responde distinto
Cambiar el modelo de una función es ejecutar los mismos casos en las dos versiones. Después se mueve a los usuarios poco a poco. Importa porque una versión nueva es mejor de media y peor en algunos casos, y tus usuarios los encuentran primero.
Ningún laboratorio de aquí entrena ni sirve un modelo, así que esta lección compara dos versiones grabadas. El método es el que usarías de verdad.
Al final de esta lección
Nota
Puedo decidir, a partir de dos ejecuciones grabadas, si paso una función a otro modelo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Regresión | un caso que pasaba antes y falla ahora |
| Canario | una pequeña parte de usuarios que pasa primero |
| Vuelta atrás | el camino de regreso a la versión antigua |
| Cubo | un número fijo en el que cae siempre un usuario |
| Subida de coste | el porcentaje de más que cuesta la versión nueva |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Ejecuta las dos versiones con los mismos casos
Usa los mismos casos para las dos versiones y anota de cada caso si pasó y cuánto costó. Compara cuántos pasan, pero lista también las regresiones.
Dos versiones con el mismo total pueden diferir: una puede fallar un caso que la otra pasaba. Una regresión en un caso importante puede pesar más que una media mejor.
Ejemplo resuelto: antigua y nueva en seis casos
| Versión | Pasan | Coste | Regresiones |
|---|---|---|---|
| Antigua | 5 de 6 | 180 | ninguna |
| Nueva | 5 de 6 | 144 | c3 pasaba antes y falla ahora |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mueve primero una parte pequeña
No cambies a todos de golpe. Envía una parte pequeña de usuarios a la versión nueva y observa. Elige a los usuarios con una regla fija, para que la misma persona reciba siempre la misma versión.
Mantén la versión antigua en marcha para volver en un paso. Y mira la factura: un cambio de precio puede borrar la ganancia, así que fija la subida que aceptas antes de mirar.
Un error frecuente
Advertencia
Mucha gente cree que un modelo más nuevo es siempre mejor, así que basta una prueba rápida. Un modelo nuevo puede ser mejor de media y peor en tus casos. Ejecuta tus propios casos, mueve antes una parte pequeña y conserva la vuelta atrás.
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\");' '' '// Dos versiones grabadas de una función sobre los mismos seis casos. El coste va en micro-euros.' 'const oldRun = [1, 1, 1, 0, 1, 1].map(function (ok, i) { return { case: \"c\" + (i + 1), ok: ok === 1, cost: 30 }; });' 'const newRun = [1, 1, 0, 1, 1, 1].map(function (ok, i) { return { case: \"c\" + (i + 1), ok: ok === 1, cost: 24 }; });' 'const MAX_REGRESSIONS = 1;' 'function passes(run) { return run.filter(function (r) { return r.ok; }).length; }' 'function total(run) { return run.reduce(function (sum, r) { return sum + r.cost; }, 0); }' > change.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 regressions(a, b) {' ' return a.filter(function (r, i) { return r.ok && b[i].ok === false; }).map(function (r) { return r.case; });' '}' '// Un usuario está en el canario cuando las letras de su nombre suman un cubo por debajo del porcentaje.' 'function inCanary(user, percent) {' ' let n = 0;' ' for (const ch of user) n = n + ch.charCodeAt(0);' ' return n % 100 < percent;' '}' >> change.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(\"antigua: \" + passes(oldRun) + \" de 6, coste \" + total(oldRun));' ' console.log(\"nueva: \" + passes(newRun) + \" de 6, coste \" + total(newRun));' ' const bad = regressions(oldRun, newRun);' ' console.log(\"regresiones: \" + bad.join(\", \") + (bad.length <= MAX_REGRESSIONS ? \" (permitida)\" : \" (demasiadas)\"));' ' const users = [\"ana\", \"cy\", \"eva\", \"gus\", \"li\", \"zoe\"];' ' console.log(\"canario al 10 por ciento: \" + users.filter(function (u) { return inCanary(u, 10); }).join(\", \"));' ' const r = await ask([{ role: \"user\", content: \"¿Cuánto es el 15 por ciento de 200 euros? Responde en una frase corta.\" }], \"El 15 por ciento de 200 euros son 30 euros.\", 40);' ' console.log(\"Hoy en directo (fuera de la grabación): \" + r.text);' '}' 'main();' >> change.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 change.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una salida posible
| Línea | Qué muestra |
|---|---|
| antigua: 5 de 6, coste 180 | La versión antigua grabada |
| nueva: 5 de 6, coste 144 | La versión nueva grabada, más barata |
| regresiones: c3 (permitida) | Una regresión, dentro del límite de una |
| canario al 10 por ciento: ana | El usuario que la regla fija pone en la parte pequeña |
| Hoy en directo (fuera de la grabación): ... | Tu propia llamada. Cambia en cada ejecución, o dice Muestra grabada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.