spec: Architecture complète avec VLM (5 couches détection)
- Ajout documentation VLM (Ollama qwen2.5vl:7b) - Pipeline complet: Regex → VLM → EDS-Pseudo → CamemBERT → Contextuel - Nouvelles exigences REQ-013/REQ-014 pour optimisation VLM - Tâches Phase 2.5: amélioration prompt, validation croisée, perf - Document ARCHITECTURE_REELLE.md avec détails complets - Matériel: AMD Ryzen 9 9950X, 128GB RAM, RTX 5070 12GB - Objectifs: Rappel ≥99.5%, Précision ≥97%, F1 ≥0.98
This commit is contained in:
321
.kiro/specs/anonymization-quality-optimization/SUMMARY.md
Normal file
321
.kiro/specs/anonymization-quality-optimization/SUMMARY.md
Normal file
@@ -0,0 +1,321 @@
|
||||
# Résumé Exécutif - Optimisation de la Qualité d'Anonymisation
|
||||
|
||||
## Contexte
|
||||
|
||||
Vous disposez d'un système d'anonymisation de documents PDF médicaux qui combine **4 couches de détection** :
|
||||
|
||||
**1. Extraction multi-passes** : pdfplumber → pdfminer → PyMuPDF → docTR OCR → tesseract
|
||||
|
||||
**2. Détection par regex** : EMAIL, TEL, NIR, IBAN, IPP, FINESS, RPPS, OGC, dates, adresses
|
||||
|
||||
**3. VLM (Vision Language Model)** : Ollama avec qwen2.5vl:7b pour analyse visuelle des PDF scannés
|
||||
- Détecte 20+ catégories de PII visuellement (manuscrit, mal orienté)
|
||||
- Matching flou pour identifiants numériques manuscrits
|
||||
- Masquage total des pages manuscrites (< 100 mots OCR)
|
||||
|
||||
**4. NER** : EDS-Pseudo (AP-HP, F1=0.97) via edsnlp OU CamemBERT-NER ONNX
|
||||
|
||||
**5. Consolidation** : Propagation globale + extraction Trackare + rescan sélectif
|
||||
|
||||
**Corpus de travail** : 59 dossiers OGC (130 fichiers PDF) dans `/home/dom/Téléchargements/II-1 Ctrl_T2A_2025_CHCB_DocJustificatifs (1)/`
|
||||
|
||||
## Problématique
|
||||
|
||||
- ❌ Faux négatifs (PII non détectés) → Risque RGPD
|
||||
- ❌ Faux positifs (termes médicaux masqués) → Documents illisibles
|
||||
- ❌ VLM peut halluciner sur pages manuscrites complexes
|
||||
- ❌ Pas de métriques de qualité mesurables
|
||||
- ❌ Pas de validation post-anonymisation
|
||||
- ❌ Pas d'optimisation GPU pour VLM (Ollama local)
|
||||
|
||||
## Objectifs
|
||||
|
||||
**Métriques cibles** :
|
||||
- Rappel ≥ 99.5% (max 0.5% de PII manqués)
|
||||
- Précision ≥ 97% (max 3% de faux positifs)
|
||||
- F1-Score ≥ 0.98
|
||||
- Temps < 10s par PDF (avec GPU)
|
||||
|
||||
**Matériel disponible** :
|
||||
- CPU : AMD Ryzen 9 9950X (16 cœurs / 32 threads)
|
||||
- RAM : 128 GB
|
||||
- GPU : NVIDIA RTX 5070 (12 GB VRAM)
|
||||
- CUDA : PyTorch 2.10.0 avec support CUDA
|
||||
|
||||
## Solution Proposée
|
||||
|
||||
### 1. Mesure (2 semaines)
|
||||
|
||||
**Créer un dataset de test annoté** :
|
||||
- Sélectionner 30 documents représentatifs
|
||||
- Annoter manuellement tous les PII
|
||||
- Format JSON standardisé
|
||||
|
||||
**Implémenter l'évaluation** :
|
||||
- Évaluateur de qualité (Précision, Rappel, F1)
|
||||
- Scanner de fuite (détection PII résiduels)
|
||||
- Benchmark de performance
|
||||
|
||||
**Mesurer la baseline** :
|
||||
- Évaluer le système actuel
|
||||
- Identifier les faux négatifs/positifs
|
||||
- Benchmarker les performances
|
||||
|
||||
### 2. Amélioration (3 semaines)
|
||||
|
||||
**Regex améliorées** :
|
||||
- Téléphones fragmentés : `06 12 34\n56 78`
|
||||
- Emails médicaux : `nom@chu-bordeaux.fr`
|
||||
- Adresses avec compléments : `12 rue X, Bât. B, Appt. 12`
|
||||
- NIR avec espaces variables
|
||||
- Noms avec caractères spéciaux : `O'Brien, Müller`
|
||||
|
||||
**Détection contextuelle** :
|
||||
- Noms après "Dr.", "Patient:", etc.
|
||||
- Noms en MAJUSCULES (hors stopwords médicaux)
|
||||
- Filtrage des faux positifs
|
||||
|
||||
**Approche hybride** :
|
||||
- Pipeline en 5 étapes : Regex → VLM (si scanné) → EDS-Pseudo → CamemBERT → Contextuel
|
||||
- Masquage progressif (éviter doublons)
|
||||
- Fusion intelligente des résultats
|
||||
- Validation croisée VLM ↔ NER (anti-hallucination)
|
||||
- Accélération GPU pour NER et optimisation VLM
|
||||
- Traitement parallèle de plusieurs PDFs (8-12 workers)
|
||||
|
||||
### 3. Validation (1 semaine)
|
||||
|
||||
**Validation post-anonymisation** :
|
||||
- Scanner automatique de fuite
|
||||
- Vérification métadonnées PDF
|
||||
- Certificat de conformité
|
||||
|
||||
**Tests de régression** :
|
||||
- Suite automatique sur dataset annoté
|
||||
- Alerte si dégradation des métriques
|
||||
|
||||
**Validation corpus complet** :
|
||||
- Exécution sur les 59 dossiers OGC
|
||||
- Vérification 0 fuite critique
|
||||
- Validation manuelle (échantillon)
|
||||
|
||||
### 4. Documentation (3 jours)
|
||||
|
||||
- Guide d'annotation
|
||||
- Guide d'évaluation
|
||||
- Référence API
|
||||
- Rapports de qualité
|
||||
|
||||
## Architecture Cible
|
||||
|
||||
```
|
||||
PDF → Extraction texte → Détection Hybride → Consolidation → Redaction
|
||||
(5 passes + GPU) ↓
|
||||
Validation Post-Anonymisation
|
||||
↓
|
||||
Certificat de Conformité
|
||||
```
|
||||
|
||||
**Détection Hybride** :
|
||||
1. Regex améliorées (formats structurés)
|
||||
2. VLM optimisé (Ollama qwen2.5vl:7b) - si PDF scanné
|
||||
3. EDS-Pseudo (noms, contexte médical) - GPU accéléré
|
||||
4. CamemBERT-NER (fallback) - GPU accéléré
|
||||
5. Contextuel (patterns linguistiques)
|
||||
|
||||
**Optimisations Performance** :
|
||||
- Accélération CUDA pour modèles NER
|
||||
- Batch processing optimisé (12 GB VRAM)
|
||||
- VLM avec prompt amélioré et validation croisée
|
||||
- Traitement parallèle multi-PDF (16 cœurs)
|
||||
- Temps cible : < 10s par PDF (textuel), < 30s (scanné avec VLM)
|
||||
|
||||
## Livrables
|
||||
|
||||
1. ✅ Dataset annoté (30+ documents)
|
||||
2. ✅ Système d'évaluation (évaluateur + scanner + benchmark)
|
||||
3. ✅ Détecteurs améliorés (regex + contextuel + hybride)
|
||||
4. ✅ Tests de régression automatiques
|
||||
5. ✅ Rapports de qualité (HTML + JSON)
|
||||
6. ✅ Documentation complète
|
||||
7. ✅ Métriques baseline et finales
|
||||
|
||||
## Planning
|
||||
|
||||
| Phase | Durée | Tâches Principales |
|
||||
|-------|-------|-------------------|
|
||||
| **Phase 1 : Mesure** | 2 semaines | Dataset annoté, Évaluation, Baseline |
|
||||
| **Phase 2 : Amélioration** | 3 semaines | Regex, Contextuel, Hybride, GPU optimization |
|
||||
| **Phase 3 : Validation** | 1 semaine | Post-validation, Tests, Corpus complet |
|
||||
| **Phase 4 : Documentation** | 3 jours | Guides, API, Rapports |
|
||||
| **Total** | **7 semaines** | |
|
||||
|
||||
## Prochaines Étapes
|
||||
|
||||
### Étape 1 : Sélectionner les Documents de Test
|
||||
|
||||
```bash
|
||||
# Analyser le corpus
|
||||
cd "/home/dom/Téléchargements/II-1 Ctrl_T2A_2025_CHCB_DocJustificatifs (1)/"
|
||||
find . -name "*.pdf" | wc -l # Compter les PDFs
|
||||
|
||||
# Sélectionner 30 documents représentatifs
|
||||
# - 10 simples (1-2 pages, peu de PII)
|
||||
# - 15 moyens (3-5 pages, PII variés)
|
||||
# - 5 complexes (>5 pages, nombreux PII)
|
||||
|
||||
# Copier dans tests/ground_truth/
|
||||
mkdir -p tests/ground_truth
|
||||
# Copier manuellement les 30 PDFs sélectionnés
|
||||
```
|
||||
|
||||
### Étape 2 : Créer l'Outil d'Annotation
|
||||
|
||||
```bash
|
||||
# Créer le fichier
|
||||
touch tools/annotation_tool.py
|
||||
|
||||
# Implémenter l'outil CLI pour annoter les PDFs
|
||||
# (voir design.md section 2.1.2 pour les spécifications)
|
||||
```
|
||||
|
||||
### Étape 3 : Annoter les Documents
|
||||
|
||||
```bash
|
||||
# Lancer l'outil d'annotation
|
||||
python tools/annotation_tool.py tests/ground_truth/
|
||||
|
||||
# Pour chaque PDF :
|
||||
# 1. Afficher le texte page par page
|
||||
# 2. Saisir les PII (type, texte, contexte)
|
||||
# 3. Lister les termes médicaux à préserver
|
||||
# 4. Sauvegarder en JSON
|
||||
```
|
||||
|
||||
### Étape 4 : Implémenter l'Évaluateur
|
||||
|
||||
```bash
|
||||
# Créer le fichier
|
||||
touch evaluation/quality_evaluator.py
|
||||
|
||||
# Implémenter :
|
||||
# - Classe EvaluationResult
|
||||
# - Classe QualityEvaluator
|
||||
# - Méthode evaluate()
|
||||
# - Calcul Précision/Rappel/F1
|
||||
# - Génération de rapport
|
||||
```
|
||||
|
||||
### Étape 5 : Mesurer la Baseline
|
||||
|
||||
```bash
|
||||
# Anonymiser les 30 documents annotés
|
||||
python Pseudonymisation_Gui_V5.py # Ou CLI
|
||||
|
||||
# Évaluer
|
||||
python evaluation/quality_evaluator.py \
|
||||
--ground-truth tests/ground_truth/ \
|
||||
--output reports/baseline_report.html
|
||||
|
||||
# Analyser les résultats
|
||||
# - Identifier les faux négatifs
|
||||
# - Identifier les faux positifs
|
||||
# - Prioriser les améliorations
|
||||
```
|
||||
|
||||
## Points d'Attention
|
||||
|
||||
### Annotation Manuelle
|
||||
|
||||
⚠️ **Temps estimé** : 30 documents × 1h = 30 heures
|
||||
- Prévoir 5 jours dédiés
|
||||
- Possibilité de paralléliser (2 annotateurs)
|
||||
- Validation croisée recommandée
|
||||
|
||||
### Optimisation GPU
|
||||
|
||||
✅ **Accélération disponible** : RTX 5070 avec 12 GB VRAM
|
||||
- EDS-Pseudo et CamemBERT-NER peuvent utiliser CUDA
|
||||
- Batch processing optimisé pour réduire le temps de traitement
|
||||
- Objectif : < 10s par PDF (vs 30s en CPU-only)
|
||||
- Fallback CPU automatique si GPU indisponible
|
||||
|
||||
### Traitement Parallèle
|
||||
|
||||
✅ **Puissance CPU** : 16 cœurs / 32 threads
|
||||
- Traitement simultané de 8-12 PDFs
|
||||
- Speedup significatif sur corpus complet
|
||||
- Répartition de charge intelligente
|
||||
|
||||
### Faux Négatifs Critiques
|
||||
|
||||
⚠️ **Priorité RGPD** : 0 faux négatif = objectif
|
||||
- Scanner de fuite obligatoire
|
||||
- Validation post-anonymisation en mode strict
|
||||
- Double vérification manuelle sur échantillon
|
||||
|
||||
### Faux Positifs Médicaux
|
||||
|
||||
⚠️ **Lisibilité** : Préserver les termes médicaux
|
||||
- Enrichir la liste des stopwords
|
||||
- Validation par expert médical
|
||||
- Ajustement des seuils de confiance
|
||||
|
||||
## Critères de Succès
|
||||
|
||||
✅ **Qualité** :
|
||||
- Rappel ≥ 99.5%
|
||||
- Précision ≥ 97%
|
||||
- F1-Score ≥ 0.98
|
||||
- Taux de documents sûrs ≥ 98%
|
||||
|
||||
✅ **Performance** :
|
||||
- Temps < 10s par PDF (avec GPU)
|
||||
- Temps < 30s par PDF (fallback CPU)
|
||||
- RAM < 32 GB par processus
|
||||
- VRAM < 10 GB
|
||||
- Pas de dégradation > 20% vs baseline
|
||||
|
||||
✅ **Livrables** :
|
||||
- Dataset annoté créé
|
||||
- Système d'évaluation fonctionnel
|
||||
- Tests de régression en place
|
||||
- Documentation complète
|
||||
|
||||
✅ **Validation** :
|
||||
- 0 fuite critique sur corpus complet
|
||||
- Validation expert médical (échantillon)
|
||||
- Amélioration mesurable vs baseline
|
||||
|
||||
## Ressources
|
||||
|
||||
**Documentation** :
|
||||
- `requirements.md` : Exigences détaillées
|
||||
- `design.md` : Architecture technique
|
||||
- `tasks.md` : Plan d'implémentation
|
||||
- `README.md` : Vue d'ensemble
|
||||
|
||||
**Code** :
|
||||
- `tools/annotation_tool.py` : Outil d'annotation
|
||||
- `evaluation/quality_evaluator.py` : Évaluateur
|
||||
- `evaluation/leak_scanner.py` : Scanner de fuite
|
||||
- `detectors/improved_regex.py` : Regex améliorées
|
||||
- `detectors/contextual.py` : Détection contextuelle
|
||||
- `detectors/hybrid.py` : Approche hybride
|
||||
|
||||
**Tests** :
|
||||
- `tests/unit/` : Tests unitaires
|
||||
- `tests/regression/` : Tests de régression
|
||||
- `tests/ground_truth/` : Dataset annoté
|
||||
|
||||
**Configuration** :
|
||||
- `config/quality_config.yml` : Configuration qualité
|
||||
|
||||
**Rapports** :
|
||||
- `reports/baseline_report.html` : Rapport baseline
|
||||
- `reports/final_report.html` : Rapport final
|
||||
- `reports/comparison.html` : Comparaison avant/après
|
||||
|
||||
---
|
||||
|
||||
**Prêt à démarrer ?** Commencez par la Phase 1 : Sélection et annotation des 30 documents de test !
|
||||
Reference in New Issue
Block a user