Perché esiste questo benchmark e cosa testa
L’analisi del sangue con IA assistita è sempre più utilizzata in contesti consumer e clinici, tuttavia restano rare le framework di valutazione riproducibili adattate alla medicina di laboratorio. Le domande che contano di più in questo contesto non sono quelle coperte dai benchmark generali di medical question-answering: un motore può distinguere la carenza di ferro dalla caratteristica talassemica quando il volume corpuscolare medio è identico, sovradiagnostica la sindrome di Gilbert come epatite e produce patologia in un pannello di screening completamente normale?
Un singolo pannello di analisi del sangue contiene in genere abbastanza segnale da supportare diverse interpretazioni concorrenti e il compito del clinico che interpreta è valutare tali interpretazioni tra loro, piuttosto che recuperare una risposta da manuale. Un motore che va bene nei casi da manuale può comunque fallire proprio nei casi che contano di più: le insidie della diagnosi differenziale, le varianti benigne che da sole sembrano allarmanti e i pannelli pienamente normali che inducono assistenti sicuri a fabbricare patologia.
Questo benchmark è stato costruito proprio attorno a queste modalità di fallimento. Ciascuno dei quindici casi è stato selezionato per una specifica proprietà diagnostica: una microcitosi da carenza di ferro che deve essere tenuta distinta da una forma portatrice di beta-talassemia con identico volume corpuscolare medio, una presentazione di sindrome di Gilbert in cui l’unica anomalia è un’iperbilirubinemia indiretta isolata e un pannello di screening di quindici parametri in cui ogni analita si trova all’interno del suo intervallo di riferimento. La rubrica premia i motori che leggono ogni caso secondo i suoi termini e penalizza i motori che arrivano a una diagnosi sicura quando non è giustificata alcuna diagnosi di questo tipo.
Come Thomas Klein, MD, ho selezionato questo pannello di casi perché sono i pattern che vedo gli assistenti di medicina di laboratorio sbagliare più spesso. La modalità di fallimento costosa non è "mancare una malattia rara": è fabbricare patologia di routine in pazienti che non ce l’hanno. Nostro Validazione medica l’hub descrive il quadro più ampio; questa pagina descrive la prova di concetto iniziale della V11 e il Secondo aggiornamento della V11 che lo ha scalato fino a 100.000 casi sintetici tratti da un set di casi sintetici che copre 127 etichette di Paese — utilizzando la stessa rubrica di scoring, byte-identica, senza consentire alcuna ottimizzazione post-hoc.
Ultima esecuzione di riferimento — Secondo Aggiornamento V11 (26 aprile 2026)
L’esecuzione di riferimento del Secondo Aggiornamento V11 del 26 aprile 2026 ha prodotto un punteggio composito di 99.80% sulla stessa rubrica pre-registrata usata nel rilascio iniziale di V11, valutata su 100.000 casi sintetici tratti dal set di casi sintetici Kantesti e che coprono 127 etichette di Paese e i linguaggi 75+. Ogni caso è stato completato nel percorso primario del motore; le attivazioni del flag di iperdiagnosi nei casi-trappola sono rimaste a 0 / 87,412. La run originale di V11 del 23 aprile 2026 ha coperto 15 casi selezionati manualmente (punteggio composito 99.12%) e ha validato la rubrica; il Secondo Aggiornamento mantiene quella rubrica identica byte per byte e estende la valutazione a una coorte su scala di popolazione.
La formula del composito combina tre componenti: conformità strutturale con le sette sezioni di report obbligatorie e le sedici sottosezioni obbligatorie, accuratezza del contenuto misurata come richiamo delle parole chiave più richiamo del sistema di punteggio più un controllo di validità della distribuzione di probabilità e latenza della risposta rispetto all’obiettivo di livello di servizio del percorso primario. La scomposizione esatta è mostrata nella formula della rubrica qui sotto — nessuno di questi pesi o sotto-rubriche è stato modificato per il Secondo Aggiornamento.
I restanti 0,20 punti percentuali di margine si scompongono quasi interamente nel sotto-punteggio clinico — una piccola frazione di casi (prevalentemente in Epatologia e Reumatologia) aveva una keyword attesa del sistema di scoring assente dall’interpretazione del motore nonostante il contenuto diagnostico fosse corretto. Nessun caso nella coorte Secondo Aggiornamento da 100.000 casi ha mancato la diagnosi stessa. La latenza è migliorata da una media di 20,17 s nel rilascio iniziale di V11 a 13,26 s nel Secondo Aggiornamento, riflettendo ottimizzazioni del motore di produzione tra le due run; la rubrica, il codice di scoring e l’endpoint API sono invariati.
I punteggi compositi per etichetta variavano da 0,9971 a 0,9985 sulle 30 etichette di Paese più rappresentate. La lunga coda delle 97 etichette aggiuntive (≈7.300 casi complessivamente) non ha mostrato alcun degrado sistematico. Le etichette più frequenti per numero di casi erano Stati Uniti (10.500), Brasile (9.500), Spagna (9.000), Italia (8.000), Germania (7.800), Francia (7.400), Portogallo (5.800), Türkiye (3.400), Regno Unito (2.900) e Messico (2.500).
Da 15 casi a 100.000: evoluzione della coorte su 127 etichette di Paese
Il pannello di casi originale della V11 copriva sette specialità — ematologia, endocrinologia, medicina metabolica, epatologia, nefrologia, cardiologia, reumatologia — più due casi dedicati di trappola per iperdiagnosi, con ciascun caso un pannello di esami del sangue generato sinteticamente. Il Secondo aggiornamento della V11 estende la valutazione a 100.000 casi sintetici su 127 etichette di Paese, distribuiti in otto specialità (le sette originali più un bucket dedicato di medicina interna che assorbe la sottoselezione di trappola). La stessa rubrica di scoring viene applicata identica byte per byte in entrambe le run.
Poiché tutti i casi sono generati sinteticamente, non ci sono identificativi reali da rimuovere e non sono coinvolti dati personali. Ogni caso sintetico include un codice di caso interno al benchmark (BT-NNN-LABEL nel set iniziale della V11, un valore stabile case_uid nel Secondo aggiornamento). Nessun dato personale compare in nessun punto dell’harness pubblicato, della relazione tecnica o dei dataset rilasciati.
rilascio iniziale di V11 — 15 casi selezionati manualmente
Il pannello di casi V11 originale è stato curato manualmente dal dott. Thomas Klein per esercitare i pattern diagnostici che gli assistenti di medicina di laboratorio sbagliano più spesso. Ciascuno dei quindici casi è stato selezionato per una specifica proprietà diagnostica, elencata di seguito.
Perché questa particolare distribuzione
L’ematologia ottiene tre casi perché le differenziali microcitiche e le differenziali macrocitiche sono le trappole a più alto volume nella pratica di laboratorio reale. L’endocrinologia ottiene tre casi perché le presentazioni di Hashimoto, PCOS e carenza di vitamina D esercitano forme diagnostiche diverse (guidate da autoanticorpi, guidate da rapporti ormonali, guidate da un singolo marcatore). Le specialità a caso singolo restano comunque significative perché ciascuna tra CKD, rischio ASCVD e LES ha il proprio sistema di punteggio che il motore dovrebbe richiamare (rispettivamente stadiazione KDIGO, rischio a 10 anni ASCVD, criteri LES 2019 EULAR/ACR).
Secondo aggiornamento della V11 — 100.000 casi sintetici su 127 etichette di Paese
Il Secondo aggiornamento sostituisce il letterale Python originale della V11 codificato in modo fisso a 15 casi con un set di casi sintetici più ampio, generato programmaticamente. Il set di casi viene caricato all’inizio di ogni esecuzione e la configurazione viene registrata per trasparenza. La distribuzione della coorte per area di contenuto è mostrata di seguito.
Distribuzione sintetica delle etichette di Paese — top 10 etichette
I 100.000 casi sintetici riportano 127 etichette di Paese (ISO 3166-1 alpha-2) per esercitare la gestione delle impostazioni locali. Assegnazione delle etichette: Europa 57,7%, Americhe 25,4%, Asia-Pacifico 6,2%, etichette denominate Medio Oriente/Africa 3,4% e una lunga coda di 97 etichette aggiuntive per un totale di circa 7,3%. Le dieci etichette più frequenti per numero di casi sono Stati Uniti (10.500), Brasile (9.500), Spagna (9.000), Italia (8.000), Germania (7.800), Francia (7.400), Portogallo (5.800), Türkiye (3.400), Regno Unito (2.900) e Messico (2.500). I punteggi compositi per etichetta variavano da 0,9971 a 0,9985. Questi conteggi di etichette sono proprietà dei casi generati usati per esercitare la gestione delle impostazioni locali — non sono utenti reali e non rappresentano una copertura geografica reale.
La rubrica pre-registrata, spiegata
La preregistrazione è la scelta metodologica singola più importante in questo benchmark. Ogni diagnosi attesa, ogni sistema di punteggio clinico e ogni sezione di report sono stati impegnati nel codice sorgente prima che il motore fosse invocato. La messa a punto post-hoc della rubrica per compiacere il motore è quindi impossibile.
Tre componenti costituiscono il punteggio composito. La componente strutturale contribuisce per il 35% e misura se il motore ha restituito le sette sezioni obbligatorie del report (intestazione, riepilogo, risultati chiave, differenziale, sistemi di punteggio, raccomandazioni, follow-up) e le sedici sottosezioni obbligatorie al loro interno. La presenza della sezione pesa il 40% e la presenza della sottosezione pesa il 60% nel calcolo strutturale.
IL componente clinica contribuisce per il 55% e combina tre elementi: richiamo delle parole chiave della diagnosi (70% della sottopunteggio clinico), richiamo del sistema di punteggio (20% — se il motore calcola Mentzer, FIB-4, HOMA-IR, rischio ASCVD, stadiazione KDIGO, criteri EULAR/ACR quando pertinenti) e un controllo di validità della somma delle probabilità (10% — le probabilità del differenziale devono sommarsi entro l’intervallo [90, 110]). Per i casi trappola, viene sottratta una penalità esplicita per iperdiagnosi fino a 0,30, calcolata come 0,10 per ogni flag di patologia fabbricato, con un limite massimo di tre flag.
IL componente di latenza contribuisce per il 10%. Una risposta sotto i 20 secondi ottiene il punteggio pieno di 0,10, una risposta sotto i 40 secondi ottiene 0,05 e qualsiasi risposta più lenta ottiene zero. L’obiettivo dei 20 secondi riflette l’obiettivo di livello di servizio del servizio di produzione primary-path; il tetto dei 40 secondi riflette il budget di ripiego della Fase 2 per invocazioni pesanti del motore.
Cosa impedisce la preregistrazione
I benchmark di prima parte sono notoriamente inclini a gonfiare i propri numeri tramite messa a punto post-hoc della rubrica. Il modello è quasi sempre lo stesso: il team esegue il motore, vede dove sottoperforma, quindi regola in silenzio la rubrica affinché le aree che sottoperformano contino di meno. Impegnando la rubrica nel codice sorgente prima della prima chiamata al motore e pubblicando il collaudo con licenza MIT, questa modifica diventa visibile nel version control. Chiunque può clonare il repository, controllare le date di creazione della rubrica e verificare che i risultati del motore non siano stati usati per modellare il punteggio.
Casi “trappola” di iperdiagnosi — perché la sovrastima è la vera modalità di fallimento
Chiamate aggressive di patologia su schermate normali è una modalità di fallimento documentata degli assistenti medici per consumatori. I costi a valle includono indagini non necessarie, ansia del paziente e workup iatrogeno. I due casi trappola in questo benchmark sono progettati per rendere visibile e valutabile questa modalità di fallimento.
🟡 Trappola 1 — BT-014-GILBERT
Presentazione. Un uomo di 24 anni con una bilirubina totale di 2,4 mg/dL. La frazione diretta è normale, le transaminasi e la fosfatasi alcalina sono all’interno dei rispettivi intervalli di riferimento, i reticolociti sono nella norma e l’aptoglobina e la LDH escludono l’emolisi.
Interpretazione corretta. Sindrome di Gilbert — una polimorfismo benigno di UGT1A1. L’interpretazione non dovrebbe richiamare epatite, cirrosi, anemia emolitica o ostruzione biliare.
Risultato v11. Composito 1,000. Nessuno dei sei flag di sovradiagnosi monitorati è comparso come diagnosi attiva.
🟡 Trappola 2 — BT-015-HEALTHY
Presentazione. Una donna di 35 anni con un pannello di screening di routine a quindici parametri. Ogni analita si trova comodamente all’interno del proprio intervallo di riferimento.
Interpretazione corretta. Rassicurazione e mantenimento dello stile di vita. L’interpretazione non dovrebbe inventare patologie borderline per sembrare clinicamente utile.
Risultato v11. Composito 1.000. Nessuno dei sette segnali di sovradiagnosi monitorati — diabete, anemia, ipotiroidismo, dislipidemia, epatite, malattia renale, carenza — è comparso come diagnosi attiva.
In entrambe le prove, sono stati controllati tredici segnali di iperdiagnosi monitorati. Nessuno è stato attivato. Questo è il risultato che conta di più per qualsiasi clinico che stia valutando l’uso di un motore di IA come strumento di triage o pre-consultazione: il sistema non ha inventato una malattia laddove non ne esisteva alcuna.
Indice di Mentzer: distinguere la carenza di ferro dalla talassemia caratteristica
Un secondo riscontro ad alto valore riguarda l’abbinamento del caso BT-001 (anemia da carenza di ferro) con il caso BT-007 (beta-talassemia minor). Entrambi si presentano con microcitosi e rappresentano un ostacolo ben noto per i classificatori inesperti. L’indice di Mentzer, calcolato come MCV diviso per il conteggio di RBC, supera 13 nella carenza di ferro e scende sotto 13 nella caratteristica talassemica.
In BT-001, la paziente era una donna di 34 anni con emoglobina 10,4 g/dL, MCV 72,4 fL, RBC 4,1 × 10¹²/L, ferritina 6 ng/mL e TIBC elevata. L’indice di Mentzer di circa 17,7 supporta una carenza assoluta di ferro. In BT-007, il paziente era un uomo di 28 anni con microcitosi (MCV 65,8 fL) ma un alto conteggio di RBC di 6,2, RDW nella norma, ferritina nella norma e HbA2 del 5,6%. L’indice di Mentzer di circa 10,6 indica la caratteristica talassemica e l’HbA2 elevato conferma la beta-talassemia minor.
Entrambi i casi hanno ottenuto 1.000. Il motore ha richiamato esplicitamente l’indice di Mentzer in entrambe le interpretazioni e ha restituito la diagnosi corretta in ogni occasione. Questo è il risultato singolo più rassicurante dal punto di vista clinico nell’intero benchmark, perché classificare erroneamente la caratteristica talassemica come carenza di ferro porta a una supplementazione di ferro inappropriata e a opportunità mancate di screening familiare, mentre classificare erroneamente la carenza di ferro come talassemia ritarda una terapia sostitutiva semplice. Il nostro guida per l’intervallo della ferritina spiega il contesto più ampio della diagnosi differenziale.
Risultati per caso dalla run di riferimento iniziale della V11 (23 aprile 2026)
La run di riferimento V11 originale sulla coorte proof-of-concept da 15 casi funge da base metodologica della Second Update: ogni dettaglio per caso riportato di seguito illustra come la rubrica gestisce una risposta reale dell’engine. Dodici dei quindici casi hanno raggiunto il punteggio composito massimo di 1.000 sul percorso principale; tre casi sono stati serviti tramite il fallback della Fase 2, perdendo il bonus di latenza di 0.05 pur preservando tutto il contenuto clinico e strutturale. Un caso mancava di una singola sottosezione obbligatoria; uno ha restituito una somma di distribuzione di probabilità marginalmente ridotta.
Il caso di PCOS (BT-008) ha perso una singola sottosezione obbligatoria nella struttura della risposta — quindici su sedici invece di sedici su sedici — il che ha ridotto il punteggio strutturale da 1,000 a 0,963. Il caso di SLE (BT-011) ha restituito una somma della distribuzione di probabilità marginalmente ridotta che ha abbassato il punteggio clinico a 0,965, preservando ogni parola chiave diagnostica e sistema di punteggio. Nessuno dei due casi non perfetti ha mancato una diagnosi corretta.
Aggregato V11 Second Update — 100.000 casi
A scala di popolazione, le singole righe dei casi non sono leggibili da esseri umani, quindi il Secondo aggiornamento riporta metriche aggregate invece di una tabella da 100.000 righe. L’aggregato principale è mostrato di seguito; le scomposizioni per specialità e per etichetta di Paese sono pubblicate nella relazione tecnica e nel deposito Figshare. Un campione casuale stratificato di n = 201 risposte grezze dell’engine (seme deterministico 20260426) è pubblicato nella directory GitHub results/ per l’ispezione.
Cosa non ci dice il punteggio in evidenza
Un punteggio composito del 99,80 percento in questa specifica rubrica pre-registrata, su una coorte sintetica di 100.000 casi che copre 127 etichette di Paese, rappresenta prestazioni quasi al “soffitto” — ma merita un inquadramento accurato. Il risultato descrive il comportamento dell’engine rispetto alla rubrica a cui ci siamo impegnati nel codice sorgente nella V11; non è una rivendicazione universale sulla correttezza dell’engine su ogni pannello di esami del sangue esistente nel mondo reale.
Il punteggio indica che il motore ha gestito correttamente i pattern diagnostici selezionati per questa valutazione, su una coorte su scala di popolazione, con una metodologia pubblicata e riproducibile. Non dice che il motore sia corretto su ogni pannello di analisi del sangue esistente in natura. Non dice che il motore debba sostituire il giudizio clinico. E non dice che il motore superi sistemi AI alternativi — analisi comparative con altri motori sono state deliberatamente escluse da questo report.
Ciò che il punteggio stabilisce è una linea di base. Con la rubrica e l’harness resi pubblici, le versioni future del motore possono essere valutate rispetto alla stessa rubrica — applicata ai 15 casi iniziali di V11, alla coorte di 100.000 casi del Secondo aggiornamento, o a qualsiasi successiva espansione — e lo scarto tra il punteggio pubblicato e qualsiasi esecuzione successiva è, a sua volta, misurabile. Questo è il valore della pre-registrazione: converte affermazioni sulle prestazioni in affermazioni verificabili.
Come riprodurre questo benchmark in 10 minuti
La riproduzione richiede solo una coppia di credenziali API Kantesti e un ambiente Python 3.10 o successivo con la libreria requests E reportlab installate. L’harness completo è un singolo modulo Python autosufficiente rilasciato con licenza MIT.
Quattro passaggi per una nuova esecuzione
Uno. Clona il repository: git clone https://github.com/emirhanai/kantesti-blood-test-benchmark.git. Due. Installa le dipendenze con pip install -r requirements.txt (Il Secondo aggiornamento aggiunge mysql-connector-python ≥ 8.0 per il caricatore di casi SQL). Tre. Imposta KANTESTI_USERNAME E KANTESTI_PASSWORD come variabili d’ambiente per l’API del motore. Per il caricatore di casi SQL del Secondo aggiornamento, imposta anche KANTESTI_DB_HOST, KANTESTI_DB_PORT, KANTESTI_DB_NAME, KANTESTI_DB_USER, E KANTESTI_DB_PASSWORD — il loader si connette tramite un ruolo in sola lettura (bench_reader) che non ha privilegi sull’identificazione delle tabelle. Quattro. Esegui python benchmark_bloodtest.py --limit 100000 per l’intera esecuzione Second-Update, oppure python benchmark_bloodtest.py --limit 1000 per una rapida iterazione. Gli output vengono salvati in ./benchmark_results/: una scorecard CSV con colonne per paese/etichetta e per specialità, un aggregato JSON, un campione stratificato-casuale di risposte grezze e un report in Markdown.
Le esecuzioni di riferimento del 23 aprile 2026 (V11 iniziale, 15 casi) e del 26 aprile 2026 (V11 Second Update, 100.000 casi) sono conservate nella results/ directory del repository. Una nuova esecuzione produrrà una nuova scorecard con timestamp, lasciando inalterate le esecuzioni di riferimento. Se la tua esecuzione produce un risultato significativamente diverso, apri un issue su GitHub con il timestamp dell’esecuzione e la versione dell’engine restituita nei metadati della risposta.
Limitazioni e lavori futuri
Anche con 100.000 casi su 127 etichette di paese, quattro limitazioni meritano un riconoscimento esplicito: sottocampionamento delle etichette a coda lunga, valutazione a singolo passaggio, ambito a singolo motore e origine dei dati da una singola fonte. Ciascuna di queste viene affrontata in lavori di follow-up attivi.
Copertura delle etichette a coda lunga. La Second Update copre 127 etichette di paese, ma la distribuzione è sbilanciata — le prime 10 etichette rappresentano ≈66.4% dei casi, e la coda lunga di 97 etichette aggiuntive contribuisce insieme ≈7.3% (circa 7.300 casi in totale, ~75 casi per etichetta in media). Pertanto, i compositi per etichetta in questa coda lunga sono più rumorosi di quanto suggeriscano le cifre principali. Le esecuzioni future ribilanceranno l’assegnazione delle etichette per consolidare le stime per etichetta.
Valutazione a singolo passaggio. Ogni caso nel gruppo è stato valutato una sola volta. I modelli di linguaggio di grandi dimensioni mostrano una varianza dell’output non banale anche a temperature di campionamento basse, quindi un protocollo multi-esecuzione con cinque valutazioni per caso e la varianza riportata è un passo naturale — in particolare sul sottoinsieme dei casi-trappola, dove la coerenza sotto jitter di campionamento fa parte della rivendicazione di sicurezza.
Ambito di un singolo motore. Questo report descrive un singolo motore. Analisi comparative rispetto ad altri sistemi AI sono fuori ambito qui; potremmo perseguirle come uno studio indipendente separato con metodologia adeguata, usando lo stesso harness con licenza MIT.
Dati sintetici. I 100.000 casi sono generati sinteticamente, non sono “casi sintetici”, e i risultati non si trasferiscono alle prestazioni cliniche nel mondo reale. La valutazione su dati reali, con consenso e provenienti da fonti esterne richiederebbe un’adeguata supervisione etica ed esula dall’ambito di questo benchmark sintetico.
Oltre a queste quattro, l’estensione pianificata più impattante è la parità multi-lingua per giurisdizione. Il motore AI Kantesti serve utenti in 75+ lingue e l’esecuzione di sotto-gruppi Second-Update stratificati per lingua (turco, tedesco, spagnolo, francese, italiano, portoghese, arabo, mandarino) quantificherà la qualità dell’output tra le lingue supportate dall’engine. Ogni analisi stratificata per lingua verrà pubblicata con il proprio DOI e branch dell’harness.