Qué es una revisión del nivel de servicio
Un nivel de servicio es un objetivo que una función debe cumplir, como «el 95 por ciento de las peticiones salen bien». Una revisión semanal compara lo ocurrido con los objetivos y decide qué hacer.
Los módulos anteriores te dan costes, trazas y un diseño. Esta lección va más allá: una semana medida, un presupuesto de errores y un paso del manual para cada alarma.
Al final de esta lección
Nota
Puedo revisar una función frente a un nivel de servicio durante una semana.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Objetivo | el nivel que una función debe alcanzar | 95 por ciento |
| Incumplimiento | un objetivo que no se cumplió | |
| Presupuesto de errores | los errores que un objetivo permite en un periodo | |
| Manual de actuación | una lista que dice qué hacer ante cada alarma | |
| Alarma | una señal de que un objetivo no se cumple | |
| Congelar | dejar de hacer cambios durante un tiempo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Tres objetivos para la semana
Aquí la función tiene tres objetivos. Al menos el 95 por ciento de las peticiones debe salir bien. Al menos el 90 por ciento debe ser rápido. El coste de la semana debe quedar bajo un tope de 1800000 unidades.
Los porcentajes se redondean hacia abajo. Cumplir un objetivo justo está bien. Solo quedarse corto es un incumplimiento.
Ejemplo resuelto: una semana grabada
| Día | Peticiones | Errores | Lentas | Coste |
|---|---|---|---|---|
| Lun | 200 | 6 | 14 | 300000 |
| Mar | 210 | 8 | 15 | 320000 |
| Mié | 220 | 9 | 20 | 340000 |
| Jue | 205 | 30 | 40 | 310000 |
| Vie | 215 | 7 | 18 | 330000 |
| Sáb | 90 | 2 | 5 | 140000 |
| Dom | 80 | 1 | 4 | 120000 |
| Semana | 1220 | 63 | 116 | 1860000 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que una media que parece buena significa que la semana fue buena. Un mal día puede esconderse dentro de una buena semana. Revisa cada día además del total, y di qué día fue el primero que salió mal.
El presupuesto de errores
Un objetivo del 95 por ciento permite que falle el 5 por ciento de las peticiones. Ese margen es el presupuesto de errores. Para 1220 peticiones son 61 errores, en números enteros.
La semana tuvo 63 errores, así que el presupuesto que queda es 61 menos 63, es decir, -2. El presupuesto está gastado, así que el equipo congela los cambios hasta recuperarlo.
Ejemplo resuelto: el presupuesto
| Paso | Cuenta | Resultado |
|---|---|---|
| Porcentaje de éxito | (1220 menos 63) por 100 entre 1220 | 94 |
| Errores permitidos | 1220 por 5 entre 100 | 61 |
| Errores usados | De la semana | 63 |
| Presupuesto que queda | 61 menos 63 | -2 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un paso para cada alarma
Un manual de actuación es una lista corta: ante esta alarma, haz esto. Se escribe antes del mal día, para que quien esté de guardia no tenga que inventar un plan.
Si un incumplimiento no tiene paso en el manual, escálalo al responsable. Después, añade un paso para él.
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 el script de la revisión, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const days = [' ' [200, 6, 14, 300000], [210, 8, 15, 320000], [220, 9, 20, 340000],' ' [205, 30, 40, 310000], [215, 7, 18, 330000], [90, 2, 5, 140000], [80, 1, 4, 120000],' '];' 'const targets = { success: 95, fast: 90, cap: 1800000 };' > review.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 de la revisión, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function totals() {' ' const t = { n: 0, bad: 0, slow: 0, cost: 0 };' ' for (const d of days) { t.n += d[0]; t.bad += d[1]; t.slow += d[2]; t.cost += d[3]; }' ' return t;' '}' 'function pct(part, whole) { return Math.floor((whole - part) * 100 / whole); }' >> review.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 de la revisión, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const t = totals();' ' const ok = pct(t.bad, t.n);' ' const fast = pct(t.slow, t.n);' ' const allowed = Math.floor(t.n * (100 - targets.success) / 100);' ' console.log(\"éxito \" + ok + \" por ciento, objetivo \" + targets.success);' ' console.log(\"rapidez \" + fast + \" por ciento, objetivo \" + targets.fast);' ' console.log(\"coste \" + t.cost + \", tope \" + targets.cap);' ' console.log(\"presupuesto de errores: permitidos \" + allowed + \", usados \" + t.bad + \", quedan \" + (allowed - t.bad));' ' const reply = await ask([{ role: \"user\", content: \"En una frase corta, ¿para qué sirve un manual de actuación?\" }], \"Dice a quien está de guardia exactamente qué hacer ante cada alarma.\", 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> review.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 revisión
docker exec -w /home/node/project agent node review.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 imprime el Run
| Línea | Qué muestra |
|---|---|
| éxito 94 por ciento, objetivo 95 | Un incumplimiento, un punto por debajo |
| rapidez 90 por ciento, objetivo 90 | Cumplido justo, así que no hay incumplimiento |
| coste 1860000, tope 1800000 | Un incumplimiento, por encima del tope |
| presupuesto de errores: permitidos 61, usados 63, quedan -2 | El presupuesto está gastado |
| 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.