Prompt Engineering Médical : Guide du Domaine Santé avec Claude
By Learnia AI Research Team
Prompt Engineering Médical : Guide du Domaine Santé avec Claude
Le prompt engineering dans le domaine médical n'a rien à voir avec la classification de tickets ou la génération de contenu marketing. Ici, chaque mot compte : une hallucination peut devenir un diagnostic erroné, une omission peut retarder un traitement, et un format incorrect peut rendre une note clinique inutilisable. Ce guide vous montre comment concevoir des prompts fiables pour le domaine de la santé, avec des garde-fous adaptés aux enjeux cliniques.
Pourquoi le Prompting Médical Est Différent
Le domaine de la santé impose des contraintes qui n'existent pas ailleurs. Comprendre ces différences est le prérequis avant d'écrire la moindre ligne de prompt.
Les 4 risques spécifiques
- →Hallucination factuelle — Le modèle invente un dosage, un code ICD-10, ou une interaction médicamenteuse
- →Omission clinique — Des informations critiques du dossier patient sont ignorées
- →Fausse certitude — Le modèle présente une hypothèse comme un fait établi
- →Biais démographique — Les recommandations varient selon l'âge, le sexe ou l'ethnicité de manière non justifiée
Pour approfondir la détection d'hallucinations et de biais, consultez notre guide sur les hallucinations IA et la détection de biais.
Architecture d'un Prompt Médical
Un prompt médical robuste contient 5 sections essentielles, chacune jouant un rôle précis dans la fiabilité de la sortie.
Structure de base
<role>
Vous êtes un assistant de documentation clinique spécialisé.
Vous aidez à structurer et résumer les notes médicales.
Vous n'êtes PAS un dispositif médical de diagnostic.
Tout output nécessite une validation par un professionnel de santé.
</role>
<clinical_context>
Service : {department}
Type de document : {document_type}
Patient : [ANONYMISÉ - ID: {patient_id}]
</clinical_context>
<terminology_rules>
- Utilisez la terminologie ICD-10-CM pour les diagnostics
- Utilisez la nomenclature CPT pour les procédures
- Utilisez les noms génériques (DCI) pour les médicaments
- Signalez toute abréviation ambiguë avec sa signification complète
</terminology_rules>
<uncertainty_protocol>
Si une information est ambiguë ou manquante :
- Marquez avec [UNCERTAIN] et expliquez pourquoi
- Ne JAMAIS inventer ou déduire un diagnostic non mentionné
- Préférez "non documenté" à toute supposition
</uncertainty_protocol>
<output_format>
{format_instructions}
</output_format>
Notes SOAP : Structuration Clinique avec Claude
Les notes SOAP (Subjectif, Objectif, Analyse, Plan) sont le format standard de documentation clinique. Voici comment construire un prompt qui les génère de manière fiable.
Prompt de génération SOAP
import anthropic
client = anthropic.Anthropic()
def generate_soap_note(transcript: str, patient_context: str) -> str:
"""Génère une note SOAP structurée depuis une transcription clinique."""
system_prompt = """Vous êtes un assistant de documentation clinique.
Votre rôle : structurer les informations d'une consultation en note SOAP.
RÈGLES CRITIQUES :
1. N'incluez QUE les informations présentes dans la transcription
2. Marquez [UNCERTAIN] toute information ambiguë
3. Marquez [NOT DOCUMENTED] les sections sans données
4. N'inventez JAMAIS de diagnostic ou de résultat clinique
5. Utilisez la terminologie ICD-10-CM pour les diagnostics
6. Ce document nécessite une validation par le médecin traitant
FORMAT SOAP :
## Subjectif (S)
Motif de consultation, symptômes rapportés par le patient,
historique de la maladie actuelle, antécédents pertinents.
## Objectif (O)
Signes vitaux, examen physique, résultats de laboratoire,
imagerie — uniquement les données mesurées/observées.
## Analyse (A)
Diagnostics différentiels, impression clinique,
codes ICD-10-CM entre parenthèses.
## Plan (P)
Traitements prescrits avec posologie, examens complémentaires,
suivi, éducation thérapeutique patient."""
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
temperature=0,
system=system_prompt,
messages=[
{
"role": "user",
"content": f"""<patient_context>
{patient_context}
</patient_context>
<consultation_transcript>
{transcript}
</consultation_transcript>
Générez la note SOAP structurée pour cette consultation.
Signalez toute incertitude avec [UNCERTAIN]."""
}
]
)
return message.content[0].text
Exemple de sortie
## Subjectif (S)
Patient de 58 ans, consulte pour douleur thoracique rétrosternale
survenue il y a 2 heures au repos. Décrit comme une pression
irradiant au bras gauche. Intensité 7/10. Nausées associées.
Antécédents : HTA traitée (amlodipine 5mg), diabète type 2
(metformine 1000mg x2/j), tabagisme actif 30 PA.
## Objectif (O)
TA : 165/95 mmHg, FC : 92 bpm, SpO2 : 96% AA
ECG : sus-décalage ST en V1-V4
Troponine I : 0.8 ng/mL (N < 0.04)
Examen pulmonaire : crépitants bases bilatéraux
## Analyse (A)
- Syndrome coronarien aigu avec sus-décalage ST (STEMI)
antérieur (I21.0)
- HTA essentielle non contrôlée (I10)
- Diabète type 2 (E11.9)
- [UNCERTAIN] Possible début d'insuffisance cardiaque gauche
(crépitants bilatéraux à corréler avec imagerie)
## Plan (P)
1. Activation protocole STEMI — coronarographie en urgence
2. Aspirine 250mg IV + Ticagrélor 180mg charge
3. Héparine IV selon protocole
4. Monitoring continu ECG + SpO2
5. Contrôle troponine H+6
6. Échocardiographie post-procédure
7. Bilan lipidique complet à distance
⚠️ DISCLAIMER : Cette note est générée par IA et nécessite
une validation par le médecin traitant avant intégration
au dossier médical du patient.
Pipeline de Résumé Clinique
Un cas d'usage concret : transformer des notes cliniques longues en résumés structurés pour les transitions de soins (handoffs, résumés de sortie).
Garde-fous de Sécurité
Les garde-fous ne sont pas optionnels en IA médicale — ils sont la condition sine qua non du déploiement.
1. Disclaimers Systématiques
MEDICAL_DISCLAIMER = """
⚠️ AVERTISSEMENT — DOCUMENT GÉNÉRÉ PAR INTELLIGENCE ARTIFICIELLE
Ce contenu est produit par un modèle de langage (Claude, Anthropic).
Il ne constitue PAS un avis médical, un diagnostic ou une prescription.
Toute information doit être validée par un professionnel de santé qualifié
avant utilisation clinique. Ne prenez aucune décision médicale basée
uniquement sur ce document.
"""
def add_safety_wrapper(llm_output: str) -> str:
"""Encadre tout output médical avec les garde-fous obligatoires."""
return f"{MEDICAL_DISCLAIMER}\n\n{llm_output}\n\n{MEDICAL_DISCLAIMER}"
2. Détection d'Incertitude
UNCERTAINTY_MARKERS = ["[UNCERTAIN]", "[NOT DOCUMENTED]", "[VERIFY]"]
def assess_confidence(output: str) -> dict:
"""Évalue le niveau de confiance de l'output médical."""
markers_found = [m for m in UNCERTAINTY_MARKERS if m in output]
uncertainty_count = sum(output.count(m) for m in UNCERTAINTY_MARKERS)
return {
"has_uncertainty": len(markers_found) > 0,
"uncertainty_count": uncertainty_count,
"markers": markers_found,
"risk_level": "HIGH" if uncertainty_count > 3 else
"MEDIUM" if uncertainty_count > 0 else "LOW",
"requires_priority_review": uncertainty_count > 3
}
3. Prévention des Hallucinations
La stratégie la plus efficace contre les hallucinations médicales combine trois couches de défense :
def build_anti_hallucination_prompt(clinical_data: str) -> str:
"""Construit un prompt avec triple protection anti-hallucination."""
return f"""<grounding_rules>
RÈGLE ABSOLUE : Vous ne pouvez utiliser QUE les informations
présentes dans <clinical_data>. Pour chaque affirmation :
1. Elle doit être directement supportée par les données fournies
2. Si vous n'êtes pas sûr → [UNCERTAIN]
3. Si l'information n'existe pas dans les données → [NOT DOCUMENTED]
4. N'inventez JAMAIS de valeur numérique (dosage, résultat labo, code)
5. Ne faites JAMAIS de diagnostic non mentionné dans les données
</grounding_rules>
<clinical_data>
{clinical_data}
</clinical_data>
<verification_instruction>
Après votre réponse, listez chaque fait clinique mentionné
et indiquez la phrase source dans <clinical_data> qui le supporte.
Format : [FACT] → [SOURCE LINE]
</verification_instruction>"""
Pour une approche complète de la prévention des hallucinations, consultez notre guide dédié.
Codification Médicale : ICD-10 et CPT
L'extraction automatique de codes médicaux est un cas d'usage à haut potentiel mais aussi à haut risque. Les LLMs « hallucinent » fréquemment des codes plausibles mais incorrects.
Prompt de codification structuré
def extract_medical_codes(clinical_note: str) -> str:
"""Extrait les codes ICD-10-CM et CPT d'une note clinique."""
system = """Vous êtes un spécialiste de codification médicale.
Extrayez les codes ICD-10-CM (diagnostics) et CPT (procédures)
depuis la note clinique fournie.
RÈGLES DE CODIFICATION :
1. Codez au niveau de spécificité le plus élevé disponible
2. Distinguez les diagnostics principaux des secondaires
3. Incluez les codes de latéralité quand applicable
4. Si le diagnostic est imprécis → utilisez le code non spécifié
et marquez [VERIFY - codification à confirmer]
5. N'inventez JAMAIS un code — si incertain, indiquez la
description et marquez [CODE NOT CONFIRMED]
FORMAT DE SORTIE (JSON) :
{
"primary_diagnosis": {
"description": "...",
"icd10_code": "...",
"confidence": "high|medium|low"
},
"secondary_diagnoses": [...],
"procedures": [
{"description": "...", "cpt_code": "...", "confidence": "..."}
],
"flags": ["messages d'incertitude si applicable"]
}"""
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
temperature=0,
system=system,
messages=[{"role": "user", "content": clinical_note}]
)
return message.content[0].text
Pour d'autres techniques de sortie JSON fiable avec Claude, consultez notre guide sur les sorties JSON structurées.
Outputs Patient vs. Clinicien
Un même contenu clinique doit être formulé très différemment selon l'audience. C'est un aspect souvent négligé du prompting médical.
Exemple : même information, deux prompts
# Prompt pour le résumé clinicien
clinician_prompt = """Rédigez un résumé clinique technique
pour le médecin traitant. Format SOAP, terminologie ICD-10,
incluez tous les résultats de labo avec valeurs normales."""
# Prompt pour les instructions patient
patient_prompt = """Rédigez des instructions de sortie pour
le patient en langage simple et accessible.
- Pas de jargon médical (expliquez chaque terme technique)
- Listes à puces pour les médicaments (nom, à quoi ça sert, quand le prendre)
- Section claire "Quand revenir aux urgences"
- Ton bienveillant et encourageant
- Niveau de lecture : grand public"""
Métriques d'Évaluation pour l'IA Médicale
L'évaluation d'un pipeline IA médical exige des métriques spécifiques que les scores BLEU ou ROUGE classiques ne capturent pas.
Script d'évaluation automatique
def evaluate_medical_output(output: str, reference: dict) -> dict:
"""Évalue la qualité d'un output médical contre une référence."""
scores = {}
# 1. Complétion des sections
required = ["Subjectif", "Objectif", "Analyse", "Plan"]
present = [s for s in required if s.lower() in output.lower()]
scores["section_completeness"] = len(present) / len(required)
# 2. Taux d'incertitude (doit être > 0 pour les cas ambigus)
uncertainty_markers = output.count("[UNCERTAIN]") + output.count("[NOT DOCUMENTED]")
scores["uncertainty_flagging"] = uncertainty_markers
# 3. Présence disclaimer
scores["has_disclaimer"] = any(
term in output.lower()
for term in ["validation", "professionnel de santé", "avertissement"]
)
# 4. Validation codes ICD-10 (format regex)
import re
icd_codes = re.findall(r'\b[A-Z]\d{2}\.?\d{0,2}\b', output)
scores["icd10_codes_found"] = len(icd_codes)
return scores
Pour automatiser vos évaluations à grande échelle, consultez notre guide Promptfoo pour Claude.
Considérations Réglementaires
HIPAA et Données Patient
L'utilisation de LLMs avec des données de santé impose des précautions strictes :
import re
def anonymize_phi(text: str) -> str:
"""Supprime les identifiants de santé protégés (PHI) avant
envoi à l'API. Liste basée sur les 18 identifiants HIPAA."""
patterns = {
"SSN": r'\b\d{3}-\d{2}-\d{4}\b',
"Phone": r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b',
"Email": r'\b[\w.-]+@[\w.-]+\.\w+\b',
"MRN": r'\bMRN[:\s]*\d+\b',
"Date_of_birth": r'\b\d{2}/\d{2}/\d{4}\b',
"Name_pattern": r'\b(?:Mr|Mrs|Ms|Dr)\.?\s+[A-Z][a-z]+\s+[A-Z][a-z]+\b',
}
anonymized = text
for phi_type, pattern in patterns.items():
anonymized = re.sub(pattern, f'[{phi_type}_REDACTED]', anonymized)
return anonymized
# Toujours anonymiser AVANT l'appel API
safe_text = anonymize_phi(raw_clinical_note)
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": safe_text}]
)
Points clés de conformité
| Exigence | Implementation |
|---|---|
| Anonymisation PHI | Pré-traitement avant appel API |
| Journalisation | Log de chaque requête/réponse (sans PHI) |
| Consentement | Le patient doit être informé de l'utilisation d'IA |
| Droit à l'explication | Pouvoir justifier chaque output IA |
| Conservation | Politique de rétention conforme RGPD/HIPAA |
| BAA | Business Associate Agreement avec le fournisseur d'API |
Pour approfondir les structures de sorties avec Claude, consultez le guide des outputs structurés en mode strict.
Checklist de Déploiement
Avant de mettre en production un pipeline IA médical, validez chaque point :
- → Anonymisation — Aucun PHI ne quitte le périmètre autorisé
- → Disclaimers — Présents sur chaque output, visibles et non contournables
- → Protocole d'incertitude — Le modèle signale activement ce qu'il ne sait pas
- → Validation terminologique — Codes ICD-10/CPT vérifiés contre les bases de référence
- → Revue clinicien — Workflow de validation humaine en place
- → Jeu de tests — Au moins 200 cas couvrant les pathologies fréquentes et les cas limites
- → Monitoring — Détection de drift, taux d'erreur, temps clinicien
- → Plan de rollback — Procédure pour revenir au workflow manuel si nécessaire
- → Documentation — Prompt versionné, changelog, métriques de baseline
- → Formation — Les cliniciens savent interpréter et corriger les outputs IA
Pour une approche structurée du processus de prompt engineering (versioning, tests, itérations), consultez notre guide du processus de prompt engineering.
FAQ
Pourquoi le prompt engineering médical est-il différent des autres domaines ?
Le domaine médical impose des contraintes de responsabilité légale, de terminologie normée (ICD-10, SNOMED CT), de sécurité patient et de conformité réglementaire. Une hallucination dans un résumé marketing est gênante ; dans un résumé clinique, elle peut conduire à une erreur médicale.
Comment structurer un prompt pour des notes SOAP fiables ?
Utilisez des sections XML claires (<role>, <format_soap>, <uncertainty_protocol>), fournissez des exemples few-shot de notes validées par un clinicien, imposez un format strict avec des sections obligatoires, et ajoutez des marqueurs d'incertitude ([UNCERTAIN], [NOT DOCUMENTED]) pour chaque information ambiguë.
Claude peut-il remplacer un médecin pour le diagnostic ?
Non. Claude est un outil d'aide à la documentation, à la structuration et à l'analyse de données cliniques. Il ne constitue pas un dispositif médical de diagnostic. Tout output doit être revu et validé par un professionnel de santé avant utilisation clinique.
Comment évaluer la qualité d'un pipeline IA médical ?
Combinez trois types de métriques : automatiques (complétion des sections, validité des codes, conformité du format), clinicien (exactitude factuelle, pertinence, omissions), et sécurité (taux de hallucination, flagging d'incertitude, présence de disclaimers). L'évaluation purement automatique est insuffisante — la revue clinicien est indispensable.
Weekly AI Insights
Tools, techniques & news — curated for AI practitioners. Free, no spam.
Free, no spam. Unsubscribe anytime.
→Related Articles
FAQ
Pourquoi le prompt engineering médical est-il différent des autres domaines ?+
Le domaine médical impose des contraintes de responsabilité légale, de terminologie spécialisée, de sécurité patient et de conformité réglementaire (HIPAA, RGPD santé). Une erreur de classification ou une hallucination peut avoir des conséquences cliniques graves, ce qui exige des garde-fous absents dans d'autres domaines.
Comment structurer un prompt pour générer des notes SOAP fiables ?+
Utilisez des sections XML dédiées (<role>, <format_soap>, <constraints>) avec des exemples few-shot de notes réelles anonymisées. Imposez l'extraction structurée (Subjectif, Objectif, Analyse, Plan) et ajoutez des instructions explicites pour signaler l'incertitude avec des marqueurs comme [UNCERTAIN] ou [VERIFY].
Claude peut-il remplacer un médecin pour le diagnostic ?+
Non. Claude est un outil d'aide à la documentation et à l'analyse, pas un dispositif médical de diagnostic. Tout output doit être revu par un professionnel de santé qualifié. Les prompts doivent inclure des disclaimers explicites et ne jamais présenter les résultats comme des diagnostics définitifs.
Comment évaluer la qualité d'un pipeline IA médical ?+
Utilisez des métriques spécifiques au domaine : exactitude terminologique (comparaison SNOMED/ICD-10), taux de complétion des sections, détection d'hallucinations factuelles, taux de flagging d'incertitude, et conformité au format clinique attendu. Combinez évaluation automatique et revue par un clinicien.