Aller au contenu principal
Leçon 2 sur 5 · Prompting en situations réelles

Un premier prompt réel : résumer un dossier médical

Leçon 2 sur 5 Mis à jour le 5 novembre 2026 Intermédiaire
Sur cette page
  1. L’objectif
  2. Le mauvais prompt
  3. Améliorer une technique à la fois
  4. Passer au JSON : la méthode de 2026
  5. À vous de jouer
  6. Points clés à retenir

Cette leçon écrit un prompt bien plus long que les exemples isolés de la leçon 1 : un résumeur de dossiers médicaux qui prépare les consultations. Elle part d’un prompt naïf, constate des sorties incohérentes sur cinq dossiers, puis ajoute une technique à la fois, rôle, balises, consignes, exemple, sortie balisée, avant de passer au JSON. Le code est celui du carnet, mis à jour pour claude-opus-5-5 et les sorties structurées.

L’objectif

Chaque dossier est une chronologie : nom, âge, puis une ligne par événement (« 1985 : diabète de type 2 diagnostiqué, metformine », « 2015 : insuffisance rénale chronique de stade 3, metformine ajustée »…). Le cours fournit cinq dossiers fictifs très différents : Evelyn Thompson, 78 ans, polypathologique ; Marcus Reyes, 42 ans, parcours psychiatrique ; Lily Chen, 8 ans, cardiopathie congénitale ; Jason Tran, 25 ans, commotions sportives ; Amira Khan, 36 ans, lupus. Le résumé attendu doit contenir, dans l’ordre, le nom, l’âge, les diagnostics clés, les médicaments, les autres traitements, les préoccupations récentes et les actions pour le praticien, de façon identique d’un dossier à l’autre.

Le mauvais prompt

Le premier jet est celui qu’on taperait dans un chat : « voici un dossier, tu peux me le résumer ? j’en ai besoin pour la consultation de demain », avec le dossier inséré au milieu.

import anthropic

client = anthropic.Anthropic()

initial_prompt = """
I have this patient medical record. Can you summarize it for me?

{record}

I need this for a quick review before the patient's appointment tomorrow.
"""

def generate_summary_with_bad_prompt(patient_record: str) -> str:
    response = client.messages.create(
        model="claude-opus-5-5",
        max_tokens=4096,
        messages=[{"role": "user", "content": initial_prompt.format(record=patient_record)}],
    )
    return next(block.text for block in response.content if block.type == "text")

Sur les cinq dossiers, les résumés du carnet partent dans tous les sens : certains sont des paragraphes, d’autres des listes ; l’un regroupe par « conditions chroniques » et « historique chirurgical », l’autre raconte l’enfance de Lily en prose. Le contenu n’est pas mauvais, mais format, longueur et nature des informations varient radicalement, et rien n’est exploitable par programme.

Améliorer une technique à la fois

Le cours annonce qu’il applique ici toutes les techniques d’un coup, « au fusil à pompe », avant d’enseigner à la leçon 3 une approche plus fine du choix des techniques.

Le prompt système. D’après le cours, c’est la seule information qui devrait y figurer : un rôle. Claude devient un professionnel de santé expérimenté, spécialisé dans la transformation d’historiques complexes en résumés concis et actionnables pour des praticiens pressés.

Les données balisées. Le dossier est enveloppé dans <patient_record>, ce qui rend visible la frontière entre données et consignes.

Des consignes claires. « Tu peux me le résumer ? » est désespérément vague. La nouvelle consigne énumère les sept éléments attendus, dans l’ordre, en précisant « liste à puces » plutôt que « liste », et « diagnostics clés par ordre chronologique ».

Un exemple. Le cours en ajoute un seul, pour rester bref, en précisant qu’il vaut mieux en avoir au moins deux : le dossier d’Ethan Blackwood, 55 ans (hypertension, dépression, discopathie, reflux, apnée du sommeil, prédiabète, ménisque, hypertrophie ventriculaire), suivi du résumé attendu, le tout dans une balise <example>.

Une sortie balisée. Pour extraire le résumé même si Claude ajoute un préambule, l’exemple montre la sortie entre une balise ouvrante et une balise fermante summary ; Claude reproduit la balise.

system = """
You are a highly experienced medical professional with a specialty in translating complex patient histories into concise, actionable summaries.
Your role is to analyze patient records, identify critical information, and present it in a clear, structured format that aids in diagnosis and treatment planning.
Your summaries are invaluable for busy healthcare providers who need quick insights into a patient's medical history before appointments.
"""

updated_prompt = """
I need your help summarizing patient medical records for our team of doctors.
We have a series of follow-up appointments tomorrow, and the doctors need quick, insightful summaries to prepare.

Each summary should include the following elements in this order:
- The patient's name
- The patient's age
- A bulleted list of key diagnoses in chronological order
- A bulleted list of medications the patient is prescribed
- A bulleted list of other treatments: non-medication treatments like CBT or physical therapy
- A short bulleted list of recent concerns
- A bulleted list of key action items to help our doctors prepare for the upcoming patient visit

Here's an example of how we'd like the summaries formatted:

<example>
<patient_record>
Patient Name: Ethan Blackwood
Age: 55
Medical Record:
2010: Annual check-up, mild hypertension noted
  - Started on lifestyle modifications (diet, exercise)
(dossier abrégé ici ; le carnet le donne en entier)
</patient_record>

<summary>
Name: Ethan Blackwood
Age: 55

Key Diagnoses:
- Hypertension (2010)
(résumé abrégé ici)
</summary>
</example>

Now, please summarize the following patient record in the same format:

<patient_record>
{record}
</patient_record>
"""

