Prompt de lancement du projet OCR Benchmark¶
📋 Contexte¶
Tu vas créer un système de benchmark automatisé pour comparer les performances d'extraction de différents LLM multimodaux sur des documents métier complexes.
Lis attentivement le fichier CONTEXT.md qui contient :
- Le contexte métier et le problème à résoudre
- L'architecture cible
- La structure du golden dataset
- Les modèles à benchmarker
- Les métriques d'évaluation
🎯 Objectif de cette session¶
Créer un MVP fonctionnel permettant de :
- Charger un golden dataset (documents PDF + ground truth JSON)
- Extraire les informations via OpenRouter (plusieurs modèles)
- Comparer les résultats avec le ground truth
- Générer un rapport de comparaison
📁 Structure attendue¶
ocr-benchmark/
├── CONTEXT.md # ✅ Déjà créé
├── PROMPT_LANCEMENT.md # ✅ Ce fichier
├── README.md # À créer
├── requirements.txt # À créer
├── .env.example # À créer
│
├── src/
│ ├── __init__.py
│ ├── config.py # Configuration (modèles, chemins)
│ ├── extractor.py # Extraction via OpenRouter
│ ├── evaluator.py # Comparaison extraction vs ground truth
│ ├── reporter.py # Génération du rapport
│ └── benchmark.py # Script principal
│
├── golden_dataset/
│ ├── documents/ # PDFs à analyser
│ ├── ground_truth/ # JSON avec valeurs attendues
│ └── schema/ # JSON Schema par type de doc
│
└── results/ # Rapports générés
└── .gitkeep
🚀 Étapes de développement¶
Étape 1 : Setup du projet¶
- [ ] Créer
requirements.txtavec :openai,httpx,python-dotenv,pydantic,pdf2image,Pillow - [ ] Créer
.env.exampleavecOPENROUTER_API_KEY= - [ ] Créer
README.mdavec instructions d'installation
Étape 2 : Configuration¶
- [ ] Créer
src/config.pyavec : - Liste des modèles à tester (OpenRouter IDs)
- Chemins vers le golden dataset
- Paramètres d'extraction (temperature=0)
Étape 3 : Extracteur¶
- [ ] Créer
src/extractor.pyavec : - Fonction pour convertir PDF en images
- Fonction pour appeler OpenRouter avec une image
- Prompt d'extraction structuré (demander JSON)
- Gestion des erreurs et retry
Étape 4 : Évaluateur¶
- [ ] Créer
src/evaluator.pyavec : - Fonction de comparaison champ par champ
- Calcul exact match + fuzzy match
- Calcul precision/recall/F1
Étape 5 : Rapporteur¶
- [ ] Créer
src/reporter.pyavec : - Génération Markdown
- Tableau comparatif par modèle
- Détail par document
Étape 6 : Script principal¶
- [ ] Créer
src/benchmark.pyavec : - CLI simple (optionnel : argparse)
- Orchestration : load → extract → evaluate → report
- Sauvegarde des résultats
💡 Points d'attention¶
-
OpenRouter API : Utilise le format OpenAI avec
base_url="https://openrouter.ai/api/v1" -
Images des PDFs : Convertis les pages en images base64 pour les envoyer aux LLM multimodaux
-
Prompt d'extraction : Demande explicitement un JSON structuré avec les champs attendus
-
Ground Truth : Le format JSON doit être identique à celui demandé dans le prompt
-
Coûts : Un run complet = 5 modèles × 15 docs ≈ 5-10€ (à surveiller)
🔧 Exemple de code pour OpenRouter¶
from openai import OpenAI
import base64
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY"),
)
def extract_from_image(image_base64: str, model: str, prompt: str) -> dict:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{image_base64}"
}
}
]
}
],
temperature=0,
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
✅ Critère de succès de la session¶
À la fin de cette session, je dois pouvoir exécuter :
cd ocr-benchmark
pip install -r requirements.txt
cp .env.example .env # + ajouter ma clé API
python -m src.benchmark
Et obtenir un fichier results/YYYY-MM-DD.md avec :
- Tableau comparatif des scores par modèle
- Détail des erreurs par document
- Recommandation du meilleur modèle
📝 Notes additionnelles¶
- Commence simple : 1 type de document, 1 modèle, puis itère
- Priorise un code fonctionnel sur un code parfait
- Les documents du golden dataset seront ajoutés manuellement après
Prêt ? Commence par lire CONTEXT.md puis crée la structure du projet.
Sources¶
- Project associé
- Source migrée :
bricks-os/projects/ocr-benchmark/PROMPT_LANCEMENT.md