Spaces:
Running
Running
| # Profils de calcul — chantier 2 post-Sprint 97 | |
| Picarones expose **7 profils de calcul** qui modulent les métriques | |
| calculées par le runner selon le use case. Chaque profil active un | |
| sous-ensemble des **12 hooks document-level** et **12 agrégateurs | |
| corpus-level** du registre central | |
| ([`picarones/evaluation/metric_hooks.py`](../picarones/evaluation/metric_hooks.py)). | |
| ## Synoptique | |
| | Profil | Hooks doc | Cible | CLI dédiée | | |
| |---|---|---|---| | |
| | `minimal` | 0 | Tests rapides, bench massif (CER/WER seuls) | — | | |
| | `standard` (défaut) | 12 | Comportement historique, rétrocompat | `picarones run` | | |
| | `philological` | 12 | Édition critique, paléographie | `picarones edition` | | |
| | `diagnostics` | 12 | Comprendre **pourquoi** un moteur produit ses résultats | `picarones diagnose` | | |
| | `economics` | 12 | Décision budget : pages/h utilisable, coût marginal | `picarones economics` | | |
| | `pipeline` | 12 | Bench de pipelines composées (axe B) | `picarones pipeline run` | | |
| | `full` | 12 | R&D — tout ce qui peut être calculé | — | | |
| > **Note rétrocompat** : aujourd'hui les profils `philological`, `diagnostics`, | |
| > `economics`, `pipeline` et `full` activent **le même ensemble** que `standard` | |
| > côté hooks calculés. Ce qui change, c'est la **vue HTML rendue** : chaque | |
| > profil active des sous-sections différentes du rapport (cf. `docs/reference/views.md`). | |
| > Les profils sont volontairement génériques pour permettre aux contributeurs | |
| > futurs d'ajouter des hooks spécifiques sans casser l'API. | |
| ## Détail des hooks par profil | |
| ### `minimal` | |
| Aucun hook. Le runner calcule uniquement les métriques de base | |
| (`cer`, `wer`, `mer`, `wil` via `compute_metrics`). Les `DocumentResult` | |
| n'ont **aucun champ** `confusion_matrix`, `taxonomy`, `calibration`, etc. | |
| **Cas d'usage** : bench de régression sur 10 000 documents pour mesurer | |
| le CER d'une mise à jour de modèle, sans avoir besoin du diagnostic | |
| philologique. Réduit drastiquement le temps de calcul (∼5× plus rapide). | |
| ```bash | |
| picarones run --corpus ./corpus --profile minimal | |
| ``` | |
| ### `standard` (défaut) | |
| Active les 12 hooks document-level historiques : | |
| | Hook | Sprint | Champ DocumentResult | Notes | | |
| |---|---|---|---| | |
| | `confusion` | 5 | `confusion_matrix` | Matrice unicode | | |
| | `char_scores` | 5 | `char_scores` | Ligatures + diacritiques | | |
| | `taxonomy` | 5 | `taxonomy` | 9 classes d'erreurs | | |
| | `structure` | 5 | `structure` | Lignes / blocs / mots | | |
| | `image_quality` | 5 | `image_quality` | Contraste, bruit, flou… | | |
| | `line_metrics` | 10 | `line_metrics` | Distribution CER + Gini | | |
| | `hallucination` | 10 | `hallucination_metrics` | Détection VLM | | |
| | `calibration` | 42 | `calibration_metrics` | ECE/MCE (si confidences) | | |
| | `philological` | 61 | `philological_metrics` | 6 modules (Sprints 55-60) | | |
| | `searchability` | 86 | `searchability_metrics` | Fuzzy recall (Sprint 84) | | |
| | `numerical_sequences` | 86 | `numerical_sequence_metrics` | Sprint 85 | | |
| | `readability` | 87 | `readability_metrics` | Δ Flesch (Sprint 52) | | |
| 12 agrégateurs corpus-level correspondants remplissent les attributs | |
| `aggregated_*` de chaque `EngineReport`. | |
| ### `philological` (édition critique) | |
| Active les 12 hooks `standard` + déclenchera (chantiers futurs) | |
| l'enrichissement par des hooks dédiés à la paléographie médiévale, | |
| l'imprimé ancien et les archives modernes (déjà calculés via le module | |
| `philological` du `standard`, mais valorisés différemment dans la vue | |
| HTML « Taxonomie avancée »). | |
| ```bash | |
| picarones edition --corpus ./manuscrits --engines tesseract,pero_ocr | |
| ``` | |
| Vue HTML supplémentaire activée : `view_advanced_taxonomy.html` avec | |
| diagramme miroir leader vs runner-up, classes par récupérabilité | |
| éditoriale. | |
| ### `diagnostics` (analyse approfondie) | |
| Identique à `standard` côté hooks. Déclenche la vue HTML « Diagnostic | |
| approfondi » avec **leviers d'amélioration** factuels (jamais | |
| prescriptifs) calculés par `picarones.domain.levers.detect_levers()`. | |
| ```bash | |
| picarones diagnose --corpus ./corpus --engines tess,pero | |
| ``` | |
| Vue HTML supplémentaire : `view_diagnostics.html` avec : | |
| - Leviers d'amélioration (`dominant_recoverable_class`, | |
| `pareto_concentration`, etc.). | |
| - Profil d'image du corpus (complexité paléographique + homogénéité, | |
| opt-in). | |
| - Comparaison historique (baseline, opt-in si historique SQLite). | |
| ### `economics` (décision budget) | |
| Active la vue HTML « Coût et performance » avec **throughput effectif** | |
| calculé selon la formule HTR-United (5 s/erreur de correction humaine). | |
| Discrimine entre un moteur cloud rapide mais imprécis (drag élevé) et | |
| un local lent mais fiable. | |
| ```bash | |
| picarones economics --corpus ./corpus --engines mistral_ocr,tesseract | |
| ``` | |
| ### `pipeline` (axe B) | |
| Profil utilisé par `picarones pipeline run` pour les benchmarks de | |
| pipelines composées (Sprints 32-34, 53-54, 63-68, 94-97 + chantier 1). | |
| La vue HTML produite contient le DAG visuel de la pipeline, | |
| l'absorption d'erreur par jonction, et la comparaison incrémentale par | |
| slot. | |
| ```bash | |
| picarones pipeline run examples/pipelines/ocr_to_alto.yaml --corpus DIR | |
| ``` | |
| ### `full` | |
| Active **tous** les hooks et toutes les vues. Coût maximal mais | |
| reproductibilité scientifique maximale. | |
| ## Comment ajouter un hook personnalisé | |
| Voir [`docs/explanation/narrative-engine.md`](developer/narrative-engine.md) | |
| pour le détail. Pattern de base : | |
| ```python | |
| from picarones.evaluation.metric_hooks import ( | |
| register_document_metric, PROFILE_DIAGNOSTICS, PROFILE_FULL, | |
| ) | |
| @register_document_metric( | |
| name="my_metric", | |
| attribute="my_metric", # nom du champ DocumentResult | |
| profiles=(PROFILE_DIAGNOSTICS, PROFILE_FULL), | |
| requires_success=True, | |
| ) | |
| def my_hook(*, ground_truth, hypothesis, image_path, corpus_lang, ocr_result): | |
| from my_module import compute_my_metric | |
| return compute_my_metric(ground_truth, hypothesis) | |
| ``` | |
| ## Code source | |
| - [`picarones/evaluation/metric_hooks.py`](../picarones/evaluation/metric_hooks.py) | |
| — registre, profils, `run_document_hooks()`, `run_corpus_aggregators()`. | |
| - [`picarones/evaluation/metrics/builtin_hooks.py`](../picarones/evaluation/metrics/builtin_hooks.py) | |
| — les 12 hooks doc + 12 agrégateurs natifs Picarones. | |
| - [`tests/test_metric_hooks.py`](../tests/test_metric_hooks.py) | |
| — tests unitaires + rétrocompat profil `standard`. | |