Un dossier médical patient (DMP) peut contenir 50-200 documents HL7/FHIR : comptes-rendus, biologies, imagerie, prescriptions. Un médecin qui reprend un patient doit tout relire — ou se contenter d'une synthèse rapide. Un LLM local peut produire cette synthèse, respectant le secret médical. Ce guide montre comment parser le HL7, extraire les éléments structurants, et générer un résumé digeste d'un DMP complexe.
Par Mohamed Meguedmi·Màj 2026-03-04·Testé sur Windows, macOS, Linux
#Le problème : DMP en HL7
Le DMP (Dossier Médical Partagé français) expose les documents au format HL7 CDA ou FHIR. Ce sont des XML ou JSON très structurés mais illisibles. Un CR de cardiologie fait facilement 10 000 tokens de balises, avec le texte utile noyé dedans.
i
Deux niveaux de structure
HL7 distingue les données structurées (diagnostics codés CIM-10, prescriptions avec CIP13, biologie avec valeurs typées) et le texte libre (observation clinique, conclusion). Les deux comptent : les premières pour les statistiques, les secondes pour le contexte.
#Stack locale
python-hl7 / fhir.resources
Parseurs HL7 v2 et FHIR. Python, Apache licence.
LlamaIndex + Ollama
Pour structurer la synthèse en plusieurs passes.
Qwen 14B ou Mistral
Qwen gère mieux les textes structurés et le français médical technique.
#1. Parser le HL7 / FHIR
Parser FHIR JSON
from fhir.resources.bundle import Bundle
from fhir.resources.documentreference import DocumentReference
def extraire_documents(bundle_path):
bundle = Bundle.parse_file(bundle_path)
docs = []
for entry in bundle.entry or []:
r = entry.resource
if isinstance(r, DocumentReference):
docs.append({
"id": r.id,
"type": r.type.coding[0].display if r.type and r.type.coding else None,
"date": r.date,
"auteur": r.author[0].display if r.author else None,
"contenu_b64": r.content[0].attachment.data if r.content else None,
})
return docs
#2. Extraire les éléments structurants
Diagnostics
Resource Condition → code CIM-10 + texte. Liste des pathologies chroniques et aiguës.
Ne balancez jamais un bundle FHIR brut au LLM. Extrayez d'abord un dictionnaire propre (Python) avec les champs clés. Le LLM traite ensuite une structure lisible, pas du XML bruité.
#3. Synthèse par un LLM
summarize_dmp.py
import json, requests
def synthese(dmp_extrait: dict) -> str:
prompt = f"""Tu es un médecin assistant.
Voici les données EXTRAITES d'un dossier médical patient.
PATIENT : {dmp_extrait['patient']['nom']}, {dmp_extrait['patient']['age']} ans
DIAGNOSTICS : {json.dumps(dmp_extrait['diagnostics'], ensure_ascii=False)}
TRAITEMENTS EN COURS : {json.dumps(dmp_extrait['traitements'], ensure_ascii=False)}
BIOLOGIES RÉCENTES : {json.dumps(dmp_extrait['bio'], ensure_ascii=False)}
ALLERGIES : {json.dumps(dmp_extrait['allergies'], ensure_ascii=False)}
DERNIERS CR : {dmp_extrait['cr_recents']}
Tâche : produit une SYNTHÈSE de reprise en main en 1 page,
structurée pour un praticien qui découvre le patient."""
r = requests.post("http://localhost:11434/api/chat", json={
"model": "qwen2.5:14b-instruct",
"messages": [
{"role": "system", "content": SYSTEM_MED},
{"role": "user", "content": prompt},
],
"stream": False,
"options": {"temperature": 0.1, "num_ctx": 16384},
})
return r.json()["message"]["content"]
#Prompt médical robuste
SYSTEM_MED
Tu es un assistant médical chargé de produire des synthèses
de reprise de dossier patient.
RÈGLES IMPÉRATIVES
- Tu ne fais JAMAIS de diagnostic. Tu synthétises l'existant.
- Tu ne proposes JAMAIS de prescription ni de modification thérapeutique.
- Tu n'invente AUCUNE donnée (pathologie, médicament, valeur biologique).
- Si une information est incohérente dans les données, tu la signales.
FORMAT DE SORTIE
## Patient
## Pathologies actives (par gravité décroissante)
## Traitements en cours
## Allergies et contre-indications
## Dernières biologies (valeurs anormales seulement)
## Points d'attention / interactions potentielles
## Suivi programmé
STYLE
- Vocabulaire médical standard.
- Puces courtes, pas de phrase redondante.
- Codes CIM-10 / CIP13 / LOINC conservés entre parenthèses.
#Évaluer la fiabilité
Sur données médicales, la confiance ne se construit que par validation manuelle. Protocole minimal :
01
50 dossiers test
Avec synthèse de référence rédigée par un médecin senior.
02
Scoring à 3 niveaux
Correct / imprécis / erroné (hallucination). Comptez par catégorie.
03
Seuil d'acceptabilité
Avant production : 0 erreur sur 50. Toute hallucination est un risque pour un patient.
04
Humain dans la boucle
Le LLM propose, le médecin valide. Jamais l'inverse.
!
Pas de prescription assistée
N'utilisez jamais un LLM pour proposer un traitement, une posologie, un ajustement. Même Qwen 14B peut halluciner une interaction médicamenteuse. La synthèse n'est pas un avis médical.
#Vers la production
Intégration au LGC
La plupart des Logiciels de Gestion de Cabinet (Weda, Axisanté, MediStory) exposent une API locale. Un plugin qui fetche le DMP, appelle votre pipeline, affiche la synthèse.
Certification HDS
Si vous proposez le service à d'autres cabinets (SaaS), vous tombez dans l'hébergeur de données de santé — lourde certification. Usage interne à un cabinet : pas concerné.
Audit et logs
Chaque génération doit être loggée (patient, date, modèle utilisé). Permet de retrouver une synthèse si elle est incluse dans le dossier.
Ce guide vous a aidé ?
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.