Modifier un prompt système, changer de modèle (GPT vers Claude ou Gemini) ou ajouter un outil MCP sans banc d’évaluation automatisé équivaut à déployer du code en production sans test unitaire. Un ajustement qui corrige un cas particulier dégrade souvent silencieusement le formatage JSON ou ouvre une brèche d’injection indirecte.
Promptfoo (promptfoo/promptfoo) apporte une approche TDD (Test-Driven Development) et AppSec Red-Teaming déterministe, exécutable localement en CLI ou dans un pipeline CI/CD GitLab/GitHub Actions.
Tester ses prompts comme du code
Le fonctionnement repose sur une spécification YAML (promptfooconfig.yaml) qui croise des variantes de prompts, plusieurs modèles cibles et une batterie d’assertions strictes :
Deux volets sont particulièrement critiques pour les agents dotés d’outils :
- Assertions déterministes sans LLM-as-a-Judge obligatoire : validation de schémas JSON (
is-json), vérification de l’absence de termes bannis (not-icontains), contrôle du coût plafond par requête (cost < 0.01) et de la latence (latency < 3000). - Red-Teaming automatisé (
promptfoo redteam) : génération automatique d’attaques adverses alignées sur le référentiel OWASP LLM Top 10 (injections indirectes via contenu web/email, contournement de RBAC, exfiltration de variables d’environnement, appels d’outils non autorisés).
Automatiser les tests en pre-commit
# Lancer la matrice d'évaluation comparative en local (cache activé)
npx promptfoo@latest eval -c promptfooconfig.yaml --no-progress-bar
# Exécuter une campagne d'audit Red-Team automatisée (injections & fuites PII)
npx promptfoo@latest redteam run --config redteam.yaml
# Exporter un rapport de conformité JSON avec code retour non-zéro si échec
npx promptfoo@latest eval --output results.json --fail-on-error
–> En couplant promptfoo eval aux tests canaries du dépôt, toute dérive de routage d’intention ou tentative d’exfiltration de données est bloquée avant même le déploiement du conteneur.
Caractéristiques
| Capacité d’Audit | Tests Manuels Ad-hoc | Scripts pytest Simples | Promptfoo (eval + redteam) |
|---|---|---|---|
| Comparaison multi-modèles côte à côte | ❌ Fastidieux | ⚠️ Code boilerplate lourd | ✅ Matrice YAML déclarative native |
| Validation JSON Schema & Regex | ❌ Visuel | ✅ Oui | ✅ Assertions intégrées sans code |
| Audit OWASP LLM Top 10 (Jailbreak/PII) | ❌ Incomplet | ❌ Manuel | ✅ Générateur Red-Team automatisé |
| Contrôle des seuils de latence et coût ($) | ❌ Absent | ⚠️ Complexe à maintenir | ✅ Seuils cost et latency natifs |
| Exécution 100 % locale (Zero-Cloud) | ✅ Oui | ✅ Oui | ✅ Exécution CLI locale sans télémétrie |
| Commande | Description |
|---|---|
`npx promptfoo@latest init`
| Initialise un fichier promptfooconfig.yaml avec des exemples d'assertions. |
`npx promptfoo@latest eval --no-cache`
| Force la ré-exécution complète de tous les cas de test sans utiliser le cache local. |
`npx promptfoo@latest redteam init`
| Génère une configuration d'audit de sécurité ciblant les plugins OWASP (SSRF, SQLi, RBAC, PII). |
`npx promptfoo@latest view`
| Ouvre l'interface locale d'inspection des résultats et des matrices de régression. |
