OCR Benchmark System¶
Snapshot de janvier 2026. Les scores fournisseurs et l’architecture proposée sont des hypothèses historiques. Ils doivent être rejoués avant toute décision. Voir le README du project.
Contexte¶
Bricks est une plateforme de financement participatif immobilier qui analyse quotidiennement des dizaines de dossiers de projets immobiliers. Chaque dossier contient des documents complexes et variés : - Compromis de vente (50+ pages, scans souvent dégradés) - Business plans et projections financières (tableaux Excel multi-feuilles) - Présentations avec schémas et organigrammes - Liasses fiscales (documents standardisés denses en chiffres) - Relevés bancaires (mix texte/tableaux avec annotations)
La qualité d'extraction de ces documents impacte directement la fiabilité de l'analyse et la prise de décision d'investissement.
Problème identifié¶
La qualité d'extraction varie considérablement selon l'OCR/LLM utilisé. Les solutions évoluent rapidement (nouveaux modèles, mises à jour) et il n'existe pas de moyen simple de : 1. Comparer objectivement les performances des différentes solutions 2. Suivre l'évolution de qualité dans le temps 3. Être alerté quand une solution se dégrade ou qu'une meilleure émerge 4. Éviter la dépendance à un seul fournisseur
Objectif¶
Créer un système de benchmark automatisé et récurrent permettant de : - Tester régulièrement les solutions OCR/LLM sur un pool de documents fixes - Comparer les résultats avec une "ground truth" connue - Générer un score de qualité par solution et par type de document - Suivre l'historique des performances pour détecter les évolutions
Critères de succès¶
- [ ] Précision cible : >95% sur l'ensemble des types de documents
- [ ] Couverture : 100% du contenu (ne rien manquer dans le document)
- [ ] Automatisation : benchmark exécutable en 1 commande
- [ ] Reproductibilité : résultats cohérents entre les runs
État de l'art (Janvier 2026)¶
Les chiffres de cette section proviennent d’une étude historique. Ils ne constituent pas une baseline actuelle tant que le corpus, la ground truth et les scripts ne sont pas disponibles et rejoués.
Benchmark réalisé¶
Études croisées via Manus et Perplexity sur 30+ solutions.
Top 5 solutions identifiées¶
| Rang | Solution | Score | Forces |
|---|---|---|---|
| 1 | Mistral OCR 3 | 94.89% | Tableaux (98.96%), documents français, 2000 pages/min |
| 2 | Pipeline Multistage | 80.87% vs 9.13% direct | 8.8× amélioration, -92.6% latence, -88% coût |
| 3 | Claude Opus 4.5 | Top schémas | Organigrammes, zoom haute résolution, raisonnement |
| 4 | Azure Document Intelligence | 93% champs | Documents standardisés, modèles pré-entraînés |
| 5 | Manus / Approche Agentique | 69/100 | Orchestration end-to-end, sélection dynamique |
Insight clé¶
L'approche multistage hybrid (OCR spécialisé → VLM compact) surpasse de 8.8× l'approche directe LLM, avec 92.6% de réduction de latence et 88% de réduction de coût.
Architecture cible¶
┌─────────────────────────────────────────────────────────────────┐
│ OCR BENCHMARK SYSTEM │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Golden │ │ OpenRouter │ │ Evaluation │ │
│ │ Dataset │───▶│ API Gateway │───▶│ Engine │ │
│ │ │ │ │ │ │ │
│ │ - Documents │ │ - Claude │ │ - Compare │ │
│ │ - Ground │ │ - GPT-4o │ │ - Score │ │
│ │ Truth JSON │ │ - Gemini │ │ - Report │ │
│ └──────────────┘ │ - Mistral │ └──────────────┘ │
│ │ - Qwen │ │ │
│ └──────────────┘ ▼ │
│ ┌──────────────┐ │
│ │ Results DB │ │
│ │ (SQLite/JSON)│ │
│ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Dashboard │ │
│ │ (HTML/MD) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Composants¶
1. Golden Dataset¶
- Documents : 5 catégories × 2-3 exemplaires = 10-15 documents
- Ground Truth : JSON structuré avec les valeurs attendues par document
- Format :
documents/+ground_truth/
2. OpenRouter Integration¶
- API unifiée pour accéder à tous les modèles
- Pas besoin de gérer chaque API séparément
- Switching facile entre modèles
3. Extraction Script¶
- Python avec
openaiclient (compatible OpenRouter) - Prompt standardisé par type de document
- Output JSON structuré
4. Evaluation Engine¶
- Comparaison extraction vs ground truth
- Métriques : précision par champ, recall, F1-score
- Score global pondéré
5. Results Storage¶
- SQLite ou JSON pour l'historique
- Timestamp + modèle + scores
6. Reporting¶
- Markdown ou HTML
- Graphiques d'évolution
- Alertes si dégradation
Stack technique proposée¶
| Composant | Technologie |
|---|---|
| Langage | Python 3.11+ |
| API Gateway | OpenRouter |
| Client HTTP | httpx ou openai |
| Storage | SQLite + JSON |
| Reporting | Markdown + Matplotlib |
| CI/CD | GitHub Actions (optionnel) |
Golden Dataset - Structure¶
golden_dataset/
├── documents/
│ ├── compromis_vente/
│ │ ├── cv_001.pdf
│ │ └── cv_002.pdf
│ ├── business_plan/
│ │ ├── bp_001.pdf
│ │ └── bp_002.xlsx
│ ├── presentation/
│ │ └── pres_001.pdf
│ ├── liasse_fiscale/
│ │ └── lf_001.pdf
│ └── releve_bancaire/
│ └── rb_001.pdf
│
├── ground_truth/
│ ├── cv_001.json
│ ├── cv_002.json
│ ├── bp_001.json
│ └── ...
│
└── schema/
├── compromis_vente.schema.json
├── business_plan.schema.json
└── ...
Exemple Ground Truth (compromis de vente)¶
{
"document_id": "cv_001",
"document_type": "compromis_vente",
"fields": {
"vendeur": {
"nom": "SCI Les Tilleuls",
"adresse": "12 rue des Lilas, 75011 Paris"
},
"acquereur": {
"nom": "SARL Invest Immo",
"adresse": "45 avenue Victor Hugo, 69006 Lyon"
},
"bien": {
"type": "Appartement T3",
"adresse": "8 rue de la Paix, 75002 Paris",
"surface": 65.5,
"etage": 3
},
"prix": {
"montant": 450000,
"devise": "EUR"
},
"dates": {
"signature_compromis": "2026-01-15",
"date_butoir": "2026-04-15"
},
"conditions_suspensives": [
"Obtention du prêt bancaire",
"Purge du droit de préemption"
]
}
}
Modèles à benchmarker¶
| Modèle | OpenRouter ID | Type |
|---|---|---|
| Claude Opus 4.5 | anthropic/claude-opus-4.5 |
LLM Multimodal |
| Claude Sonnet 4.5 | anthropic/claude-sonnet-4.5 |
LLM Multimodal |
| GPT-4o | openai/gpt-4o |
LLM Multimodal |
| Gemini 2.0 Flash | google/gemini-2.0-flash |
LLM Multimodal |
| Mistral Large | mistralai/mistral-large |
LLM |
| Qwen2.5-VL-72B | qwen/qwen-2.5-vl-72b |
LLM Multimodal |
Note : Mistral OCR n'est pas disponible via OpenRouter, nécessite API directe.
Métriques d'évaluation¶
Par champ¶
- Exact Match : 1 si valeur identique, 0 sinon
- Fuzzy Match : Similarité Levenshtein pour les strings
- Numeric Tolerance : ±1% pour les montants
Par document¶
- Precision : Champs corrects / Champs extraits
- Recall : Champs corrects / Champs attendus
- F1-Score : Moyenne harmonique
Par modèle¶
- Score global : Moyenne pondérée F1 par type de document
- Coût : $ par document
- Latence : Secondes par document
Livrables attendus¶
- Script de benchmark :
benchmark.py - Golden dataset : Documents + Ground truth
- Rapport de résultats :
results/YYYY-MM-DD.md - Dashboard historique : Évolution des scores
Risques et mitigations¶
| Risque | Impact | Mitigation |
|---|---|---|
| Coût API élevé | Budget | Limiter à 5 modèles × 15 docs = 75 appels/run |
| Documents confidentiels | Sécurité | Anonymiser ou utiliser docs fictifs |
| Variabilité des outputs LLM | Reproductibilité | Temperature=0, seed fixe |
| Rate limiting | Disponibilité | Retry avec backoff exponentiel |
Timeline suggérée¶
| Étape | Durée | Description |
|---|---|---|
| 1 | 1 jour | Setup projet + golden dataset (5 docs minimum) |
| 2 | 1 jour | Script d'extraction OpenRouter |
| 3 | 0.5 jour | Evaluation engine + métriques |
| 4 | 0.5 jour | Premier run + rapport |
| 5 | Optionnel | Dashboard + CI/CD |
Total : 3-4 jours pour un MVP opérationnel
Références¶
- OpenRouter Documentation
- Mistral OCR Benchmark
- Stanford Multistage Pipeline Research
- AIMultiple Agentic Document Extraction
Sources¶
- Project associé
- Source migrée :
bricks-os/projects/ocr-benchmark/CONTEXT.md