Fidélité — évaluer le vrai pipeline
Le piège de la maquette
La tentation, quand on écrit un harness, est de réimplémenter une version simplifiée du pipeline « juste pour tester » : on rappelle le LLM avec le même prompt, on parse la sortie, on compare. C'est un piège.
Le jour où la prod diverge de ta maquette — un nœud d'orchestration en plus, une étape de post-traitement, une normalisation du catalogue — ton éval mesure un système qui n'existe pas. Tes scores montent, la prod ne bouge pas. Tu as optimisé une fiction.
La règle d'or : le harness n'imite pas le pipeline, il appelle le vrai.
Ce que « le vrai » veut dire concrètement
Un harness fidèle réutilise les mêmes points d'entrée que la production :
- le même graphe d'orchestration : le harness invoque la même fonction qui construit le pipeline (un
build_pipeline()unique, partagé avec la prod), avec le même cycle de vie et la même trace d'observabilité. Pas une copie du graphe — le graphe. - la même ingestion de données : le catalogue est chargé via le vrai service d'import (le même couple aperçu → confirmation que l'interface d'administration), pas via un
INSERTbricolé. Tu testes donc aussi la vraie ingestion. - le même canal d'entrée : le harness recrée une requête en base exactement comme le font les canaux web/email de la prod. Ce qui entre dans le pipeline est indiscernable d'une vraie commande.
Résultat : ce que tu mesures est ce que vit le client. Zéro dérive entre l'éval et la prod.
Le coût, et pourquoi il en vaut la peine
Appeler le vrai pipeline est plus lent et plus cher qu'une maquette (vrais appels LLM, vraie base). C'est le prix de la fidélité, et il est non négociable : une éval infidèle est pire que pas d'éval, car elle donne une fausse confiance. Tu compenses le coût ailleurs (corpus ciblé, concurrence limitée, exécutions best-effort), jamais en trichant sur la fidélité.
Le coût chiffré : deux budgets de fidélité
Mettons des chiffres. Un passage qui appelle le vrai LLM sur tout le corpus coûte de l'ordre de ~7 € le run ; le même parcours avec le LLM mocké tombe à ~0,10 € — 70× moins, et déterministe. Impossible de payer le réel à chaque commit. D'où une stratégie à deux étages :
- Tests E2E de parcours (l'UI, le flux, la plomberie) → LLM mocké : rapides, déterministes, quasi gratuits, jouables à chaque commit. On y vérifie que la tuyauterie marche — pas la qualité du modèle.
- Éval de qualité sur golds (ce harness) → vrai LLM : le seul endroit où l'on paie le réel, parce que c'est le seul endroit où la question est « le modèle répond-il bien ? ». On la lance à l'itération / au gate de release, pas à chaque push.
La fidélité n'est pas binaire, c'est un budget par type de test. On paie le vrai LLM là où l'on mesure sa qualité (l'éval), on le mocke là où l'on ne teste que le flux (l'E2E). Payer le réel partout ruine la CI ; le mocker partout mesure une fiction.
Pourquoi ne PAS réimplémenter une version simplifiée du pipeline dans le harness ?