Trouver la cause d’un incident d’IA
Un incident est un moment où une fonction coûte plus, ou répond moins bien, que ce que la note de cadrage permet. Vous en trouvez la cause dans les traces écrites : un journal des coûts pour savoir quand et combien, une trace pour savoir où.
L’assistant de la médiathèque est en ligne depuis une semaine. À midi, l’alerte de coût se déclenche. Personne n’a changé le modèle : qu’est-ce qui a changé ?
À la fin de cette leçon
Remarque
Je peux trouver ce qui a mal tourné à partir de la trace et des journaux.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Incident | un moment où la fonction rompt sa note de cadrage | |
| Journal des coûts | un relevé de ce que chaque heure a coûté | |
| Trace | les étapes qu’une requête a traversées | |
| Étape | un pas d’une trace, avec sa durée | modele |
| Tentative | un appel au modèle pour une requête |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque trace répond à une question
Demandez-vous d’abord quelle trace peut répondre à ce que vous cherchez. Ne lisez pas tout.
Le journal des coûts dit quand et combien. Une trace dit où sont passés le temps et les appels dans une requête. La liste des événements, comme un déploiement, dit ce qui a changé.
Exemple : trois traces écrites
| Trace écrite | Elle répond à | Elle ne dit pas |
|---|---|---|
| Journal des coûts | Quelles heures coûtent plus | Pourquoi elles coûtent plus |
| Trace | Ce qu’une requête a fait | À quel point c’est courant |
| Liste d’événements | Ce qui a changé, et quand | Si cela a compté |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Quand, où, puis pourquoi
Cherchez d’abord quand : les heures qui dépassent la limite. Puis où : la trace d’une requête de ces heures. Enfin pourquoi : une cause qui explique les deux.
Testez la cause. Si elle est vraie, le journal doit montrer autre chose aussi. Une cause qui ne prédit rien est une supposition.
Une erreur fréquente
Attention
Beaucoup pensent qu’un pic de coût veut dire plus d’utilisateurs. Regardez aussi les requêtes. Si les requêtes restent stables et que les tentatives montent, chaque requête coûte plus. Le trafic n’a pas grandi.
Écrire le lecteur d’incident, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' '// Requêtes et tentatives auprès du modèle par heure. Une tentative coûte 5. L’alerte est à 1500 l’heure.' 'const HEURES = [[\"08\", 120, 126], [\"09\", 150, 158], [\"10\", 140, 149], [\"11\", 160, 520], [\"12\", 155, 310], [\"13\", 150, 160], [\"14\", 145, 152]];' 'const LIMITE = 1500;' 'const journal = HEURES.map(function (h) {' ' return { heure: h[0], requetes: h[1], tentatives: h[2], cout: h[2] * 5 };' '});' 'fs.writeFileSync(\"journal-couts.json\", JSON.stringify(journal, null, 1));' > incident.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le lecteur d’incident, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Une requête, r481, une question sur les amendes, vue en étapes.' 'const TRACE = [' ' { etape: \"lire_fiche\", tentative: 0, ms: 4, longueur: 0 },' ' { etape: \"modele\", tentative: 1, ms: 900, longueur: 52 },' ' { etape: \"modele\", tentative: 2, ms: 880, longueur: 51 },' ' { etape: \"modele\", tentative: 3, ms: 910, longueur: 55 },' ' { etape: \"modele\", tentative: 4, ms: 890, longueur: 53 },' ' { etape: \"modele\", tentative: 5, ms: 905, longueur: 54 },' ' { etape: \"envoyer_derniere\", tentative: 5, ms: 1, longueur: 54 },' '];' 'fs.writeFileSync(\"trace-r481.json\", JSON.stringify(TRACE, null, 1));' >> incident.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le lecteur d’incident, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'console.log(\"heure requêtes tentatives par-requête coût\");' 'for (const h of journal) {' ' const rapport = (h.tentatives / h.requetes).toFixed(2);' ' console.log(h.heure + \":00\", h.requetes, h.tentatives, rapport, h.cout, h.cout > LIMITE ? \"DÉPASSÉ\" : \"ok\");' '}' >> incident.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le lecteur d’incident, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'for (const t of TRACE) {' ' console.log(t.etape, t.tentative, t.ms + \" ms\", \"longueur \" + t.longueur, t.longueur > 40 ? \"trop long\" : \"\");' '}' 'const essais = TRACE.filter(function (t) { return t.etape === \"modele\"; }).length;' 'console.log(\"Tentatives du modèle pour r481 :\", essais);' >> incident.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le journal et la trace
docker exec -w /home/node/project agent node incident.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que le Run affiche
| Partie | Ce qu’elle montre |
|---|---|
| 08:00 à 10:00 | Environ 1,05 tentative par requête, coût 630 à 790 |
| 11:00 | 3,25 tentatives par requête, coût 2600, DÉPASSÉ |
| 12:00 | 2,00 tentatives par requête, coût 1550, DÉPASSÉ |
| 13:00 et 14:00 | Retour à environ 1,05, coût sous 1500 |
| Trace de r481 | Cinq étapes du modèle, chaque longueur au-delà de 40 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.