Files
anonymisation/.kiro/specs/anonymization-quality-optimization/tasks.md
Domi31tls 340348b820 feat: Phase 1 - Système d'évaluation de la qualité
- Sélection et copie de 27 documents représentatifs (10 simples, 12 moyens, 5 complexes)
- Outil d'annotation CLI complet (tools/annotation_tool.py)
- Guide d'annotation détaillé (docs/annotation_guide.md)
- Évaluateur de qualité (evaluation/quality_evaluator.py)
  * Calcul Précision, Rappel, F1-Score
  * Identification faux positifs/négatifs
  * Métriques par type de PII
  * Export JSON et rapports texte
- Scanner de fuite (evaluation/leak_scanner.py)
  * Détection PII résiduels (CRITIQUE)
  * Détection nouveaux PII (HAUTE)
  * Scan métadonnées PDF (MOYENNE)
- Benchmark de performance (evaluation/benchmark.py)
  * Mesure temps de traitement
  * Mesure CPU/RAM
  * Export JSON/CSV
- Tests unitaires complets pour tous les composants
- Documentation complète du module d'évaluation

Tâches complétées:
- 1.1.1 Sélection de 27 documents (au lieu de 30)
- 1.1.2 Outil d'annotation CLI
- 1.2.1 Évaluateur de qualité
- 1.2.2 Scanner de fuite
- 1.2.3 Benchmark de performance

Prochaines étapes:
- 1.1.3 Annotation des 27 documents (manuel)
- 1.1.4 Enrichissement stopwords médicaux
- 1.3 Mesure de la baseline
2026-03-02 10:07:41 +01:00

18 KiB
Raw Blame History

Tasks - Optimisation de la Qualité d'Anonymisation

Phase 1 : Mesure et Baseline (2 semaines)

1.1 Création du Dataset de Test Annoté

  • 1.1.1 Sélectionner 30 documents représentatifs des 59 dossiers OGC

    • 1.1.1.1 Analyser la répartition des documents (types, complexité, taille)
    • 1.1.1.2 Sélectionner 10 documents simples (1-2 pages, peu de PII)
    • 1.1.1.3 Sélectionner 15 documents moyens (3-5 pages, PII variés)
    • 1.1.1.4 Sélectionner 5 documents complexes (>5 pages, nombreux PII)
    • 1.1.1.5 Copier les documents dans tests/ground_truth/
  • 1.1.2 Créer l'outil d'annotation CLI

    • 1.1.2.1 Créer tools/annotation_tool.py
    • 1.1.2.2 Implémenter l'extraction et affichage du texte
    • 1.1.2.3 Implémenter la saisie guidée des annotations
    • 1.1.2.4 Implémenter la validation du format JSON
    • 1.1.2.5 Implémenter l'export au format standardisé
    • 1.1.2.6 Ajouter la documentation d'utilisation
  • 1.1.3 Annoter les 30 documents sélectionnés

    • 1.1.3.1 Annoter les 10 documents simples
    • 1.1.3.2 Annoter les 15 documents moyens
    • 1.1.3.3 Annoter les 5 documents complexes
    • 1.1.3.4 Valider les annotations (double vérification)
    • 1.1.3.5 Calculer les statistiques du dataset (PII par type, difficulté)
  • 1.1.4 Enrichir la liste des stopwords médicaux

    • 1.1.4.1 Extraire les termes médicaux des 30 documents annotés
    • 1.1.4.2 Identifier les faux positifs actuels (termes masqués à tort)
    • 1.1.4.3 Ajouter les nouveaux termes à _MEDICAL_STOP_WORDS_SET
    • 1.1.4.4 Documenter les sources des stopwords

