chore(bench): résultats V2 et rapports de benchmarking

Snapshot des 18 JSONs produits par le pipeline V2 (Qwen2.5-VL-3B +
checkboxes densité + validation ATIH), utiles au collaborateur comme
référence de ce que la chaîne actuelle produit.

Rapports :
- bench_v2_report.md       : comparaison V2 vs legacy docTR+VLM
                             (couverture, divergences, régressions
                             notables sur codage_reco et praticien).
- validation_report.md     : résumé de la validation ATIH sur les 18
                             JSONs (131/149 → 140/149 codes valides
                             après fix suffixes `*` et `+N`, 0
                             incohérence GHM↔GHS, 8 suggestions de
                             correction OCR).

Script de comparaison :
- bench_v11_vs_legacy.py   : tableau d'accord champ par champ entre
                             un run du pipeline (output/v2/) et les
                             JSONs legacy (output/).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-24 15:06:30 +02:00
parent 1f75670770
commit b6dd9ff1df
21 changed files with 9524 additions and 0 deletions

58
bench_v2_report.md Normal file
View File

@@ -0,0 +1,58 @@
# Bench V2 (Qwen2.5-VL-3B) vs V0 legacy — 18 dossiers OGC 2018
Bench terminé (18/18 JSONs dans `output/v2/`, 0 parse_error, 0 truncated_loop).
Temps VLM cumulé **495 s****27.5 s / dossier** sur 6 pages. Legacy non-GT : les chiffres ci-dessous mesurent l'écart, pas la justesse absolue.
## Couverture & accord (page `recueil`)
| Champ | V2 extr. | Legacy extr. | Accord (both) | Diffs |
|---|---:|---:|---:|---:|
| n_ogc / finess / date_debut_controle | 100% | 94% | 100% | 0 |
| etablissement / dates_sejour | 100% | 94% | 94% | 1 |
| codage_etab.dp | 100% | 94% | 76% | 4 |
| codage_etab.dp_libelle | 94% | 94% | 69% | 5 |
| codage_etab.dr | 77% | 38% | 20% | 4 |
| **codage_reco.dp** | **27%** | 94% | 25% | 3 |
| ghm_etab / ghs_etab | 100% | 8388% | 8187% | 23 |
| ghm_reco / ghs_reco | 100% | 77% | 93% | 1 |
| recodage_impactant | 100% | 88% | 75% | 4 |
| ghs_injustifie | 100% | 66% | 42% | 7 |
| accord_desaccord | 100% | 94% | 82% | 3 |
| praticien_conseil | 88% | 94% | 47% | 8 |
**DAS** : etab 31/47 récupérés (66%), **reco 5/41 (12%)**.
## Audit visuel — 3 divergences `codage_reco.dp`
| Dossier | Legacy | V2 | Réalité (image) | Gagnant |
|---|---|---|---|---|
| OGC 20 | `D274` | `D374` | **D374** | **V2** (legacy fautif) |
| OGC 66 | `C780` | `C07` (copie etab) | **C780** | **Legacy** |
| OGC 74 | `B991` | `A099` (copie etab) | **≈B991** | **Legacy** |
Pattern : V2 laisse vide (13/18) ou recopie `codage_etab.dp` (3/18) au lieu de lire la colonne droite.
## Top 5 améliorations V2
1. **GHM/GHS reco** 100% vs 77% couverture (+4 dossiers).
2. **Corrections OCR crédibles** : OGC 27 `1652` (invalide CIM-10) → `I652` ; OGC 66 `CO7``C07`.
3. **Zéro parse error** / JSON toujours bien formé (vs boucles DAS tronquées en legacy).
4. **`codage_etab.dr`** mieux rempli : 77% vs 38%.
5. **Entête 100% stable** (finess, dates, n_ogc, étab) — plus aucun rateau.
## Top 3 régressions V2
1. **`codage_reco.*` sous-extrait** : dp 27% vs 94%, DAS reco 12% de récupération. La colonne Recodage est structurellement ignorée.
2. **`praticien_conseil` halluciné** : « DR VIGNAU » dans **15/18** dossiers, y compris où legacy lit clairement PIAU, POSE CATHERINE, Masson. Biais fréquentiel.
3. **`ghs_injustifie` non structuré** : renvoie le libellé complet « 0 SE 1 2 3 4 ATU FFM FSD » au lieu de la case cochée (7 désaccords).
## Verdict
**V2 n'est PAS prêt à remplacer V0 en l'état.** Les champs d'entête, GHM/GHS et DP etab progressent clairement, mais la **colonne Recodage — cœur métier du contrôle T2A** — est quasi-ignorée. Déployer perdrait l'information la plus utile du dossier.
Blocages : (a) extraction `codage_reco.*`, (b) hallucination `praticien_conseil`, (c) `ghs_injustifie` non structuré.
## Actions priorisées
1. **P0 — Prompt `recueil` avec colonne Recodage explicite** : few-shot montrant les deux colonnes (Codage étab | Recodage), demander séparément `codage_reco.{dp,dr,das}`. Tester un crop ciblé demi-page droite avec passe dédiée.
2. **P1 — Anti-hallucination `praticien_conseil`** : contrainte prompt (« si illisible, chaîne vide, ne jamais deviner ») + éventuelle passe OCR manuscrit sur crop bas de page. Valider que VIGNAU ne redevient pas défaut.
3. **P2 — Structurer `ghs_injustifie`** via `checkboxes.py` (case cochée, pas libellé). Au passage corriger `pipeline/persist.py` : `ocr_model="Qwen/Qwen2.5-VL-3B-Instruct"`, `pipeline_version="v2"` (actuellement tag "GLM-OCR" obsolète dans `_meta`).