Hvorfor denne benchmarken finnes og hva den tester
AI-assisted blood test interpretation is increasingly used in consumer and clinical workflows, yet reproducible evaluation frameworks tailored to laboratory medicine remain uncommon. The questions that matter most in this setting are not the ones covered by general medical question-answering benchmarks: can an engine separate iron deficiency from thalassaemia trait when the mean corpuscular volume is identical, does it over-diagnose Gilbert's syndrome as hepatitis, and does it manufacture pathology in a fully normal screening panel?
A single blood test panel typically contains enough signal to support several competing interpretations, and the job of the interpreting clinician is to weigh those interpretations against each other rather than to retrieve a textbook answer. An engine that does well on textbook cases can still fail on the cases that matter most: the differential-diagnosis pitfalls, the benign variants that look alarming in isolation, and the fully normal panels that tempt confident assistants into manufacturing pathology.
This benchmark was built around exactly those failure modes. Each of the fifteen cases was selected for a specific diagnostic property: an iron-deficient microcytosis that must be kept distinct from a beta-thalassaemia trait with identical mean corpuscular volume, a Gilbert's syndrome presentation where the only abnormality is an isolated indirect hyperbilirubinaemia, and a fifteen-parameter screening panel in which every analyte sits inside its reference range. The rubric rewards engines that read each case on its own terms and penalises engines that reach for a confident diagnosis where no such diagnosis is warranted.
As Thomas Klein, MD, I selected the case panel because these are the patterns I see laboratory-medicine assistants get wrong most often. The expensive failure mode is not "missing a rare disease" — it is fabricating routine pathology in patients who do not have it. Vår Medical Validation hub describes the broader framework; this page describes the V11 initial proof-of-concept and the V11 Second Update that scaled it to 100,000 synthetic cases drawn from a synthetic case set spanning 127 country labels — using the same scoring rubric, byte-identical, with no post-hoc tuning permitted.
Latest reference run — V11 Second Update (April 26, 2026)
The V11 Second Update reference run of 26 April 2026 produced a composite score of 99.80% on the same pre-registered rubric used in the V11 initial release, evaluated on 100,000 synthetic cases drawn from the Kantesti synthetic case set and spanning 127 country labels and 75+ languages. Every case completed on the engine's primary path; trap-case hyperdiagnosis flag activations remained at 0 / 87,412. Den opprinnelige V11-kjøringen 23. april 2026 dekket 15 håndkuraterte tilfeller (sammensatt 99.12%) og validerte rubrikken; den andre oppdateringen beholder den rubrikken byte-identisk og utvider evalueringen til en kohort i befolkningsskala.
Den sammensatte formelen kombinerer tre komponenter: strukturell samsvar med de sju obligatoriske rapporteringsdelene og seksten obligatoriske underdelene, innholdsnøyaktighet målt som nøkkelord-tilbakekalling pluss tilbakekalling for scoresystemet, samt en gyldighetssjekk av sannsynlighetsfordelingen, og svartid mot den primære service-level-målsettingen for path. Den nøyaktige dekomponeringen vises i rubrikkformelen nedenfor — ingen av disse vektene eller underscore-rubrikker ble endret for den andre oppdateringen.
De resterende 0,20 prosentpoengene av handlingsrommet dekomponeres nesten helt inn i den kliniske underscoren — en liten andel av tilfellene (hovedsakelig i hepatologi og revmatologi) hadde ett forventet scoresystem-nøkkelord fraværende fra motorens tolkning, til tross for at det diagnostiske innholdet var korrekt. Ingen av tilfellene i kohorten på 100 000 i den andre oppdateringen bommet på selve diagnosen. Latenstiden ble forbedret fra et gjennomsnitt på 20,17 s i den opprinnelige V11-utgaven til 13,26 s i den andre oppdateringen, noe som gjenspeiler optimaliseringer i produksjonsmotoren mellom de to kjøringene; rubrikken, scoringskoden og API-endepunktet er uendret.
Sammensatte scores per etikett varierte fra 0,9971 til 0,9985 på tvers av de 30 mest representerte landsetikettene. Den lange halen av 97 tilleggsetiketter (≈7 300 tilfeller samlet) viste ingen systematisk forverring. De hyppigste etikettene etter antall tilfeller var USA (10 500), Brasil (9 500), Spania (9 000), Italia (8 000), Tyskland (7 800), Frankrike (7 400), Portugal (5 800), Türkiye (3 400), Storbritannia (2 900) og Mexico (2 500).
Fra 15 cases til 100 000: kohortevolusjon på tvers av 127 landetiketter
Den opprinnelige V11-casepanelet dekket sju spesialiteter — hematologi, endokrinologi, metabolsk medisin, hepatologi, nefrologi, kardiologi, revmatologi — pluss to dedikerte hyperdiagnose-felletilfeller, der hvert tilfelle var et syntetisk generert blodprøvepanel. V11 andre oppdatering utvider evalueringen til 100 000 syntetiske tilfeller på tvers av 127 landsetiketter, fordelt på åtte spesialiteter (de opprinnelige sju pluss en dedikert internmedisinsk kategori som absorberer trap-delsettet). Samme evalueringsskjema brukes byte-for-byte identisk i begge kjøringer.
Siden alle caser er syntetisk generert, finnes det ingen reelle identifikatorer å fjerne og ingen personopplysninger er involvert. Hver syntetisk case har en benchmark-intern casekode (BT-NNN-LABEL i V11-innledende sett, en stabil case_uid i den andre oppdateringen). Ingen personopplysninger forekommer noe sted i den publiserte harnessen, den tekniske rapporten eller de utgitte datasettene.
V11 innledende utgivelse — 15 håndkuraterte caser
Det opprinnelige V11-casepanelet ble håndkuratert av dr. Thomas Klein for å teste de diagnostiske mønstrene som laboratoriemedisinske assistenter oftest tar feil av. Hver av de femten casene ble valgt ut for en spesifikk diagnostisk egenskap, oppført nedenfor.
Hvorfor akkurat denne fordelingen
Hematologi får tre tilfeller fordi mikrocyttiske differensialdiagnoser og makrocyttiske differensialdiagnoser er de største fallgruvene med høyest volum i reell laboratoriepraksis. Endokrinologi får tre fordi presentasjonene ved Hashimotos, PCOS og vitamin D-mangel trener ulike diagnostiske mønstre (autoantistoffdrevet, hormonsiffer-forholdsdrevet, enkeltmarkør-drevet). Spesialitetene med ett enkelt tilfelle er fortsatt meningsfulle fordi hvert av CKD, ASCVD-risiko og SLE har sitt eget poengsystem som motoren skal kalle (henholdsvis KDIGO-stadieinndeling, ASCVD 10-års risiko, og 2019 EULAR/ACR SLE-kriterier).
V11 andre oppdatering — 100 000 syntetiske tilfeller på tvers av 127 landkoder
Den andre oppdateringen erstatter den opprinnelige V11 hardkodede 15-tilfelle Python-iteralingen med et større, programmatisk generert syntetisk tilfellesett. Tilfellesettet lastes ved starten av hver kjøring, og konfigurasjonen logges for transparens. Kohortfordelingen etter fagområde vises nedenfor.
Synthetic country-label distribution — top 10 labels
The 100,000 synthetic cases carry 127 country labels (ISO 3166-1 alpha-2) to exercise locale handling. Label assignment: Europe 57.7%, the Americas 25.4%, Asia-Pacific 6.2%, named Middle-East/Africa labels 3.4%, and a long tail of 97 additional labels roughly 7.3% combined. The ten most frequent labels by case count are the United States (10,500), Brazil (9,500), Spain (9,000), Italy (8,000), Germany (7,800), France (7,400), Portugal (5,800), Türkiye (3,400), the United Kingdom (2,900), and Mexico (2,500). Per-label composite scores ranged from 0.9971 to 0.9985. These label counts are properties of the generated cases used to exercise locale handling — they are not real users and not real-world geographic coverage.
Den forhåndsregistrerte rubrikken, forklart
Pre-registration is the single most important methodological choice in this benchmark. Every expected diagnosis, every clinical scoring system, and every report section was committed to source code before the engine was invoked. Post-hoc tuning of the rubric to flatter the engine is therefore impossible.
Three components make up the composite score. The structural component contributes 35 percent and measures whether the engine returned the seven mandatory report sections (header, summary, key findings, differential, scoring systems, recommendations, follow-up) and the sixteen mandatory subsections within them. Section presence weighs 40 percent and subsection presence weighs 60 percent within the structural calculation.
Det clinical component contributes 55 percent and combines three things: diagnosis-keyword recall (70 percent of the clinical sub-score), scoring-system recall (20 percent — does the engine compute Mentzer, FIB-4, HOMA-IR, ASCVD risk, KDIGO staging, EULAR/ACR criteria where relevant), and a probability-sum validity check (10 percent — the differential probabilities should sum to within the [90, 110] interval). For trap cases, an explicit hyperdiagnosis penalty of up to 0.30 is subtracted, calculated as 0.10 per fabricated pathology flag, capped at three flags.
Det latency component contributes 10 percent. A response under 20 seconds earns the full 0.10, a response under 40 seconds earns 0.05, and anything slower earns zero. The 20-second target reflects the production primary-path service-level objective; the 40-second ceiling reflects the Phase 2 fallback budget for heavy-engine invocations.
What pre-registration prevents
First-party benchmarks are notorious for inflating their own numbers through post-hoc rubric tuning. The pattern is almost always the same: the team runs the engine, sees where it underperforms, then quietly adjusts the rubric so the underperforming areas count for less. By committing the rubric to source code before the first engine call and publishing the harness under MIT licence, that adjustment becomes visible in version control. Anyone can clone the repository, check the rubric author dates, and verify the engine results were not used to shape the scoring.
Hyperdiagnose-felle-cases — hvorfor overrapportering er den egentlige feilmåten
Aggressive over-calling of pathology on normal screens is a documented failure mode of consumer-facing medical assistants. Its downstream costs include unnecessary investigation, patient anxiety, and iatrogenic workup. The two trap cases in this benchmark are designed to make that failure mode visible and scoreable.
🟡 Trap 1 — BT-014-GILBERT
Presentation. En 24 år gammel mann med total bilirubin på 2,4 mg/dL. Den direkte fraksjonen er normal, transaminaser og alkalisk fosfatase ligger innenfor sine referanseområder, retikulocytter er upåfallende, og haptoglobin og LDH utelukker hemolyse.
Korrekt tolkning. Gilbert syndrom — en benign UGT1A1-polymorfisme. Tolkningen skal ikke påkalle hepatitt, cirrhose, hemolytisk anemi eller biliær obstruksjon.
V11-resultat. Sammensatt 1.000. Ingen av de seks overvåkede overdiagnose-flaggene viste seg som aktive diagnoser.
🟡 Felle 2 — BT-015-HEALTHY
Presentation. En 35 år gammel kvinne med et femtenparameter rutinemessig screeningspanel. Hver analytt ligger komfortabelt innenfor sitt referanseområde.
Korrekt tolkning. Beroligelse og vedlikehold av livsstil. Tolkningen skal ikke finne på grensepatologi for å høres klinisk nyttig ut.
V11-resultat. Sammensatt 1.000. Ingen av de sju overvåkede overdiagnose-flaggene — diabetes, anemi, hypotyreose, dyslipidemi, hepatitt, nyresykdom, mangel — viste seg som aktive diagnoser.
På tvers av begge fellene ble tretten overvåkede hyperdiagnose-flagger sjekket. Ingen ble utløst. Dette er resultatet som betyr mest for enhver kliniker som vurderer å bruke en AI-motor som triage- eller førkonsultasjonsverktøy: systemet fant ikke opp sykdom der ingen fantes.
Mentzer-indeks: skille jernmangel fra thalassemi-egenskap
Et andre funn med høy verdi gjelder koblingen av case BT-001 (jernmangelanemi) med case BT-007 (beta-talassemi minor). Begge presenterer med mikrocytose og er en velkjent snublestein for naive klassifikatorer. Mentzer-indeksen, beregnet som MCV dividert med RBC-antall, er over 13 ved jernmangel og under 13 ved talassetrekk.
I BT-001 var pasienten en 34 år gammel kvinne med hemoglobin 10,4 g/dL, MCV 72,4 fL, RBC 4,1 × 10¹²/L, ferritin 6 ng/mL og forhøyet TIBC. Mentzer-indeksen på omtrent 17,7 støtter absolutt jernmangel. I BT-007 var pasienten en 28 år gammel mann med mikrocytose (MCV 65,8 fL) men et høyt RBC-antall på 6,2, normal RDW, normalt ferritin og HbA2 på 5,6 prosent. Mentzer-indeksen på omtrent 10,6 peker mot talassetrekk, og det forhøyede HbA2 bekrefter beta-talassemi minor.
Begge tilfellene fikk score 1.000. Motoren brukte Mentzer-indeksen eksplisitt i begge tolkningene og returnerte riktig diagnose i hvert tilfelle. Dette er det mest klinisk betryggende enkeltresultatet i hele benchmarken, fordi feilklassifisering av talassetrekk som jernmangel fører til upassende jerntilskudd og tapte muligheter for familiescreening, og feilklassifisering av jernmangel som talassemi forsinker enkel erstatningsterapi. Vår ferritin-områdeveileder forklarer den bredere differensialkonteksten.
Per-case resultater fra V11 første referansekjøring (23. april 2026)
Den opprinnelige V11-referansekjøringen som ble utført på 15-case proof-of-concept-kohorten fungerer som det metodologiske grunnlaget for den andre oppdateringen: hver detalj per case nedenfor illustrerer hvordan rubrikken håndterer et reelt motorrespons. Tolv av femten cases oppnådde taket for den sammensatte totalscore på 1.000 på hovedsporet; tre cases ble levert via Phase 2-reserven, og mistet 0.05 latensbonusen samtidig som alt klinisk og strukturelt innhold ble bevart. Én case manglet én obligatorisk del; én returnerte en marginalt redusert sum av sannsynlighetsfordelingen.
The PCOS case (BT-008) lost a single mandatory subsection in the response structure — fifteen of sixteen instead of sixteen of sixteen — which shaved structural score from 1.000 to 0.963. The SLE case (BT-011) returned a marginally reduced probability-distribution sum that dropped clinical score to 0.965 while preserving every diagnostic keyword and scoring system. Neither sub-perfect case missed a correct diagnosis.
V11 Second Update aggregate — 100,000 cases
At population scale, individual case rows are not human-readable, so the Second Update reports aggregated metrics rather than a 100,000-row table. The headline aggregate is shown below; per-specialty and per-country-label breakdowns are published in the technical report and the Figshare deposit. A stratified random sample of n = 201 raw engine responses (deterministic seed 20260426) is published in the GitHub results/ directory for inspection.
Hva hovedscoren ikke forteller oss
A composite score of 99.80 percent under this particular pre-registered rubric, on a 100,000-case synthetic cohort spanning 127 country labels, represents near-ceiling performance — but it deserves careful framing. The result describes the engine's behaviour against the rubric we committed to source code in V11; it is not a universal claim about the engine's correctness on every blood test panel that exists in the wild.
The score says the engine handled the diagnostic patterns selected for this evaluation correctly across a population-scale cohort, on a methodology that is published and reproducible. It does not say the engine is correct on every blood test panel that exists in the wild. It does not say the engine should replace clinician judgment. And it does not say the engine outperforms alternative AI systems — comparative analyses against other engines were deliberately out of scope for this report.
What the score does establish is a baseline. With the rubric and harness public, future versions of the engine can be evaluated against the same rubric — applied to the V11 initial 15 cases, the Second Update 100,000-case cohort, or any subsequent expansion — and the gap between the published score and any subsequent run is itself measurable. This is the value of pre-registration: it converts performance claims into testable claims.
Slik reproduserer du denne benchmarken på 10 minutter
Reproduction requires only a Kantesti API credential pair and a Python 3.10 or later environment with the requests og reportlab libraries installed. The full harness is a single self-contained Python module released under the MIT licence.
Fire trinn til en ny kjøring
Ett. Klon depotet: git clone https://github.com/emirhanai/kantesti-blood-test-benchmark.git. To. Installer avhengigheter med pip install -r requirements.txt (Second Update legger til mysql-connector-python ≥ 8.0 for SQL-case-loaderen). Tre. Angi KANTESTI_USERNAME og KANTESTI_PASSWORD som miljøvariabler for motor-API-en. For Second Update SQL case loader, angi også KANTESTI_DB_HOST, KANTESTI_DB_PORT, KANTESTI_DB_NAME, KANTESTI_DB_USER, og KANTESTI_DB_PASSWORD — the loader connects through a read-only role (bench_reader) that has no privileges on identifying tables. Four. Run python benchmark_bloodtest.py --limit 100000 for the full Second-Update run, or python benchmark_bloodtest.py --limit 1000 for quick iteration. Outputs land in ./benchmark_results/: a CSV scorecard with per-country-label and per-specialty columns, a JSON aggregate, a stratified-random raw-response sample, and a Markdown report.
The reference runs from 23 April 2026 (V11 initial, 15 cases) and 26 April 2026 (V11 Second Update, 100,000 cases) are preserved in the results/ directory of the repository. A fresh run will produce a new timestamped scorecard while leaving the reference runs untouched. If your run produces a meaningfully different result, please open a GitHub issue with the run timestamp and the engine version returned in the response metadata.
Begrensninger og videre arbeid
Even at 100,000 cases across 127 country labels, four limitations deserve explicit acknowledgement: long-tail label undersampling, single-shot evaluation, single-engine scope, and single-source data origin. Each is being addressed in active follow-up work.
Long-tail label coverage. The Second Update spans 127 country labels, but the distribution is unbalanced — the top 10 labels account for ≈66.4% of cases, and the long tail of 97 additional labels together contributes ≈7.3% (roughly 7,300 cases combined, ~75 cases per label on average). Per-label composites in this long tail are therefore noisier than headline figures suggest. Future runs will rebalance label assignment to firm up per-label estimates.
Single-shot evaluation. Each case in the cohort was evaluated once. Large language models exhibit non-trivial output variance even at low sampling temperature, so a multi-run protocol with five evaluations per case and reported variance is a natural next step — particularly on the trap-case subset, where consistency under sampling jitter is part of the safety claim.
Single-engine scope. This report characterises one engine. Comparative analyses against alternative AI systems are out of scope here; we may pursue them as a separate independent study with appropriate methodology, against the same MIT-licensed harness.
Synthetic data. The 100,000 cases are synthetically generated, not synthetic cases, and results do not transfer to real-world clinical performance. Evaluation on real, consented, externally-sourced data would require appropriate ethical oversight and is out of scope for this synthetic benchmark.
Beyond these four, the most impactful planned extension is multi-language parity per jurisdiction. The Kantesti AI Engine serves users in 75+ languages, and running language-stratified Second-Update sub-cohorts (Turkish, German, Spanish, French, Italian, Portuguese, Arabic, Mandarin) will quantify output quality across the engine's supported languages. Each language-stratified analysis will be published with its own DOI and harness branch.