1.2 Système d'Évaluation de la Qualité

  • 1.2.1 Implémenter l'évaluateur de qualité

    • 1.2.1.1 Créer evaluation/quality_evaluator.py
    • 1.2.1.2 Implémenter la classe EvaluationResult (dataclass)
    • 1.2.1.3 Implémenter la classe QualityEvaluator
    • 1.2.1.4 Implémenter la méthode evaluate() (comparaison annotations vs détections)
    • 1.2.1.5 Implémenter le calcul des métriques (Précision, Rappel, F1)
    • 1.2.1.6 Implémenter l'identification des faux négatifs
    • 1.2.1.7 Implémenter l'identification des faux positifs
    • 1.2.1.8 Implémenter la génération de rapport texte
    • 1.2.1.9 Ajouter les tests unitaires
  • 1.2.2 Implémenter le scanner de fuite

    • 1.2.2.1 Créer evaluation/leak_scanner.py
    • 1.2.2.2 Implémenter la classe LeakReport (dataclass)
    • 1.2.2.3 Implémenter la classe LeakScanner
    • 1.2.2.4 Implémenter scan_text() (détection PII résiduels)
    • 1.2.2.5 Implémenter scan_metadata() (scan métadonnées PDF)
    • 1.2.2.6 Implémenter la classification par sévérité
    • 1.2.2.7 Implémenter la génération de rapport de fuite
    • 1.2.2.8 Ajouter les tests unitaires
  • 1.2.3 Implémenter le benchmark de performance

    • 1.2.3.1 Créer evaluation/benchmark.py
    • 1.2.3.2 Implémenter la collecte des métriques de temps
    • 1.2.3.3 Implémenter la collecte des métriques CPU/RAM
    • 1.2.3.4 Implémenter la collecte des métriques de qualité
    • 1.2.3.5 Implémenter l'export JSON des résultats
    • 1.2.3.6 Implémenter l'affichage tabulaire des résultats
    • 1.2.3.7 Ajouter les tests unitaires

1.3 Mesure de la Baseline

  • 1.3.1 Exécuter l'évaluation sur le dataset annoté

    • 1.3.1.1 Anonymiser les 30 documents annotés avec le système actuel
    • 1.3.1.2 Exécuter l'évaluateur sur les 30 documents
    • 1.3.1.3 Générer le rapport de qualité baseline
    • 1.3.1.4 Identifier les faux négatifs critiques
    • 1.3.1.5 Identifier les faux positifs fréquents
  • 1.3.2 Exécuter le benchmark de performance

    • 1.3.2.1 Benchmarker le système actuel sur les 30 documents
    • 1.3.2.2 Mesurer le temps de traitement moyen
    • 1.3.2.3 Mesurer l'utilisation CPU/RAM
    • 1.3.2.4 Exporter les résultats baseline
  • 1.3.3 Analyser les résultats baseline

    • 1.3.3.1 Analyser les types de PII manqués (faux négatifs)
    • 1.3.3.2 Analyser les types de faux positifs
    • 1.3.3.3 Identifier les patterns problématiques
    • 1.3.3.4 Prioriser les améliorations à implémenter
    • 1.3.3.5 Documenter les findings dans un rapport

Phase 2 : Amélioration de la Détection (3 semaines)

2.1 Amélioration des Regex

  • 2.1.1 Améliorer la détection des téléphones

    • 2.1.1.1 Créer detectors/improved_regex.py
    • 2.1.1.2 Implémenter RE_TEL_IMPROVED (formats fragmentés)
    • 2.1.1.3 Ajouter 20+ tests unitaires pour les téléphones
    • 2.1.1.4 Valider sur le dataset annoté
  • 2.1.2 Améliorer la détection des emails

    • 2.1.2.1 Implémenter RE_EMAIL_IMPROVED (domaines médicaux)
    • 2.1.2.2 Ajouter 20+ tests unitaires pour les emails
    • 2.1.2.3 Valider sur le dataset annoté
  • 2.1.3 Améliorer la détection des adresses

    • 2.1.3.1 Implémenter RE_ADRESSE_IMPROVED (compléments Bât., Appt.)
    • 2.1.3.2 Ajouter 20+ tests unitaires pour les adresses
    • 2.1.3.3 Valider sur le dataset annoté
  • 2.1.4 Améliorer la détection des NIR

    • 2.1.4.1 Implémenter RE_NIR_IMPROVED (espaces variables)
    • 2.1.4.2 Ajouter 20+ tests unitaires pour les NIR
    • 2.1.4.3 Valider sur le dataset annoté
  • 2.1.5 Améliorer la détection des noms avec caractères spéciaux

    • 2.1.5.1 Adapter les regex pour O'Brien, D'Angelo, Müller, etc.
    • 2.1.5.2 Ajouter 20+ tests unitaires
    • 2.1.5.3 Valider sur le dataset annoté
  • 2.1.6 Intégrer les regex améliorées

    • 2.1.6.1 Remplacer les regex dans anonymizer_core_refactored_onnx.py
    • 2.1.6.2 Exécuter les tests de régression
    • 2.1.6.3 Mesurer l'amélioration (Rappel, Précision)

