Le piège des impressions
Vous avez construit un agent. Vous avez discuté avec lui pendant 30 minutes. Il semblait intelligent. Vous l'avez déployé.
Trois jours plus tard, un utilisateur signale qu'il a donné avec assurance une mauvaise réponse à une question basique. Vous testez à nouveau — ça fonctionne bien maintenant. Vous haussez les épaules. Le modèle devait passer une mauvaise journée.
C'est le piège des impressions : utiliser des ressentis informels comme signal de qualité. Ça marche à l'échelle d'un hobby. Ça échoue dès que vous avez de vrais utilisateurs, de l'argent réel ou de vrais enjeux.
Les evals sont la sortie de secours.
Ce qu'est vraiment un eval
Un eval est une fonction qui prend un prompt et un comportement attendu, et retourne un score. C'est tout. Pas besoin d'infrastructure sophistiquée pour commencer.
L'eval le plus simple que vous puissiez écrire :
interface EvalCase {
input: string;
expected: string;
check: (output: string) => boolean;
}
const cases: EvalCase[] = [
{
input: "What is 2 + 2?",
expected: "4",
check: (out) => out.includes("4"),
},
{
input: "Summarize: 'The quick brown fox jumps over the lazy dog'",
expected: "mentions fox and dog",
check: (out) => out.toLowerCase().includes("fox") && out.toLowerCase().includes("dog"),
},
];
async function runEvals(model: (prompt: string) => Promise<string>) {
let pass = 0;
for (const c of cases) {
const output = await model(c.input);
if (c.check(output)) {
pass++;
console.log(`✓ ${c.input.slice(0, 40)}`);
} else {
console.log(`✗ ${c.input.slice(0, 40)}`);
console.log(` Got: ${output.slice(0, 100)}`);
}
}
console.log(`\n${pass}/${cases.length} passed (${Math.round(pass / cases.length * 100)}%)`);
}
Exécutez ceci à chaque modification de prompt. Vous disposez désormais d'une suite de régression.
Les trois types de vérification dont vous avez besoin
1. Correspondance exacte — pour les sorties structurées, les codes, les IDs, les décisions oui/non. Binaire. Rapide.
2. Vérification de contenu — pour les sorties en prose où la formulation exacte varie mais où les faits clés doivent apparaître. « La sortie mentionne 'Paris' » est plus robuste que « la sortie est égale à 'Paris est la capitale de la France' ».
3. Notation par modèle — pour les tâches complexes nécessitant un jugement sémantique. Demandez à un second modèle (moins cher, plus rapide) : « Cette réponse répond-elle correctement à la question ? Répondez OUI ou NON avec une raison. » Cela s'adapte à la qualité subjective, au ton et aux chaînes de raisonnement.
async function modelGrade(output: string, criterion: string): Promise<boolean> {
const verdict = await callModel(
`Criterion: ${criterion}\nOutput: ${output}\nDoes the output meet the criterion? Reply YES or NO only.`
);
return verdict.trim().startsWith("YES");
}
Que tester en premier
Si vous partez de zéro, évaluez dans cet ordre :
-
Le chemin nominal — les 5 à 10 entrées pour lesquelles votre agent a été explicitement conçu. Elles devraient toutes passer. Si ce n'est pas le cas, vous n'avez pas un agent fonctionnel, vous avez une démo.
-
Les cas limites déjà observés en échec — tout ce qui a planté lors des tests. Encodez-les immédiatement. Chaque bug est un cas d'eval.
-
Les entrées adversariales — entrées vides, entrées malformées, questions hors domaine, tentatives d'injection de prompt. Votre agent doit se dégrader gracieusement.
-
La suite de régression — un ensemble fixe de 50 à 100 cas que vous exécutez à chaque modification. Vert signifie que vous n'avez rien cassé. Rouge signifie que vous avez une décision à prendre.
Le flux de travail d'eval
Modification de prompt → Lancer les evals → Vérifier le delta de score → Déployer si delta > seuil → Terminé
Votre seuil dépend des enjeux. Un projet jouet peut accepter -2 %. Un agent de production gérant des données clients devrait exiger +0 % ou mieux. Définissez cela explicitement avant de commencer afin de ne pas prendre cette décision sous pression quand votre score chute de 4 % après un « petit » ajustement de prompt.
Outils à connaître
- Braintrust — exécutions d'evals, journalisation, comparaison de modèles. Propose un niveau gratuit généreux.
- Promptfoo — open-source, fonctionne localement, excellent pour le red-teaming.
- Langfuse — observabilité et eval, idéal si vous souhaitez le traçage aux côtés des scores.
- Script DIY — pour les agents simples, un script TypeScript de 50 lignes suffit souvent. N'usinez pas trop.
L'inconfortable vérité
La plupart des défaillances agentiques sont des défaillances de prompt, pas des défaillances de modèle. Vous n'avez pas besoin d'un nouveau modèle. Vous devez savoir sur quoi votre prompt actuel échoue et le corriger.
Les evals vous le disent. Les impressions, non.
Construisez le harnais d'eval avant d'ajouter la prochaine fonctionnalité. Votre futur vous en sera reconnaissant.
