162 lines
5.4 KiB
Markdown
162 lines
5.4 KiB
Markdown
# Corrections Interface Web et Sauvegarde Base de Données
|
|
|
|
## Date: 2026-02-12
|
|
|
|
## Problèmes Corrigés
|
|
|
|
### 1. ❌ Erreur de sauvegarde en base de données (NOT NULL constraint)
|
|
|
|
**Symptôme**: Les codes n'étaient pas sauvegardés en base car les champs `model_name`, `model_digest`, et `prompt_version` étaient NULL.
|
|
|
|
**Cause**: La méthode `_save_code()` ne recevait pas les informations de version du modèle.
|
|
|
|
**Solution**:
|
|
- Modifié `_save_codes_to_database()` pour extraire les informations de version depuis `coding_proposal.model_version`
|
|
- Ajouté les paramètres `model_name`, `model_digest`, `prompt_version` à la méthode `_save_code()`
|
|
- Passé ces valeurs lors de la création de l'objet `CodeDB`
|
|
|
|
**Fichier**: `src/pipeline_mco_pmsi/pipeline.py`
|
|
|
|
```python
|
|
# Avant
|
|
def _save_code(self, stay_db_id: int, code, code_type: str) -> None:
|
|
code_db = CodeDB(
|
|
stay_id=stay_db_id,
|
|
code=code.code,
|
|
label=code.label,
|
|
type=code_type,
|
|
confidence=code.confidence,
|
|
reasoning=code.reasoning,
|
|
referentiel_version=code.referentiel_version,
|
|
status="proposed"
|
|
)
|
|
|
|
# Après
|
|
def _save_code(self, stay_db_id: int, code, code_type: str,
|
|
model_name: str, model_digest: str, prompt_version: str) -> None:
|
|
code_db = CodeDB(
|
|
stay_id=stay_db_id,
|
|
code=code.code,
|
|
label=code.label,
|
|
type=code_type,
|
|
confidence=code.confidence,
|
|
reasoning=code.reasoning,
|
|
referentiel_version=code.referentiel_version,
|
|
status="proposed",
|
|
model_name=model_name,
|
|
model_digest=model_digest,
|
|
prompt_version=prompt_version
|
|
)
|
|
```
|
|
|
|
### 2. ❌ Extraction CCAM retournait "UNKNOWN"
|
|
|
|
**Symptôme**: Les codes CCAM n'étaient pas correctement extraits des chunks, retournant "UNKNOWN" au lieu du code réel.
|
|
|
|
**Cause**: Le regex ne gérait pas le format markdown utilisé dans les chunks CCAM (`### YYYY001` suivi de `**Description**: ...`).
|
|
|
|
**Solution**:
|
|
- Amélioré la méthode `_extract_code_and_label()` dans `rag_engine.py`
|
|
- Ajouté plusieurs patterns de détection:
|
|
- Titres markdown (`### YYYY001`)
|
|
- Format classique (`YYYY001 Libellé`)
|
|
- Extensions ATIH (`YYYY001+ABC`)
|
|
- Recherche flexible dans tout le texte
|
|
|
|
**Fichier**: `src/pipeline_mco_pmsi/rag/rag_engine.py`
|
|
|
|
```python
|
|
# Nouveau pattern pour titres markdown
|
|
pattern_title = re.compile(r"^###\s+([A-Z]{4}[0-9]{3}(?:\+[A-Z0-9]{3})?)(?:\s|$)")
|
|
|
|
# Pattern flexible pour recherche dans tout le texte
|
|
pattern_anywhere = re.compile(r"([A-Z]{4}[0-9]{3}(?:\+[A-Z0-9]{3})?)")
|
|
```
|
|
|
|
## Résultats
|
|
|
|
### ✅ Codes sauvegardés en base
|
|
|
|
```bash
|
|
✅ Codes sauvegardés: 56
|
|
- dp: F05.0 - Délirium non surajouté à une démence, ainsi décrit
|
|
- dr: K80 - Cholélithiase
|
|
- das: S00 - Lésion traumatique superficielle de la tête
|
|
- das: K73.8 - Autres hépatites chroniques, non classées ailleurs
|
|
- ccam: HMCC003 - Cholécystogastrostomie ou cholécystoduodénostomie, par cœlioscopie
|
|
```
|
|
|
|
### ✅ Interface web fonctionnelle
|
|
|
|
L'endpoint API `/stays/15_23096332/coding-proposal` retourne maintenant correctement:
|
|
- Le DP avec preuves et justification
|
|
- Le DR avec preuves et justification
|
|
- Les DAS (25 codes)
|
|
- Les CCAM (29 actes)
|
|
- Les scores de confiance
|
|
- Les raisonnements du codeur
|
|
|
|
**URL**: http://localhost:8001/stays/15_23096332/coding-proposal
|
|
|
|
## Problèmes Restants
|
|
|
|
### ⚠️ Qualité du codage
|
|
|
|
Le codage proposé n'est pas optimal:
|
|
- **DP proposé**: F05.0 (Délirium) au lieu de K80/K81 (Cholécystite)
|
|
- **DAS absurdes**: S00 (Lésion tête), K73.8 (Hépatite), codes non pertinents
|
|
- **Cause probable**:
|
|
- Extraction de faits cliniques incorrecte
|
|
- Recherche RAG retournant des codes non pertinents
|
|
- Logique de sélection du DP à améliorer
|
|
|
|
### ⚠️ Mémoire GPU saturée
|
|
|
|
Le cross-encoder pour le reranking échoue avec "CUDA out of memory":
|
|
- GPU saturé par d'autres processus (6.72 GiB utilisés par process 3600706)
|
|
- Le fallback CPU fonctionne mais est plus lent
|
|
- **Solution temporaire**: Le code gère l'erreur et continue sans reranking
|
|
- **Solution permanente**: Libérer la mémoire GPU ou forcer l'utilisation du CPU
|
|
|
|
## Prochaines Étapes
|
|
|
|
1. **Améliorer la qualité du codage**:
|
|
- Revoir l'extraction des faits cliniques
|
|
- Améliorer la recherche RAG (meilleurs prompts, meilleurs embeddings)
|
|
- Affiner la logique de sélection du DP
|
|
|
|
2. **Optimiser l'utilisation GPU**:
|
|
- Identifier et arrêter les processus GPU inutiles
|
|
- Forcer le cross-encoder sur CPU de manière plus robuste
|
|
- Considérer un modèle cross-encoder plus léger
|
|
|
|
3. **Tester l'interface web complète**:
|
|
- Vérifier l'affichage dans le navigateur
|
|
- Tester les fonctionnalités de correction
|
|
- Tester la validation des dossiers
|
|
|
|
## Commandes de Test
|
|
|
|
```bash
|
|
# Traiter le séjour complet
|
|
python process_sejour_15_complet.py
|
|
|
|
# Vérifier les codes en base
|
|
python -c "
|
|
from pipeline_mco_pmsi.database.base import get_engine, get_session
|
|
from pipeline_mco_pmsi.database.models import StayDB, CodeDB
|
|
|
|
engine = get_engine('sqlite:///pipeline_mco_pmsi.db')
|
|
with get_session(engine) as session:
|
|
stay = session.query(StayDB).filter(StayDB.stay_id == '15_23096332').first()
|
|
codes = session.query(CodeDB).filter(CodeDB.stay_id == stay.id, CodeDB.status == 'proposed').all()
|
|
print(f'Codes: {len(codes)}')
|
|
"
|
|
|
|
# Tester l'API
|
|
curl http://localhost:8001/stays/15_23096332/coding-proposal | python -m json.tool
|
|
|
|
# Démarrer l'interface web
|
|
python -m uvicorn pipeline_mco_pmsi.api.tim_api:app --host 0.0.0.0 --port 8001
|
|
```
|