2.2 Détection Contextuelle

  • 2.2.1 Implémenter le détecteur contextuel

    • 2.2.1.1 Créer detectors/contextual.py
    • 2.2.1.2 Implémenter la classe ContextualDetector
    • 2.2.1.3 Implémenter la détection avec contexte fort
    • 2.2.1.4 Implémenter la détection des noms en MAJUSCULES
    • 2.2.1.5 Implémenter la détection avec contexte faible
    • 2.2.1.6 Implémenter le filtrage via stopwords médicaux
    • 2.2.1.7 Implémenter la dédoplication et tri par confiance
    • 2.2.1.8 Ajouter les tests unitaires
  • 2.2.2 Valider le détecteur contextuel

    • 2.2.2.1 Tester sur le dataset annoté
    • 2.2.2.2 Mesurer le rappel (noms détectés)
    • 2.2.2.3 Mesurer la précision (faux positifs)
    • 2.2.2.4 Ajuster les seuils de confiance si nécessaire

2.3 Approche Hybride

  • 2.3.1 Implémenter le détecteur hybride

    • 2.3.1.1 Créer detectors/hybrid.py
    • 2.3.1.2 Implémenter la classe HybridDetector
    • 2.3.1.3 Implémenter le pipeline en 4 étapes (Regex → EDS → CamemBERT → Contextuel)
    • 2.3.1.4 Implémenter le masquage progressif
    • 2.3.1.5 Implémenter la fusion des résultats
    • 2.3.1.6 Implémenter la traçabilité (méthode de détection)
    • 2.3.1.7 Ajouter les tests d'intégration
  • 2.3.2 Intégrer le détecteur hybride

    • 2.3.2.1 Modifier anonymizer_core_refactored_onnx.py pour utiliser HybridDetector
    • 2.3.2.2 Ajouter la configuration activable/désactivable par détecteur
    • 2.3.2.3 Exécuter les tests de régression
    • 2.3.2.4 Mesurer l'amélioration globale
  • 2.3.3 Optimiser les performances avec GPU

    • 2.3.3.1 Activer l'accélération CUDA pour EDS-Pseudo
    • 2.3.3.2 Activer l'accélération CUDA pour CamemBERT-NER
    • 2.3.3.3 Implémenter le batch processing optimisé pour GPU
    • 2.3.3.4 Tester différentes tailles de batch (4, 8, 16, 32)
    • 2.3.3.5 Mesurer l'utilisation VRAM et ajuster batch_size
    • 2.3.3.6 Implémenter le fallback CPU automatique si GPU indisponible
    • 2.3.3.7 Profiler le code (cProfile + CUDA profiler)
    • 2.3.3.8 Identifier les goulots d'étranglement
    • 2.3.3.9 Optimiser les parties critiques
    • 2.3.3.10 Vérifier que le temps de traitement est < 10s/PDF avec GPU
  • 2.3.4 Implémenter le traitement parallèle multi-PDF

    • 2.3.4.1 Créer un gestionnaire de pool de workers (ProcessPoolExecutor)
    • 2.3.4.2 Tester avec 4, 8, 12 workers (optimal sur 16 cœurs)
    • 2.3.4.3 Implémenter la répartition de charge intelligente
    • 2.3.4.4 Mesurer le speedup avec parallélisation
    • 2.3.4.5 Gérer les conflits d'accès GPU entre workers

