Avanzato 11 minSalute

Sintesi di dossier medici

Risposta diretta

Per riassumere un fascicolo medico con un LLM locale, estrai i fatti tramite codice (bundle FHIR o documento CDA R2), numerali, fai redigere la sintesi esclusivamente a partire da questi fatti, citando il riferimento per ogni riga, verifica tramite un programma che ogni riferimento e ogni numero siano presenti nella fonte, poi fai convalidare la sintesi da un medico. L'esecuzione locale protegge la riservatezza, ma non dalle allucinazioni: uno studio del 2025 ne rileva l'1,47 % per frase.

Un dossier sanitario è accurato ma frammentato, e i modelli linguistici redigono sintesi scorrevoli che possono contenere errori gravi. Questa guida descrive una pipeline locale in cui il codice estrae i fatti, il modello li mette per iscritto citando le fonti e il risultato viene validato prima da un controllo automatico e poi da un medico. Ricorda anche il quadro da verificare: segreto professionale medico, hosting dei dati sanitari, finalità dello strumento.

Di Mohamed Meguedmi·Agg. 2026-09-30·Testato su Windows, macOS e Linux

#Il problema: cartelle cliniche accurate ma illeggibili

Un professionista sanitario che subentra nella cura di un paziente deve esaminare referti, risultati di laboratorio, prescrizioni e lettere, spesso prodotti da diversi software. Un modello locale può preparare una sintesi di una pagina per la ripresa in carico del caso. Il metodo affidabile in ambito medico è sempre lo stesso: estrarre i dati strutturati tramite codice deterministico, far redigere la sintesi esclusivamente sulla base di questi fatti, far citare in ogni riga l'identificativo del fatto di origine, controllare la sintesi tramite un programma, poi farla validare da un medico.

Un chiarimento terminologico evita una confusione frequente. In Francia, i documenti sanitari scambiati e condivisi, in particolare tramite il Dossier Médical Partagé, seguono il quadro di interoperabilità dei sistemi informativi sanitari (CI-SIS) dell'Agence du numérique en santé, le cui sezioni descrivono documenti in formato CDA R2, uno standard HL7 basato su XML. HL7 versione 2 è un altro standard, basato su messaggi di testo delimitati da barre verticali, che serve per il trasporto. Infine FHIR, in JSON, è lo standard di scambio più recente e più semplice da elaborare, che si incontra soprattutto negli scambi tra applicazioni. Il tuo primo compito è quindi capire cosa ti fornisce il tuo software.

i
Accesso alla cartella condivisa
Uno script non può connettersi liberamente al DMP: l’accesso avviene tramite un software per professionisti sanitari o una piattaforma di intermediazione autorizzata. La sezione del CI-SIS relativa alla trasmissione di un documento CDA-R2 descrive proprio la possibilità, per un software professionale, di delegare a una piattaforma di intermediazione gli scambi con il DMP e il servizio di messaggistica MSSanté. Questa guida parte quindi da documenti già esportati dal tuo software.

#Quadro: segreto medico, hosting e responsabilità

Il kit IA Locale

Il tuo ChatGPT privato e gratuito sulla tua macchina in 1 ora — LM Studio, Ollama, Open WebUI, i tuoi documenti, senza cloud.

  • Spazio online a vita
  • PDF + file
  • Aggiornamenti a vita

Tre questioni vanno affrontate prima di scrivere qualsiasi codice. La prima riguarda il segreto medico e la protezione dei dati sanitari, che impongono di trattare tali dati su un'infrastruttura controllata: l'elaborazione locale ne è l'attuazione pratica, ma occorre anche cifrare i dischi, limitare gli accessi e registrare le operazioni nei log. La seconda riguarda l'hosting dei dati sanitari. L'articolo L. 1111-8 del codice della sanità pubblica prevede che chiunque ospiti dati sanitari a carattere personale su supporto digitale debba essere certificato a tal fine, quando lo fa per conto di un titolare del trattamento o del paziente.

