¿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

Despliegue canario de un cambio de IA

Después de esta lección: Puedo enviar una parte pequeña del tráfico a un cambio y decidir con una regla.

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

Cómo funciona un despliegue canario

Un despliegue canario envía una parte pequeña de los usuarios a un cambio antes de que lo reciba todo el mundo. Si el cambio es malo, solo unos pocos notan el fallo.

Funciona cuando los mismos usuarios están en el canario siempre. Además necesita una regla para decidir, escrita antes de lanzar el cambio.

Al final de esta lección

Nota

Puedo enviar una parte pequeña del tráfico a un cambio y decidir con una regla.

Palabras clave

PalabraQué significaEjemplo
Canarioel grupo pequeño que recibe un cambio primero
Parteel porcentaje de usuarios que está en el canario5
Cuboun número fijo de 0 a 99 para cada usuario
Promoverdar el cambio a más usuarios
Revertirquitar el cambio otra vez
Margencuánto peor puede ser el canario

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un cubo fijo decide quién entra

No elijas usuarios al azar cada vez, o una persona salta entre la versión antigua y la nueva. Da a cada usuario un cubo de 0 a 99 que nunca cambie.

Un usuario está en el canario cuando su cubo es menor que la parte. Con una parte de 20, entran los cubos del 0 al 19.

Ejemplo resuelto: cinco usuarios

UsuarioCuboDentro con parte 5Dentro con parte 20Dentro con parte 50
u74SíSíSí
u918NoSíSí
u1533NoNoSí
u162NoNoNo
u1098NoNoNo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que un canario pequeño sin errores prueba que el cambio es seguro. Cinco usuarios con pocas peticiones prueban muy poco. Fija antes un mínimo de peticiones y espera hasta que el canario lo alcance.

Escribe la regla antes del despliegue

Compara el porcentaje de errores del canario con el de la versión antigua en la misma etapa. Usa la división entera, redondeada hacia abajo.

Espera si el canario tiene menos de 50 peticiones. Revierte si su porcentaje supera el de la antigua más un margen de 2. Si no, promueve.

Ejemplo resuelto: tres etapas

PartePeticiones del canarioErrores del canarioPorcentaje antiguoDecisión
54011Esperar, solo 40 peticiones
2018042Promover, 2 no supera 4
50300182Revertir, 6 supera 4

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

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 el script del canario, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'function bucket(user) {' '  let s = 0;' '  for (let i = 0; i < user.length; i++) s = s + user.charCodeAt(i);' '  return (s * 7) % 100;' '}' 'function inCanary(user, share) { return bucket(user) < share; }' 'const users = [];' 'for (let i = 1; i <= 20; i++) users.push(\"u\" + i);' > canary.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 script del canario, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const stages = [' '  { share: 5, cn: 40, ce: 1, bn: 760, be: 15 },' '  { share: 20, cn: 180, ce: 4, bn: 640, be: 13 },' '  { share: 50, cn: 300, ce: 18, bn: 450, be: 9 },' '];' 'function pct(e, n) { return Math.floor(e * 100 / n); }' 'function decide(s) {' '  if (s.cn < 50) return \"esperar\";' '  return pct(s.ce, s.cn) > pct(s.be, s.bn) + 2 ? \"revertir\" : \"promover\";' '}' >> canary.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 script del canario, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  [5, 20].forEach(function (share) {' '    console.log(\"parte \" + share + \": \" + users.filter(function (u) { return inCanary(u, share); }).join(\" \"));' '  });' '  for (const s of stages) {' '    const d = decide(s);' '    console.log(\"etapa \" + s.share + \": canario \" + pct(s.ce, s.cn) + \" por ciento, antigua \" + pct(s.be, s.bn) + \" por ciento -> \" + d);' '    if (d === \"revertir\" || d === \"esperar\") break;' '  }' '  const q = \"En una frase corta, ¿por qué enviar un cambio solo a pocos usuarios al principio?\";' '  const sample = \"Si el cambio es malo, solo unos pocos notan el fallo y se puede deshacer rápido.\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 60);' '  console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> canary.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 canario

Comando
docker exec -w /home/node/project agent node canary.js

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lo que imprime el Run

LíneaQué muestra
parte 5: u7El único usuario del canario con 5
parte 20: u7 u8 u9 u11 u12 u13 u20Siete usuarios. u7 sigue dentro
etapa 5: canario 2 por ciento, antigua 1 por ciento -> esperarMenos de 50 peticiones, así que se espera
el modelo dijo: ...Una frase del laboratorio. Una muestra grabada si ningún modelo responde

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.