¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo cambiar de modelo LLM sin riesgo

Después de esta lección: Puedo decidir, a partir de dos ejecuciones grabadas, si paso una función a otro modelo.

Lección de 70 min6 comandosLaboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

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

PalabraQué significa
Regresiónun caso que pasaba antes y falla ahora
Canariouna pequeña parte de usuarios que pasa primero
Vuelta atrásel camino de regreso a la versión antigua
Cuboun número fijo en el que cae siempre un usuario
Subida de costeel 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ónPasanCosteRegresiones
Antigua5 de 6180ninguna
Nueva5 de 6144c3 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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
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

Comando
docker exec -w /home/node/project agent node 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.

Una salida posible

LíneaQué muestra
antigua: 5 de 6, coste 180La versión antigua grabada
nueva: 5 de 6, coste 144La versión nueva grabada, más barata
regresiones: c3 (permitida)Una regresión, dentro del límite de una
canario al 10 por ciento: anaEl 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.

Sobre este laboratorio y su código: Laboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.