Stop au “Vibe Check” : Benchmarker ses LLMs systématiquement avec Promptfoo
Le “vibe check” est l’ennemi du déploiement stable.
Quand on passe d’un modèle à un autre (par exemple de GPT-4o à Claude 3.5 Sonnet) ou qu’on ajuste un prompt système, on a l’impression que “ça marche toujours”. Mais sans métriques, on ne sait pas si on a corrigé un bug dans un coin tout en créant une régression majeure ailleurs.
Pour sortir de l’intuition, j’utilise promptfoo. C’est un outil CLI qui permet de tester des prompts sur plusieurs modèles en parallèle et de valider les sorties via des assertions.
Voici la méthode pour monter un benchmark robuste en moins de 30 minutes.
1. La stratégie : Le Framework d’Expertise Multi-Dimensionnel
L’erreur classique est de créer une liste plate de questions. Pour un benchmark qui a du sens, il faut segmenter par domaines d’expertise et par niveaux de difficulté.
Je divise mes tests en trois paliers :
- L1 (Baseline) : Tâches standards. On vérifie que le modèle connaît la base.
- L2 (Stress) : Contraintes complexes ou demandes contre-intuitives. On teste la capacité d’application.
- L3 (Edge) : Cas limites, paradoxes ou contraintes extrêmes (ex: lipogrammes). On cherche le point de rupture.
Pour chaque domaine (Coding, Raisonnement, Rédaction), je crée un jeu de données qui suit cette progression.
2. La plomberie : Architecture des fichiers
L’idée est de séparer la configuration (le “comment”) des données (le “quoi”).
La structure :
benchmark/
├── promptfooconfig.yaml # Configuration des modèles et prompts
└── tests/
├── software_engineering.csv # Données de test domaine A
└── complex_reasoning.csv # Données de test domaine B
Dans les fichiers CSV, j’utilise des colonnes expertise, prompt et assert. Promptfoo injecte automatiquement ces variables dans le template de prompt.
expertise,prompt,assert
Software Engineering,"Implement a function in Python to find the first non-repeating character in a string. Return the index.","contains('O(n)')"
Software Engineering,"Create a JSON schema for a 'Book' object that includes title, author, ISBN-13, and a list of genres.","contains('ISBN-13')"
3. Implémentation technique
Voici le cœur du système. Le fichier promptfooconfig.yaml définit le template et les providers.
prompts:
- "You are a world-class expert in {{expertise}}. Please provide a professional response to: {{prompt}}"
providers:
- "ollama:chat:oamazonasgabriel/lfm2.5-2.6b:q4_k_m-8gbGPU"
- "ollama:chat:qwen3.5:4b"
tests:
- tests/software_engineering.csv
- tests/complex_reasoning.csv
Le secret des assertions :
Ne vous contentez pas de vérifier si un mot est présent (contains). Pour les niveaux L2 et L3, utilisez le llm-rubric. C’est un “modèle juge” qui évalue la réponse selon des critères précis.
Exemple d’assertion pour un test de code L3 :
llm-rubric: "La réponse doit utiliser std::atomic, gérer le problème ABA et ne contenir aucun mutex."
4. Exécution et Analyse
Le workflow est simple :
promptfoo eval: Lance tous les tests sur tous les modèles.promptfoo view: Ouvre une interface web.
L’interface affiche un tableau comparatif. En un coup d’œil, on voit quel modèle échoue sur les cas L3 et lequel est le plus stable sur les L1. C’est là que le choix du modèle devient une décision d’ingénierie et non une préférence personnelle.
Conclusion
Passer du “je pense que ça marche” au “ce modèle a un score de 85% sur mon jeu de test L2” change totalement la manière de construire des produits AI. Le benchmark n’est pas une étape finale, c’est un garde-fou permanent.
Idée de prochaine étape : Intégrer ce benchmark dans une CI/CD pour bloquer tout déploiement si le score de régression dépasse 5%.