feat: enrichissement CIM-10 sous-codes + normes biologiques dans prompt DAS

Piste 1 : ajout de cim10_supplements.json (40 sous-codes E10/E11/E13/F10)
fusionné au chargement par load_dict() — E11.9 et autres ne sont plus rejetés.

Piste 2 : export BIO_NORMALS depuis cim10_extractor, inclusion des plages
de référence [N: min-max] dans le contexte LLM et règle explicite dans le
prompt DAS pour éviter les hallucinations sur valeurs biologiques normales.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-12 23:46:42 +01:00
parent f44216b95b
commit e90450903e
7 changed files with 220 additions and 18 deletions

View File

@@ -10,6 +10,7 @@ from ..config import (
OLLAMA_CACHE_PATH, OLLAMA_MAX_PARALLEL, OLLAMA_MODEL,
)
from .cim10_dict import normalize_code, validate_code as cim10_validate
from .cim10_extractor import BIO_NORMALS
from .ccam_dict import validate_code as ccam_validate
from .ollama_client import call_ollama, parse_json_response
from .ollama_cache import OllamaCache
@@ -166,8 +167,15 @@ def _format_contexte(contexte: dict) -> str:
bio_parts = []
for b in biologie:
test, valeur, anomalie = b if isinstance(b, (list, tuple)) else (b.get("test"), b.get("valeur"), b.get("anomalie"))
# Ajouter la plage de référence si connue
norme_str = ""
if test in BIO_NORMALS:
lo, hi = BIO_NORMALS[test]
lo_s = int(lo) if lo == int(lo) else lo
hi_s = int(hi) if hi == int(hi) else hi
norme_str = f" [N: {lo_s}-{hi_s}]"
marker = " (\u2191)" if anomalie else ""
bio_parts.append(f"{test} {valeur}{marker}")
bio_parts.append(f"{test} {valeur}{norme_str}{marker}")
lines.append(f"- Biologie : {', '.join(bio_parts)}")
imagerie = contexte.get("imagerie")
@@ -489,6 +497,7 @@ RÈGLES IMPÉRATIVES :
- Ne PAS coder les antécédents non pertinents pour le séjour
- Privilégie les codes CIM-10 les plus SPÉCIFIQUES (4e ou 5e caractère)
- Ne propose que des diagnostics CLAIREMENT mentionnés dans le texte
- ATTENTION aux valeurs biologiques : ne code PAS un diagnostic si les valeurs sont dans les normes indiquées entre crochets [N: min-max]. Exemple : Créatinine 76 [N: 50-120] = NORMAL, pas d'insuffisance rénale.
DIAGNOSTIC PRINCIPAL : {dp_texte or "Non identifié"}