Questo obbligo non si applica sempre come si potrebbe pensare. Secondo l'Agence du numérique en santé, citata da un assicuratore specializzato, la certificazione del fornitore di hosting non è un obbligo normativo quando tutti i sistemi di una struttura memorizzano esclusivamente dati dei propri pazienti, salvo che la struttura svolga un'attività di hosting per conto di terzi. In altre parole, uno studio che esegue lo strumento al proprio interno, per i propri pazienti, non si trova nella stessa situazione di un produttore di software che offre questo servizio ad altri studi. Fai confermare la tua situazione dal tuo consulente o dal tuo responsabile della protezione dei dati.

La terza questione è la finalità. Un software che produce informazioni destinate a orientare una decisione medica può rientrare nella normativa sui dispositivi medici, a seconda della finalità dichiarata. Una sintesi per riprendere in esame una cartella clinica, presentata come ausilio alla lettura e validata dal medico, non ha la stessa portata di uno strumento che suggerisce un trattamento. Questa guida si attiene alla prima formulazione.

#Lo stack locale

Bastano tre componenti. Python per leggere i documenti: il modulo json per un lotto FHIR, lxml per un documento CDA, la libreria hl7 per eventuali messaggi di versione 2; quest'ultima si presenta come un parser di messaggi HL7 v2.x. Ollama per servire il modello: Qwen 3.5 con 9 miliardi di parametri pesa 6,6 GB, con 256.000 token di contesto dichiarati; Mistral Small 24B pesa 14 GB e dichiara 32.000 token. Infine, lo schema JSON di Ollama, per obbligare il modello a rispondere in un formato verificabile.

Nessuno di questi modelli è stato validato per un uso clinico dai rispettivi sviluppatori. La loro capacità di gestire il francese medico va valutata sulle tue cartelle cliniche, seguendo il protocollo riportato più sotto. Una scheda da 8 GB basta per il primo; il secondo richiede più memoria video, soprattutto se il contesto è lungo.

#Leggere i documenti: lotto FHIR e documento CDA

Per un bundle FHIR, che è un contenitore di una raccolta di risorse, il modo più semplice è leggere il JSON così com'è e cercare le risorse per tipo. Questo evita di dipendere da una libreria le cui versioni di FHIR variano. Ogni fatto selezionato riceve un identificativo breve (F1, F2...) e un testo leggibile: è ciò che permetterà poi di risalire alla fonte di ogni frase della sintesi.

Estrarre fatti da un lotto FHIR (R4)
import json

def libelle(cc):
    if not cc:
        return None
    if cc.get('text'):
        return cc['text']
    c = (cc.get('coding') or [{}])[0]
    return c.get('display') or c.get('code')

def faits_fhir(chemin):
    lot = json.load(open(chemin, encoding='utf-8'))
    faits = []
    for e in lot.get('entry', []):
        r = e.get('resource', {})
        t = r.get('resourceType')
        if t == 'Condition':
            texte = f"Diagnostic : {libelle(r.get('code'))} (début {r.get('onsetDateTime', 'date inconnue')})"
        elif t == 'MedicationStatement':
            dose = (r.get('dosage') or [{}])[0].get('text', 'posologie non précisée')
            texte = f"Traitement : {libelle(r.get('medicationCodeableConcept'))}, {dose}"
        elif t == 'Observation':
            v = r.get('valueQuantity', {})
            texte = f"Résultat : {libelle(r.get('code'))} = {v.get('value')} {v.get('unit', '')} ({r.get('effectiveDateTime', 'date inconnue')})"
        elif t == 'AllergyIntolerance':
            texte = f"Allergie : {libelle(r.get('code'))}"
        elif t == 'Procedure':
            texte = f"Acte : {libelle(r.get('code'))} ({r.get('performedDateTime', 'date inconnue')})"
        else:
            continue
        faits.append({'ref': f'F{len(faits) + 1}', 'type': t, 'texte': texte})
    return faits