2.4 Configuration

  • 2.4.1 Créer le fichier de configuration

    • 2.4.1.1 Créer config/quality_config.yml
    • 2.4.1.2 Définir les paramètres d'évaluation
    • 2.4.1.3 Définir les paramètres de validation
    • 2.4.1.4 Définir les paramètres de détection
    • 2.4.1.5 Définir les paramètres GPU (device, batch_size, max_vram)
    • 2.4.1.6 Définir les paramètres VLM (Ollama URL, model, timeout, confidence)
    • 2.4.1.7 Définir les paramètres de performance (max_workers, parallélisation)
    • 2.4.1.8 Définir les paramètres de reporting
  • 2.4.2 Implémenter le chargement de configuration

    • 2.4.2.1 Utiliser pydantic pour valider la configuration
    • 2.4.2.2 Créer les modèles de configuration typés
    • 2.4.2.3 Implémenter le chargement depuis YAML
    • 2.4.2.4 Ajouter les tests de validation

2.5 Optimisation VLM

  • 2.5.1 Améliorer le prompt VLM

    • 2.5.1.1 Analyser les hallucinations actuelles du VLM
    • 2.5.1.2 Créer un prompt plus précis avec exemples négatifs
    • 2.5.1.3 Ajouter des instructions anti-hallucination
    • 2.5.1.4 Tester sur échantillon de pages manuscrites
    • 2.5.1.5 Mesurer le taux d'hallucination avant/après
  • 2.5.2 Implémenter la validation croisée VLM ↔ NER

    • 2.5.2.1 Créer detectors/vlm_validator.py
    • 2.5.2.2 Implémenter la comparaison VLM vs NER
    • 2.5.2.3 Définir les règles de résolution de conflits
    • 2.5.2.4 Rejeter les détections VLM non confirmées (seuil configurable)
    • 2.5.2.5 Logger les conflits pour analyse
    • 2.5.2.6 Ajouter les tests unitaires
  • 2.5.3 Optimiser les performances VLM

    • 2.5.3.1 Vérifier si Ollama supporte GPU (CUDA)
    • 2.5.3.2 Configurer Ollama pour utiliser le GPU si disponible
    • 2.5.3.3 Mesurer le temps de traitement par page (baseline)
    • 2.5.3.4 Optimiser la résolution d'image (trade-off qualité/vitesse)
    • 2.5.3.5 Implémenter un cache des résultats VLM par hash d'image
    • 2.5.3.6 Mesurer le speedup après optimisations

Phase 3 : Validation et Reporting (1 semaine)

3.1 Validation Post-Anonymisation

  • 3.1.1 Implémenter la validation post-anonymisation

    • 3.1.1.1 Créer core/post_validation.py
    • 3.1.1.2 Implémenter la fonction validate_anonymized_pdf()
    • 3.1.1.3 Intégrer le scanner de fuite
    • 3.1.1.4 Implémenter la vérification de lisibilité
    • 3.1.1.5 Implémenter la génération de certificat
    • 3.1.1.6 Implémenter le mode strict (blocage si fuite)
    • 3.1.1.7 Ajouter les tests unitaires
  • 3.1.2 Intégrer la validation dans le pipeline

    • 3.1.2.1 Modifier anonymizer_core_refactored_onnx.py pour appeler la validation
    • 3.1.2.2 Ajouter l'option --validate en CLI
    • 3.1.2.3 Ajouter l'option dans la GUI
    • 3.1.2.4 Tester sur le dataset annoté

