Encontrar la causa de un incidente de IA
Un incidente es un momento en que una función cuesta más, o responde peor, de lo que permite el encargo. Encuentras su causa en los registros: un registro de costes para saber cuándo y cuánto, una traza para saber dónde.
El asistente de la biblioteca lleva una semana en marcha. A mediodía salta la alerta de coste. Nadie cambió el modelo, así que la pregunta es qué cambió.
Al final de esta lección
Nota
Puedo averiguar qué salió mal a partir de la traza y los registros.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Incidente | un momento en que la función rompe su encargo | |
| Registro de costes | un listado de lo que costó cada hora | |
| Traza | los pasos que recorrió una petición | |
| Tramo | un paso de una traza, con su tiempo | model |
| Intento | una llamada al modelo para una petición |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cada registro responde a una pregunta
Empieza preguntando qué registro puede responder a lo que necesitas. No lo leas todo.
El registro de costes dice cuándo y cuánto. Una traza dice adónde fueron el tiempo y las llamadas dentro de una petición. La lista de eventos, como un despliegue, dice qué cambió.
Ejemplo: tres registros
| Registro | Responde a | No puede responder |
|---|---|---|
| Registro de costes | Qué horas cuestan más | Por qué cuestan más |
| Traza | Qué hizo una petición | Con qué frecuencia ocurrió |
| Lista de eventos | Qué cambió y cuándo | Si importó |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuándo, dónde y luego por qué
Primero busca cuándo: las horas que rompen el límite. Luego dónde: la traza de una petición de esas horas. Al final por qué: una causa que explique las dos cosas.
Pon a prueba la causa. Si es cierta, el registro debe mostrar algo más. Una causa que no predice nada es una suposición.
Un error frecuente
Advertencia
Mucha gente cree que un pico de coste significa más usuarios. Mira también las peticiones. Si las peticiones siguen iguales y los intentos suben, cada petición cuesta más. El tráfico no creció.
Escribe el lector de incidentes, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' '// Peticiones e intentos al modelo por hora. Un intento cuesta 5. La alerta salta a 1500 por hora.' 'const HOURS = [[\"08\", 120, 126], [\"09\", 150, 158], [\"10\", 140, 149], [\"11\", 160, 520], [\"12\", 155, 310], [\"13\", 150, 160], [\"14\", 145, 152]];' 'const LIMIT = 1500;' 'const log = HOURS.map(function (h) {' ' return { hour: h[0], requests: h[1], attempts: h[2], cost: h[2] * 5 };' '});' 'fs.writeFileSync(\"cost-log.json\", JSON.stringify(log, null, 1));' > incident.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 lector de incidentes, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Una petición, r481, una pregunta sobre multas, vista como tramos.' 'const TRACE = [' ' { span: \"read_sheet\", attempt: 0, ms: 4, length: 0 },' ' { span: \"model\", attempt: 1, ms: 900, length: 52 },' ' { span: \"model\", attempt: 2, ms: 880, length: 51 },' ' { span: \"model\", attempt: 3, ms: 910, length: 55 },' ' { span: \"model\", attempt: 4, ms: 890, length: 53 },' ' { span: \"model\", attempt: 5, ms: 905, length: 54 },' ' { span: \"send_last\", attempt: 5, ms: 1, length: 54 },' '];' 'fs.writeFileSync(\"trace-r481.json\", JSON.stringify(TRACE, null, 1));' >> incident.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 lector de incidentes, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'console.log(\"hora peticiones intentos por-petición coste\");' 'for (const h of log) {' ' const ratio = (h.attempts / h.requests).toFixed(2);' ' console.log(h.hour + \":00\", h.requests, h.attempts, ratio, h.cost, h.cost > LIMIT ? \"SUPERADO\" : \"ok\");' '}' >> incident.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 lector de incidentes, parte 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'for (const t of TRACE) {' ' console.log(t.span, t.attempt, t.ms + \" ms\", \"longitud \" + t.length, t.length > 40 ? \"demasiado largo\" : \"\");' '}' 'const tries = TRACE.filter(function (t) { return t.span === \"model\"; }).length;' 'console.log(\"Intentos al modelo para r481:\", tries);' >> incident.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee el registro y la traza
docker exec -w /home/node/project agent node incident.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
| Parte | Qué muestra |
|---|---|
| 08:00 a 10:00 | Cerca de 1,05 intentos por petición, coste de 630 a 790 |
| 11:00 | 3,25 intentos por petición, coste 2600, SUPERADO |
| 12:00 | 2,00 intentos por petición, coste 1550, SUPERADO |
| 13:00 y 14:00 | De vuelta a cerca de 1,05, coste bajo 1500 |
| Traza de r481 | Cinco tramos del modelo, todos de longitud mayor que 40 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.