Per un documento CDA, il testo utile si trova nelle sezioni del corpo strutturato: ogni sezione ha un titolo, un codice e un blocco di testo narrativo. Il codice sotto estrae le sezioni con il loro titolo, senza includere l'intestazione del documento, che contiene l'identità del paziente. Gli spazi dei nomi di CDA sono quelli della versione 3 di HL7.

Estrarre le sezioni da un documento CDA R2
from lxml import etree

NS = {'h': 'urn:hl7-org:v3'}

def sections_cda(chemin):
    racine = etree.parse(chemin).getroot()
    for s in racine.iterfind('.//h:structuredBody//h:section', NS):
        texte = s.find('h:text', NS)
        if texte is None:
            continue
        code = s.find('h:code', NS)
        yield {
            'titre': (s.findtext('h:title', default='', namespaces=NS) or '').strip(),
            'code': code.get('code') if code is not None else None,
            'texte': ' '.join(''.join(texte.itertext()).split()),
        }
→
Estrarre prima di riassumere
Non dare mai al modello un documento grezzo. Un documento XML è composto in gran parte da tag e identificatori: occupa spazio nel contesto e sommerge le informazioni utili. La pipeline trasforma prima il dossier in un elenco di fatti numerati, poi è questo elenco a essere riassunto.

#Quali fatti ricordare, e con quale prudenza

Risorse FHIR utili per una sintesi di ripresa
RisorsaCosa vi si leggeTrappola frequente
ConditionDiagnosi, data di inizio, statoUna diagnosi risolta o errata può rimanere nella cronologia
MedicationStatementFarmaco, posologia, periodoUn trattamento interrotto potrebbe non essere contrassegnato come tale
ObservationRisultato di un esame di laboratorio o di una misurazione, unità, dataConfrontare valori senza le relative unità né i valori di riferimento
AllergyIntoleranceSostanza, reazione, gravitàLa mancata registrazione non significa assenza di allergia
ProcedureAtto eseguito e dataDate approssimative o mancanti
DocumentReferenceAllegato, spesso un resocontoContenuto codificato o accessibile tramite un link, da recuperare separatamente

L'ultima colonna conta più delle altre. Un modello legge i fatti che gli fornisci e non sa cosa manchi: se un trattamento interrotto non è indicato come tale, apparirà come ancora in corso nella sintesi. Il codice deve quindi contenere lo stato e la data, e il prompt deve chiedere di segnalare i fatti senza data o con uno stato incerto. L'assenza di informazioni non è un'informazione: la sintesi deve dirlo.

#Scrivere una sintesi che cita le fonti, poi verificarla

Il prompt fornisce i fatti numerati e richiede che ogni riga della sintesi termini con i riferimenti ai fatti utilizzati, ad esempio [F3][F7]. Non contiene il nome del paziente: età e sesso sono sufficienti, e l'identità rimane nel software professionale. La risposta ha una forma libera ma è strutturata in sezioni, il che la rende leggibile in una pagina.

Sintesi a partire dai fatti numerati
import requests

SYSTEM = open('system_med.txt', encoding='utf-8').read()

def synthese(faits, age, sexe, modele='qwen3.5:9b'):
    liste = '\n'.join(f"[{f['ref']}] {f['texte']}" for f in faits)
    r = requests.post('http://localhost:11434/api/chat', json={
        'model': modele, 'stream': False,
        'messages': [{'role': 'system', 'content': SYSTEM},
                     {'role': 'user', 'content': f'Patient : {age} ans, {sexe}.\n\nFAITS :\n{liste}'}],
        'options': {'temperature': 0.1, 'num_ctx': 16384}})
    return r.json()['message']['content']

Il controllo avviene poi tramite codice. Due verifiche individuano la maggior parte degli errori gravi: ogni riferimento citato deve esistere nell'elenco dei fatti e ogni numero della sintesi deve comparire nei fatti. Un numero comparso dal nulla è il segno tipico di un'invenzione o di un errore di trascrizione, soprattutto quando riguarda un valore biologico o una posologia.