3.2 Reporting

  • 3.2.1 Créer le générateur de rapports

    • 3.2.1.1 Créer tools/quality_reporter.py
    • 3.2.1.2 Implémenter la classe QualityReporter
    • 3.2.1.3 Créer le template HTML (templates/quality_report.html)
    • 3.2.1.4 Implémenter la génération de graphiques (matplotlib)
    • 3.2.1.5 Implémenter l'export JSON
    • 3.2.1.6 Implémenter l'export HTML
    • 3.2.1.7 Ajouter les tests unitaires
  • 3.2.2 Générer les rapports de qualité

    • 3.2.2.1 Générer le rapport baseline (avant optimisation)
    • 3.2.2.2 Générer le rapport après optimisation
    • 3.2.2.3 Créer un rapport comparatif (avant/après)
    • 3.2.2.4 Exporter en HTML et JSON

3.3 Tests de Régression

  • 3.3.1 Créer la suite de tests de régression

    • 3.3.1.1 Créer tests/regression/test_regression.py
    • 3.3.1.2 Implémenter le test de qualité (Rappel ≥ 99.5%, Précision ≥ 97%)
    • 3.3.1.3 Implémenter le test de performance (temps < 30s/PDF)
    • 3.3.1.4 Implémenter le test de non-régression (vs baseline)
    • 3.3.1.5 Configurer pytest pour exécution automatique
  • 3.3.2 Exécuter les tests de régression

    • 3.3.2.1 Exécuter sur le dataset annoté complet
    • 3.3.2.2 Vérifier que tous les tests passent
    • 3.3.2.3 Corriger les régressions si nécessaire

3.4 Validation sur Corpus Complet

  • 3.4.1 Exécuter sur les 59 dossiers OGC complets

    • 3.4.1.1 Anonymiser les 130 fichiers avec le système optimisé
    • 3.4.1.2 Exécuter le scanner de fuite sur tous les fichiers
    • 3.4.1.3 Vérifier qu'aucune fuite critique n'est détectée
    • 3.4.1.4 Générer le rapport de qualité global
  • 3.4.2 Validation manuelle (échantillon)

    • 3.4.2.1 Sélectionner 10 documents aléatoires
    • 3.4.2.2 Vérifier manuellement la qualité d'anonymisation
    • 3.4.2.3 Vérifier la lisibilité médicale
    • 3.4.2.4 Documenter les observations
  • 3.4.3 Comparer avec la baseline

    • 3.4.3.1 Comparer les métriques de qualité (Rappel, Précision, F1)
    • 3.4.3.2 Comparer les métriques de performance (temps, CPU, RAM)
    • 3.4.3.3 Calculer le gain d'amélioration
    • 3.4.3.4 Documenter les résultats

Phase 4 : Documentation et Finalisation (3 jours)

4.1 Documentation

  • 4.1.1 Créer le guide d'annotation

    • 4.1.1.1 Créer docs/annotation_guide.md
    • 4.1.1.2 Documenter le processus d'annotation
    • 4.1.1.3 Documenter le format JSON
    • 4.1.1.4 Ajouter des exemples
  • 4.1.2 Créer le guide d'évaluation

    • 4.1.2.1 Créer docs/evaluation_guide.md
    • 4.1.2.2 Documenter l'utilisation de l'évaluateur
    • 4.1.2.3 Documenter l'utilisation du scanner
    • 4.1.2.4 Documenter l'utilisation du benchmark
    • 4.1.2.5 Ajouter des exemples
  • 4.1.3 Créer la référence API

    • 4.1.3.1 Créer docs/api_reference.md
    • 4.1.3.2 Documenter les classes principales
    • 4.1.3.3 Documenter les méthodes publiques
    • 4.1.3.4 Ajouter des exemples de code
  • 4.1.4 Mettre à jour le README

    • 4.1.4.1 Ajouter la section "Évaluation de la Qualité"
    • 4.1.4.2 Ajouter les nouvelles dépendances
    • 4.1.4.3 Ajouter les exemples d'utilisation
    • 4.1.4.4 Ajouter les métriques de qualité

