Module 9 sur 10, leçon 1 sur 5
Évaluer un agent
Construire un jeu d’évaluation qui dit si un changement améliore vraiment l’agent.
Sans évaluation, chaque modification de prompt est un pari, et une démo réussie ne prouve rien.
Trois niveaux à mesurer
- Réponse finale : la tâche est-elle accomplie ?
- Trajectoire : a-t-il pris les bons outils, avec les bons arguments, sans étapes inutiles ?
- Exploitation : coût par tâche, latence, taux d’escalade vers un humain.
Construire le jeu de cas
- Partez de vraies demandes, y compris les échecs observés.
- Ajoutez des cas limites, des cas hors périmètre et des tentatives d’injection.
- Pour chaque cas, écrivez le critère de réussite avant de lancer l’agent.
- Gardez une partie des cas à l’écart, pour ne pas régler l’agent sur ses propres tests.
Un LLM comme juge
Quand aucun test exact n’est possible, un modèle peut noter les sorties, soit avec une grille, soit en comparant deux réponses. Ce juge a ses biais : il tend à préférer les réponses longues, et parfois celle qui arrive en première position. Échangez l’ordre pour le vérifier, et calibrez-le sur des cas annotés à la main.
Lire les chiffres honnêtement
Un agent n’est pas déterministe : rejouez chaque cas plusieurs fois. Sur un petit jeu, un score impressionne plus qu’il n’informe. 14 réussites sur 15 donnent 93 %, mais l’intervalle de confiance à 95 % va d’environ 70 % à 99 %. Une différence de quelques points entre deux versions ne veut alors rien dire.
Observer en production
Enregistrez chaque étape : prompt, outil, résultat, durée, coût. Transformez ensuite chaque incident en cas d’évaluation. Le jeu devient la mémoire de vos erreurs, et la CI bloque leur retour.
Pas de chiffre, pas d’amélioration.
Exemple : Comparer deux versions cas par cas
Deux moyennes peuvent cacher une régression. Comparer les mêmes cas montre ce qu’un changement a réparé et ce qu’il a cassé.
function compare(before, after) {
const fixed = [];
const broken = [];
for (const id of Object.keys(before)) {
if (!before[id] && after[id]) fixed.push(id);
if (before[id] && !after[id]) broken.push(id);
}
return { fixed, broken };
}
const before = { damaged: true, late: false, fraud: true };
const after = { damaged: true, late: true, fraud: false };
compare(before, after);
{ fixed: ['late'], broken: ['fraud'] }
Les deux versions réussissent deux cas sur trois : la moyenne dit que rien n’a changé. En réalité, la nouvelle version laisse maintenant passer un cas de fraude.
Essayez dans l’éditeur
function wilson(passes, n, z = 1.96) { // TODO return { low: 0, high: 0 };}function clearlyBetter(a, b) { // TODO return false;}