Controllo automatico della sintesi
import re

def verifier(synthese, faits):
    refs_ok = {f['ref'] for f in faits}
    citees = set(re.findall(r'\[(F\d+)\]', synthese))
    def nombres(t):
        t = re.sub(r'\[F\d+\]', ' ', t).replace(',', '.')
        return set(re.findall(r'\d+(?:\.\d+)?', t))
    source = nombres(' '.join(f['texte'] for f in faits))
    return {
        'references_inconnues': sorted(citees - refs_ok),
        'nombres_absents_de_la_source': sorted(nombres(synthese) - source),
        'lignes_sans_reference': [l for l in synthese.split('\n') if l.strip().startswith('-') and not re.search(r'\[F\d+\]', l)],
    }

#Il prompt di sistema

system_med.txt
Tu prépares une synthèse de reprise de dossier pour un médecin.
Tu ne poses AUCUN diagnostic, tu ne proposes AUCUN traitement ni modification de traitement.
Tu utilises UNIQUEMENT les faits fournis. Tu n'ajoutes aucune donnée.
Chaque ligne de la synthèse se termine par les références des faits utilisés, par exemple [F3][F7].
Si un fait n'a pas de date, ou si un statut est incertain, tu l'écris explicitement.
Si des faits semblent contradictoires, tu les signales sans trancher.
Si une information attendue est absente, écris : non renseigné.

SECTIONS : Pathologies, Traitements en cours, Allergies, Derniers résultats,
Actes et antécédents, Points à vérifier.

La sezione « Punti da verificare » è la più utile in pratica. Trasforma le zone grigie (terapia senza data di fine, risultato senza unità di misura, due valori contraddittori) in domande da porre al medico, invece di appianarle in una frase scorrevole.

#Valutare l'affidabilità prima di qualsiasi utilizzo

La fiducia non si impone per decreto. Uno studio pubblicato nel 2025 su npj Digital Medicine ha misurato gli errori dei modelli linguistici nella generazione di note cliniche: su 12.999 frasi annotate da clinici, ha rilevato l'1,47% di frasi con allucinazioni e il 3,45% di omissioni, con il 44% delle allucinazioni giudicate gravi, cioè tali da poter influire sulla diagnosi o sulla presa in carico se non vengono corrette. Questi dati riguardano un'altra attività, con altri modelli: non sono i tuoi. Mostrano che un basso tasso di errore per frase resta preoccupante su scala di un intero documento.

Una sintesi di trenta righe con una probabilità di errore dell'1,5% per riga, supponendo che gli errori siano indipendenti, contiene almeno un errore in circa un terzo dei casi. È un ordine di grandezza a scopo didattico, non una previsione. Da qui deriva il protocollo seguente, che sostituisce il criterio «zero errori su 50 dossier»: questo criterio non dimostra molto, poiché l'assenza di errori osservati su 50 dossier è compatibile con un tasso reale di circa il 6% a un livello di confidenza del 95% (regola del tre, 3 diviso 50).

  1. 01
    Creare un campione di cartelle anonimizzate
    Scegli cartelle cliniche diverse: pazienti con più patologie, numerosi trattamenti, risultati risalenti a tempo fa. Rimuovi i dati identificativi e quelli inutili prima di qualsiasi utilizzo al di fuori dell'assistenza sanitaria.
  2. 02
    Fare annotare da un medico
    Ogni frase di sintesi è classificata: corretta, imprecisa, omissione, errore. Distingui gli errori che potrebbero cambiare una decisione clinica.
  3. 03
    Contare per categoria e per gravità
    Il numero di errori gravi per cartella conta più del tasso medio. Stabilisci una soglia con il medico responsabile prima di iniziare.
  4. 04
    Misurare anche le omissioni
    Una sintesi che omette un'allergia o un trattamento è più pericolosa di una frase formulata male.
  5. 05
    Rieseguire a ogni modifica
    Modello, prompt o formato di esportazione: ogni modifica richiede di ripetere la valutazione.
