- Nouveau module rules_manager.py : CRUD YAML pour les regles metier - Nouveau blueprint bp_rules.py + template admin_rules.html : interface web pour activer/desactiver/ajouter/supprimer des regles - Extraction helpers.py depuis app.py (filtres Jinja2, statistiques, scan dossiers, status systeme) — app.py passe de 1585 a 482 lignes - Suppression backward-compat re-exports dans cim10_extractor et cpam_response (imports corriges dans les tests) - README.md : architecture, modules, installation, utilisation - pyproject.toml : dependencies completes, config ruff, pytest, coverage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
122 lines
4.1 KiB
Markdown
122 lines
4.1 KiB
Markdown
# T2A — Pipeline de codage PMSI automatise
|
|
|
|
Pipeline d'extraction et de codage CIM-10/CCAM pour le PMSI hospitalier (MCO).
|
|
Transforme les comptes rendus d'hospitalisation (CRH) et fiches Trackare en dossiers structures, codes et valorises.
|
|
|
|
## Architecture
|
|
|
|
```
|
|
input/ PDFs bruts (CRH, Trackare, anapath, bacterio)
|
|
|
|
|
v
|
|
[Extraction] pdfplumber / OCR / DOCX / images
|
|
|
|
|
v
|
|
[Anonymisation] CamemBERT NER + regex (PHI -> pseudonymes)
|
|
|
|
|
v
|
|
[Codage CIM-10] LLM local (Ollama) + RAG FAISS + regles ATIH
|
|
| diagnostic_extraction -> validation_pipeline
|
|
v
|
|
[Arbitrage DP] dp_selector (LLM) -> dp_finalizer (deterministe)
|
|
| Trackare vs CRH-only, traçabilite audit
|
|
v
|
|
[Qualite] veto_engine (contestabilite) + decision_engine
|
|
| completude (checklist documents) + severity (CMA)
|
|
v
|
|
[CPAM] cpam_parser + cpam_response (contre-argumentation LLM)
|
|
| guardian deterministe + validation adversariale
|
|
v
|
|
output/ JSON structures, rapports, export RUM
|
|
|
|
|
v
|
|
[Viewer Flask] Dashboard, detail dossier, synthese DIM, CPAM, validation
|
|
```
|
|
|
|
## Modules principaux
|
|
|
|
| Module | Role |
|
|
|--------|------|
|
|
| `src/extraction/` | Parsers PDF, DOCX, images, OCR, classification documents |
|
|
| `src/anonymization/` | Anonymisation NER + regex, registre d'entites |
|
|
| `src/medical/` | CIM-10, CCAM, biologie, RAG FAISS, LLM Ollama, fusion multi-documents |
|
|
| `src/quality/` | Moteur de vetos deterministe, decisions, completude, routage regles |
|
|
| `src/control/` | Controles CPAM, contre-argumentation, validation adversariale |
|
|
| `src/viewer/` | Application Flask (dashboard, detail, DIM, admin, regles) |
|
|
| `config/` | 12 fichiers YAML de regles editables via l'interface web |
|
|
|
|
## Moteur de regles
|
|
|
|
Le pipeline utilise un **moteur de regles 100% deterministe** (pas de LLM) pour :
|
|
- **Vetos** : bloquer les codes sans preuve, negatifs, doublons, contradictions bio
|
|
- **Decisions** : downgrade, ecartement, promotion DP
|
|
- **Conflits** : exclusions mutuelles CIM-10, incompatibilites
|
|
- **Bio** : contradiction labo vs diagnostic code
|
|
- **Completude** : checklist documents manquants
|
|
|
|
Toutes les regles sont dans `config/*.yaml` et editables via `/admin/rules`.
|
|
|
|
## RAG (Retrieval-Augmented Generation)
|
|
|
|
Index FAISS avec ~23 000 vecteurs issus de :
|
|
- CIM-10 FR 2026, Guide Methodologique MCO 2026, CCAM V4
|
|
- 30 referentiels supplementaires (COCOA 2025, fascicules ATIH, etc.)
|
|
- Embeddings : `sentence-camembert-large` (francais medical)
|
|
|
|
Separation en 3 index : `ref` (referentiels), `proc` (procedures), `bio` (biologie).
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
# Prerequis : Python 3.11+, Ollama avec gemma3:27b
|
|
git clone <repo> && cd t2a_v2
|
|
python -m venv .venv && source .venv/bin/activate
|
|
pip install -e ".[dev]"
|
|
|
|
# Variables d'environnement (.env)
|
|
OLLAMA_URL=http://localhost:11434
|
|
T2A_MODEL_CODING=gemma3:27b
|
|
T2A_MODEL_CPAM=mistral-small3.2:24b
|
|
# ANTHROPIC_API_KEY=sk-... (optionnel, fallback cloud)
|
|
```
|
|
|
|
## Utilisation
|
|
|
|
```bash
|
|
# Pipeline CLI : traiter des PDFs
|
|
python -m src.main input/dossier/
|
|
|
|
# Reconstruire l'index RAG
|
|
python -m src.main --rebuild-index
|
|
|
|
# Viewer web (developpement)
|
|
python -m src.viewer
|
|
|
|
# Viewer web (production)
|
|
gunicorn -c gunicorn.conf.py 'src.viewer:create_app()'
|
|
```
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
pytest # 239+ tests, ~10s
|
|
pytest -k test_viewer # Tests viewer uniquement
|
|
pytest -k test_cpam # Tests CPAM
|
|
```
|
|
|
|
## Structure des donnees
|
|
|
|
Chaque dossier produit un JSON structure (`DossierMedical` Pydantic) contenant :
|
|
- `diagnostic_principal` : code CIM-10, confiance, justification, source
|
|
- `diagnostics_associes` : DAS avec decisions (KEEP/DOWNGRADE/REMOVE/RULED_OUT)
|
|
- `actes_ccam` : actes codes
|
|
- `veto_report` : score de contestabilite (0-10), issues detectees
|
|
- `completude` : checklist, score, verdict
|
|
- `ghm_estimation` : GHM, severite, valorisation estimee
|
|
- `controles_cpam` : contre-argumentations generees
|
|
|
|
## Deploiement
|
|
|
|
Service systemd inclus (`t2a-viewer.service`), config gunicorn (`gunicorn.conf.py`).
|
|
Auth HTTP Basic configurable via `T2A_DEMO_USER` / `T2A_DEMO_PASS`.
|