5.4 KiB
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 depuiscoding_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
# 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()dansrag_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
- Titres markdown (
Fichier: src/pipeline_mco_pmsi/rag/rag_engine.py
# 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
✅ 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
-
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
-
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
-
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
# 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