4.2 Finalisation

  • 4.2.1 Revue de code

    • 4.2.1.1 Vérifier la qualité du code (pylint, black, mypy)
    • 4.2.1.2 Vérifier la couverture de tests (≥ 80%)
    • 4.2.1.3 Vérifier la documentation (docstrings)
    • 4.2.1.4 Corriger les problèmes identifiés
  • 4.2.2 Préparer les livrables

    • 4.2.2.1 Dataset annoté (30+ documents)
    • 4.2.2.2 Code source (détecteurs + évaluation)
    • 4.2.2.3 Tests (unitaires + régression)
    • 4.2.2.4 Documentation (guides + API)
    • 4.2.2.5 Rapports (baseline + optimisé + comparatif)
    • 4.2.2.6 Configuration (quality_config.yml)
  • 4.2.3 Validation finale

    • 4.2.3.1 Vérifier que tous les critères de succès sont atteints
    • 4.2.3.2 Vérifier que les métriques cibles sont atteintes (Rappel ≥ 99.5%, Précision ≥ 97%)
    • 4.2.3.3 Vérifier que les performances sont acceptables (< 30s/PDF)
    • 4.2.3.4 Obtenir la validation d'un expert médical (échantillon)

Tâches Optionnelles (si temps disponible)

  • * Implémenter un cache des résultats NER pour améliorer les performances
  • * Implémenter la parallélisation du traitement par lots (déjà inclus dans Phase 2)
  • * Créer une interface web pour l'annotation (alternative à la CLI)
  • * Implémenter l'export des rapports en PDF
  • * Créer un dashboard de monitoring (Grafana/Prometheus)
  • * Implémenter l'analyse automatique des échecs (suggestions d'amélioration)
  • * Fine-tuner EDS-Pseudo sur le dataset annoté
  • * Implémenter un modèle ensemble (vote majoritaire)
  • * Optimiser le batch size dynamiquement selon la VRAM disponible
  • * Implémenter le préchargement asynchrone des modèles NER
  • * Tester d'autres modèles VLM (Qwen3-VL 8B, LLaVA, etc.)
  • * Implémenter un système de feedback utilisateur pour améliorer le VLM
  • * Créer un mode "review" pour valider les détections VLM manuellement

Dépendances entre Tâches

Critiques (bloquantes) :

  • 1.1 (Dataset annoté) → 1.3 (Baseline) → 2.x (Amélioration) → 3.4 (Validation)
  • 1.2.1 (Évaluateur) → 1.3.1 (Évaluation baseline)
  • 1.2.2 (Scanner) → 3.1 (Validation post-anonymisation)
  • 2.1 + 2.2 + 2.3 (Détecteurs) → 3.3 (Tests régression)

Parallélisables :

  • 1.2.1 (Évaluateur) || 1.2.2 (Scanner) || 1.2.3 (Benchmark)
  • 2.1.1 || 2.1.2 || 2.1.3 || 2.1.4 || 2.1.5 (Regex indépendantes)
  • 4.1.1 || 4.1.2 || 4.1.3 (Documentation)

Estimation de Charge

Phase 1 : 10 jours (2 semaines)

  • Annotation : 5 jours (30 docs × 1h = 30h)
  • Évaluation : 3 jours
  • Baseline : 2 jours

Phase 2 : 15 jours (3 semaines)

  • Regex : 5 jours
  • Contextuel : 3 jours
  • Hybride : 3 jours
  • VLM optimization : 2 jours
  • GPU optimization : 1 jour
  • Config : 1 jour

Phase 3 : 5 jours (1 semaine)

  • Validation : 2 jours
  • Reporting : 1 jour
  • Tests régression : 1 jour
  • Validation corpus : 1 jour

Phase 4 : 3 jours

  • Documentation : 2 jours
  • Finalisation : 1 jour

Total : 33 jours (6.6 semaines) ≈ 7 semaines avec marge