def generate_summary_with_improved_prompt(patient_record: str) -> str:
    response = client.messages.create(
        model="claude-opus-5-5",
        max_tokens=4096,
        system=system,
        messages=[{"role": "user", "content": updated_prompt.format(record=patient_record)}],
    )
    return next(block.text for block in response.content if block.type == "text")

Avec ce prompt, les cinq résumés du carnet suivent exactement le format : sept rubriques, listes à puces, années entre parenthèses, et la balise summary autour. Remontez aux sorties du mauvais prompt pour mesurer l’écart.

Un prompt de production, pièce par pièce Cinq étapes : le rôle dans le prompt système, le dossier dans une balise, les sept rubriques énumérées, un exemple balisé, la sortie balisée ou structurée. LE RÉSUMEUR DE DOSSIERS Un prompt de production, pièce par pièce 1 Rôle prompt système : professionnel de santé, résumés actionnables 2 Données le dossier dans <patient_record> 3 Consignes sept rubriques, dans l'ordre, en listes à puces 4 Exemple Ethan Blackwood dans <example> 5 Sortie <summary>, ou schéma Pydantic via messages.parse() Cinq dossiers très différents, un seul format. Le cours applique tout d'un coup ; la leçon 3 apprend à choisir selon le problème constaté.
D'après le carnet « A real-world prompt » (anthropics/courses, carnet archivé).

Passer au JSON : la méthode de 2026

Un résumé textuel peut suffire, mais on veut souvent une réponse structurée, plus facile à digérer par programme. Le carnet adaptait alors le prompt : demander explicitement du JSON, décrire la structure (nom, âge, liste de diagnostics avec année, médicaments avec usage, autres traitements, préoccupations, actions), et remplacer l’exemple de résumé par un exemple JSON ; il notait déjà que le moyen le plus simple de forcer du JSON était l’appel d’outils, couvert par le cours sur le tool use. Aujourd’hui, la documentation propose plus direct : les sorties structurées. On décrit le schéma en Pydantic et le SDK garantit une réponse valide ; le prompt n’a plus à décrire la structure ni à montrer un exemple JSON, et il garde ses consignes de contenu.

from pydantic import BaseModel

class Diagnostic(BaseModel):
    diagnosis: str
    year: int

class Medicament(BaseModel):
    name: str
    purpose: str

class Traitement(BaseModel):
    treatment: str
    purpose: str

class ResumeDossier(BaseModel):
    name: str
    age: int
    key_diagnoses: list[Diagnostic]
    medications: list[Medicament]
    other_treatments: list[Traitement]
    recent_concerns: list[str]
    action_items: list[str]

def generate_json_summary(patient_record: str) -> ResumeDossier:
    response = client.messages.parse(
        model="claude-opus-5-5",
        max_tokens=4096,
        system=system,
        messages=[{"role": "user", "content": updated_prompt.format(record=patient_record)}],
        output_format=ResumeDossier,
    )
    return response.parsed_output

resume = generate_json_summary(patient_records[0])
print(resume.name, resume.age, [d.diagnosis for d in resume.key_diagnoses])

Le même schéma peut être passé en JSON Schema brut via output_config={"format": {"type": "json_schema", "schema": …}} à messages.create() ; les sorties structurées sont incompatibles avec les citations de documents, et le paramètre output_format de l’ancienne API est déprécié au profit de output_config.format.

À vous de jouer

Reproduire le parcours. Copiez les cinq dossiers du carnet officiel, lancez le mauvais prompt puis le prompt amélioré avec claude-opus-5-5, et comparez vos sorties à celles du carnet (obtenues avec Claude 3 Sonnet) : le format tient-il encore mieux ? Ajoutez un deuxième exemple, celui d’un enfant par exemple, et observez l’effet sur le dossier de Lily Chen.

Passer en structuré. Remplacez l’extraction par messages.parse() avec le modèle Pydantic, puis soumettez un dossier vide et un dossier qui ne contient que le nom : que fait le schéma ? Ajoutez un champ insufficient_data: bool et une consigne pour le renseigner.

Sources officielles : 02_medical_prompt.ipynb (anthropics/courses, archivé) · Structured outputs (documentation Claude) · Prompting best practices

Points clés à retenir

  • Un prompt de chat donne des résumés corrects mais incohérents ; la production exige un format stable.
  • Rôle dans le prompt système, données dans une balise, consignes énumérées, un exemple balisé, sortie balisée : cinq ajouts, un format tenu.
  • Le cours applique tout d’un coup ; la leçon 3 apprend à choisir les techniques selon le problème constaté.
  • Pour du JSON, utilisez les sorties structurées (messages.parse() ou output_config.format) plutôt que de décrire le schéma dans le prompt.
  • Au moins deux exemples valent mieux qu’un, surtout pour des dossiers aussi variés qu’un enfant et un octogénaire.

Crédits et licence — Adaptation française du cours « Real world prompting » du dépôt anthropics/courses (Anthropic), archivé en lecture seule le 15 septembre 2026 et publié sous licence CC BY-NC 4.0 ; cette adaptation, qui le traduit, le remanie et met son code à jour pour les modèles de novembre 2026, est diffusée sous la même licence.