!
Nessuna prescrizione assistita
Non usare mai questo strumento per proporre un trattamento, una posologia o un aggiustamento. La sintesi è un aiuto alla lettura e il medico che la convalida ne mantiene la responsabilità.

#Messa in produzione: tracce, accessi e ambito

Registrare ogni generazione
Mantieni data, versione del modello, elenco dei fatti forniti e sintesi prodotta in uno spazio protetto: è ciò che permette di ricostruire ciò che il medico ha letto.
Controllare gli accessi
Il server di inferenza non deve essere raggiungibile dall'esterno; i dischi sono crittografati; gli account sono nominativi.
Mostra le fonti
L'interfaccia mostra la sintesi con, per ogni riga, il fatto originale. Un medico che può verificare con un clic verifica davvero.
Limitare l'ambito
Comincia con un uso interno allo studio o alla struttura, con un piccolo numero di utenti, prima di qualsiasi estensione. Un servizio offerto ad altre strutture cambia il tuo status rispetto all'hosting.
Prevedere una validazione umana visibile
La sintesi viene firmata o convalidata dal professionista sanitario prima di essere inserita nella cartella clinica; in caso contrario, non deve esservi inclusa.
FAQ
È possibile riassumere una cartella medica con un LLM locale?+
Sì, tecnicamente, estraendo prima i dati strutturati tramite codice e facendo redigere la sintesi esclusivamente sulla base di questi fatti. Occorre anche controllare la sintesi tramite un programma, farla validare da un medico e valutare il sistema su cartelle cliniche annotate. L'esecuzione in locale risolve il problema della riservatezza, non quello dell'affidabilità.
Il DMP fornisce i documenti in FHIR?+
Le sezioni del quadro francese di interoperabilità descrivono documenti sanitari nel formato CDA R2, basato su XML, e la loro trasmissione al DMP o a MSSanté. FHIR serve soprattutto agli scambi tra applicazioni. Verifica cosa esporta il tuo software, perché la tua pipeline dipende da questo formato, non dalla fonte d'origine.
Serve un fornitore di hosting certificato HDS per uno strumento interno allo studio?+
Non necessariamente: secondo l'ANS citata da Relyens, la certificazione non è obbligatoria quando la struttura conserva esclusivamente i dati dei propri pazienti. Diventa obbligatoria se ospiti dati per conto di terzi. Fai confermare il tuo caso specifico da un consulente o dal tuo responsabile della protezione dei dati.
Quale modello locale scegliere per testi medici?+
Due punti di partenza: Qwen 3.5 9B (6,6 GB, 256.000 token annunciati) su una scheda da 8 GB, oppure Mistral Small 24B (14 GB) con più memoria. Nessuno dei due è validato clinicamente. Scegli confrontando le loro sintesi sui tuoi fascicoli clinici, annotate da un medico, e monitora soprattutto le omissioni e gli errori gravi.
Un LLM può inventare il risultato di un esame di laboratorio?+
Sì: gli studi sulla generazione di note cliniche rilevano allucinazioni, una parte importante delle quali è giudicata grave. Per questo la pipeline impone un riferimento per riga, verifica che ogni numero della sintesi compaia nei fatti riportati nelle fonti e segnala al medico ciò che resta dubbio. La validazione umana rimane indispensabile.
Un tale strumento è un dispositivo medico?+
Dipende dalla sua finalità dichiarata. Un ausilio alla lettura della cartella clinica, validato dal medico, non è uno strumento che propone una diagnosi o un trattamento, e la normativa non vi si applica allo stesso modo. Fai classificare il tuo strumento da uno specialista della normativa prima di qualsiasi impiego che vada oltre l'uso interno.
Questa guida ti è stata utile?

Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.