# Betrouwbaarheidsintervallen bootstrappen voor LLM-tests

[Naar de inhoud](#lm-inhoud)Netwerk/NL[EN](/en/)[Hubhub.llmnet.nlModellen vergelijken op taak, taal, kosten en licentie.](https://hub.llmnet.nl/)[Communitycommunity.llmnet.nlPrompttechnieken, patronen en systeemprompts.](https://community.llmnet.nl/)[APIapi.llmnet.nlLLM's robuust in software: rate limits, routing, structured output.](https://api.llmnet.nl/)[Consultancyconsultancy.llmnet.nlAI invoeren in een organisatie, van pilot tot productie.](https://consultancy.llmnet.nl/)[Nieuwsnieuws.llmnet.nlOntwikkelingen in AI, geduid voor Nederland.](https://nieuws.llmnet.nl/)[Benchmarkbenchmark.llmnet.nlZelf meten wat AI-kwaliteit is, voor jouw taken.](https://benchmark.llmnet.nl/)[Vacaturesvacatures.llmnet.nlAI-rollen, salarissen en carrièrepaden in Nederland.](https://vacatures.llmnet.nl/)[Lerenleren.llmnet.nlAI-concepten in gewoon Nederlands, van beginner tot bouwer.](https://leren.llmnet.nl/)[Gidsgids.llmnet.nlAI privé draaien op eigen Mac, pc, NAS of thuisserver.](https://gids.llmnet.nl/)[Directorydirectory.llmnet.nlHet AI-ecosysteem in kaart: tools, modellen, bedrijven.](https://directory.llmnet.nl/)[Radarradar.llmnet.nlSignalen uit X, onderzoek en communities voor indie developers.](https://radar.llmnet.nl/)[Appsapps.llmnet.nlReviews van AI-apps en open-source repo's, met tips voor wie zelf bouwt.](https://apps.llmnet.nl/)[llmnet.nl — hoofdsite](https://llmnet.nl/)[](https://x.com/intent/post?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests&text=Betrouwbaarheidsintervallen%20bootstrappen%20voor%20LLM-tests)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests)[](https://www.reddit.com/submit?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests&title=Betrouwbaarheidsintervallen%20bootstrappen%20voor%20LLM-tests)[](#)[](https://x.com/intent/post?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests&text=Betrouwbaarheidsintervallen%20bootstrappen%20voor%20LLM-tests)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests)[](https://www.reddit.com/submit?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Fbetrouwbaarheidsintervallen-bootstrappen-voor-llm-tests&title=Betrouwbaarheidsintervallen%20bootstrappen%20voor%20LLM-tests)[](#)

 
# Betrouwbaarheidsintervallen bootstrappen voor LLM-tests

 Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini)

 Bij het evalueren van Large Language Models worden beslissingen vaak genomen op basis van een enkel puntcijfer: model A scoort 84,2% nauwkeurigheid en model B haalt 86,1%. Zonder inzicht in de statistische onzekerheid rondom deze meetwaarden is zo'n vergelijking echter misleidend. LLM-evaluaties vertonen een inherente variantie die ontstaat door steekproeffluctuaties in de dataset, willekeur in samplingparameters en scoringsafwijkingen. Door non-parametrische betrouwbaarheidsintervallen te bootstrappen, transformeren we een fragiele puntschatting naar een robuust interval waarmee gefundeerde keuzes over modelpromotie en promptoptimalisatie mogelijk worden.

 Dit artikel behandelt uitsluitend de wiskundige techniek van bootstrapping en het berekenen van betrouwbaarheidsintervallen over empirische testresultaten. Voor het bepalen van de benodigde steekproefomvang voorafgaand aan een test verwijzen we naar de gids over [steekproefgrootte bepalen voor betrouwbare LLM-evaluaties](https://benchmark.llmnet.nl/steekproefgrootte-bepalen-voor-betrouwbare-llm-evaluaties). Hier focussen we ons op de analysefase: wat vertellen de verzamelde meetpunten over de werkelijke onderliggende populatieprestaties?

 
## Waarom puntschattingen falen bij taalmodelevaluaties

 Traditionele softwaretests zijn doorgaans deterministisch: een unit test slaagt of faalt. LLM-evaluaties lijken meer op klinische trials of econometrische metingen. Wanneer we een testset van tweehonderd vragen afvuren op een LLM, vormt die set slechts een willekeurige steekproef uit een oneindige verzameling mogelijke prompts binnen een specifiek domein. Een gerapporteerd gemiddelde weerspiegelt puur de prestaties op die tweehonderd specifieke voorbeelden.

 Bovendien zijn de uitkomsten bij generatieve AI zelden normaal verdeeld. Foutpatronen bij taken zoals classificatie of extractie resulteren in binaire vectoren (goed/fout), terwijl evaluaties van tekstgeneratie vaak zwaar linksscheve scores opleveren waarbij de meeste antwoorden hoog scoren en een kleine staart catastrofaal faalt. Klassieke parametrische methodes zoals de Student t-toets veronderstellen normaliteit van de onderliggende populatie of steunen op de centrale limietstelling. Bij kleine steekproeven of zwaar asymmetrische verdelingen leiden parametrische aannames echter tot onrealistisch smalle of zelfs fysiek onmogelijke betrouwbaarheidsgrenzen (zoals scores boven de 100%).

 De algemene theoretische basis voor evaluatiestatistiek vind je terug in het overzichtsartikel over [statistiek voor LLM-evaluaties en steekproeven](https://benchmark.llmnet.nl/statistiek-voor-evaluaties). Bootstrapping lost het parametrische probleem op door geen enkele aanname te doen over de vorm van de dataverdeling: de geobserveerde steekproef fungeert als zijn eigen populatiemodel.

 
## Het bootstrap-principe stap voor stap

 Bootstrapping is een non-parametrische resampling-methode die in 1979 door Bradley Efron is geïntroduceerd. In de context van LLM-benchmarks werkt de techniek als volgt: we trekken met teruglegging herhaaldelijk nieuwe steekproeven van exact dezelfde grootte uit onze oorspronkelijke dataset. Op elke gegenereerde bootstrap-steekproef herberekenen we de gewenste metriek (zoals de gemiddelde score, de F1-score of het 95e percentiel).

 Door dit proces duizenden keren te herhalen, bouwen we een empirische verdeling op van de toetsingsgrootheid. Uit deze verdeling kunnen we vervolgens rechtstreeks betrouwbaarheidsintervallen aflezen. Het proces volgt vier vaste stappen:

 
 
- Dataset fixeren: Verzamel de evaluatiescores van N unieke testgevallen. Dit resulteert in een vector X = [x₁, x₂, ..., xₙ].
 
- Resamplen met teruglegging: Trek uniform en willekeurig N elementen uit X, waarbij individuele elementen meerdere keren of helemaal niet mogen voorkomen. Dit levert een bootstrap-steekproef X* op.
 
- Metriek berekenen: Bereken de teststatistiek θ* = f(X*), bijvoorbeeld het rekenkundig gemiddelde van X*.
 
- Herhalen en aggregeren: Voer stappen 2 en 3 in totaal B keer uit (waarbij B typisch tussen 2.000 en 10.000 ligt). Sla alle berekende statistieken op in een vector Θ* = [θ*₁, θ*₂, ..., θ*B].
 

 Het 95%-betrouwbaarheidsinterval kan vervolgens direct worden vastgesteld via de percentielmethode door de geordende vector Θ* te nemen en de waarden bij het 2,5e en 97,5e percentiel af te lezen.

 
## Percentiel versus BCa-intervallen: wanneer gebruik je wat?

 Hoewel de percentielmethode uiterst eenvoudig te implementeren is, vertoont zij systematische tekortkomingen wanneer de steekproef klein is of wanneer de steekproevenverdeling scheef is. In die situaties dekt het resulterende interval minder vaak de werkelijke populatiewaarde dan het nominale niveau (bijvoorbeeld slechts 91% dekking in plaats van de beoogde 95%).

 Om deze afwijkingen te corrigeren, gebruiken we bij voorkeur het Bias-Corrected and Accelerated (BCa) bootstrap-interval. De BCa-methode past de percentielgrenzen aan via twee parameters:

 
 
- Bias-correctie (z₀): Meet de proportie bootstrap-replicaties die lager uitvallen dan de oorspronkelijke puntschatting. Als de verdeling symmetrisch rond de schatting ligt, is z₀ = 0.
 
- Versnelling (a): Corrigeert voor de mate waarin de standaardfout van de schatter verandert met de werkelijke parameterwaarde (skewness). Deze factor wordt berekend via een jackknife-benadering (leave-one-out resampling over de dataset).
 

 
 
 
 
 Bootstrap-methode | 
 Rekencomplexiteit | 
 Aannames | 
 Aanbevolen toepassing bij LLM-evals | 
 

 
 
 
 Standaard Percentiel | 
 Laag (O(B · N)) | 
 Symmetrische samplingverdeling | 
 Snelle CI/CD-checks, grote datasets (N > 500) | 
 

 
 Basale Bootstrap (Empirical) | 
 Laag (O(B · N)) | 
 Locatie-invariante verdeling | 
 Eenvoudige shift-metingen zonder zware staarten | 
 

 
 Studentized (Bootstrap-t) | 
 Hoog (geneste loops) | 
 Vereist betrouwbare variantieschatting | 
 Zelden gebruikt bij LLMs wegens instabiliteit | 
 

 
 BCa (Bias-Corrected & Acc.) | 
 Gemiddeld (O(B · N + N²)) | 
 Geen vorm-aannames, non-parametrisch | 
 Productie-benchmarks, kleine testsets (N < 200) | 
 

 
 
 

 
## Paarsgewijs bootstrappen voor A/B-tests tussen prompts en modellen

 Een veelgemaakte fout bij het vergelijken van twee prompts of modellen is het afzonderlijk berekenen van twee betrouwbaarheidsintervallen en controleren of deze elkaar overlappen. Als interval A en interval B elkaar overlappen, concluderen analisten ten onrechte dat er geen statistisch significant verschil is. Dit negeert de paarsgewijze correlatie tussen de metingen: beide modellen zijn immers geëvalueerd op dezelfde set testvragen.

 Om te bepalen of Prompt 2 daadwerkelijk beter presteert dan Prompt 1, bootstrappen we het verschil per testitem. Laat dᵢ = score(M₂, qᵢ) - score(M₁, qᵢ) het prestatieverschil zijn op vraag qᵢ. We trekken vervolgens bootstrap-steekproeven uit de verschillevector D = [d₁, d₂, ..., dₙ].

 Als het 95%-betrouwbaarheidsinterval van de verschilvector D* de waarde 0 niet bevat (bijvoorbeeld een interval van [+0.021, +0.084]), kunnen we met 95% zekerheid stellen dat Model 2 superieur is aan Model 1, zelfs wanneer de individuele absolute intervallen van beide modellen overlap vertoonden. Deze paarsgewijze aanpak elimineert de item-specifieke variantie (sommige vragen zijn fundamenteel moeilijker dan andere) en verhoogt de statistische power van de test aanzienlijk.

 Bij het inrichten van softwarematige kwaliteitscontroles is deze methode onmisbaar. Lees meer over hoe je [acceptatietests inricht voor niet-deterministische output](https://consultancy.llmnet.nl/acceptatietests-inrichten-voor-niet-deterministische-output) om te voorkomen dat willekeurige ruis wordt aangezien voor kwaliteitsverbetering.

 
## Reproduceerbare meetopzet en code-implementatie

 Om een bootstrap-evaluatie reproduceerbaar te maken, moeten alle bronnen van willekeur worden vastgezet. Dit betreft zowel de generatiefase van het model als de statistische resamplingfase. Voor de generatieve kant is het essentieel om te begrijpen hoe samplingparameters elkaar beïnvloeden; zie hiervoor de handleiding over [temperature en top-p calibreren voor deterministische output](https://benchmark.llmnet.nl/temperature-en-top-p-calibreren-voor-deterministische-output).

 In de onderstaande Python-implementatie gebruiken we NumPy om een vectorgebaseerde, snelle non-parametrische bootstrap uit te voeren over evaluatieresultaten. De code berekent zowel het absolute percentiel-interval als het paarsgewijze verschil-interval.

import numpy as np

def bootstrap_ci_paarsgewijs(scores_a, scores_b, n_bootstraps=5000, alpha=0.05, seed=42):
 rng = np.random.default_rng(seed)
 n = len(scores_a)
 
 if len(scores_b) != n:
 raise ValueError("Beide scorelijsten moeten exact even lang zijn.")
 
 # Bereken item-gewijze verschillen
 verschillen = np.array(scores_b) - np.array(scores_a)
 oorspronkelijk_verschil = np.mean(verschillen)
 
 # Genereer alle bootstrap indices in een matrix (B x N)
 boot_indices = rng.integers(0, n, size=(n_bootstraps, n))
 
 # Bereken de gemiddelden over de resamples
 boot_verschillen = np.mean(verschillen[boot_indices], axis=1)
 
 # Bepaal percentielgrenzen
 ondergrens_pct = 100 * (alpha / 2)
 bovengrens_pct = 100 * (1 - alpha / 2)
 
 ci_laag = np.percentile(boot_verschillen, ondergrens_pct)
 ci_hoog = np.percentile(boot_verschillen, bovengrens_pct)
 
 # Bereken de empirische tweezijdige p-waarde rond 0
 if oorspronkelijk_verschil > 0:
 p_waarde = 2 * np.mean(boot_verschillen <= 0)
 else:
 p_waarde = 2 * np.mean(boot_verschillen >= 0)
 p_waarde = min(p_waarde, 1.0)
 
 return {
 "delta_gemiddelde": float(oorspronkelijk_verschil),
 "ci_ondergrens": float(ci_laag),
 "ci_bovengrens": float(ci_hoog),
 "p_waarde": float(p_waarde),
 "significant": bool(ci_laag > 0 or ci_hoog < 0)
 }

# Voorbeeld met binaire evaluatiedata (0 = fout, 1 = correct)
data_oud = [1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0]
data_nieuw = [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1]

resultaat = bootstrap_ci_paarsgewijs(data_oud, data_nieuw, seed=1337)
print(f"Delta: {resultaat['delta_gemiddelde']:.3f}")
print(f"95% CI: [{resultaat['ci_ondergrens']:.3f}, {resultaat['ci_bovengrens']:.3f}]")
print(f"Significant: {resultaat['significant']}")

 De reproduceerbaarheid van deze uitkomst wordt gewaarborgd door het gebruik van np.random.default_rng(seed). Voor een bredere kijk op het borgen van consistente testresultaten binnen het team raden we aan het artikel over [reproduceerbaarheid van AI-evaluaties](https://benchmark.llmnet.nl/reproduceerbaarheid) te raadplegen.

 
## Nederlandstalige taalkwesties en scoringsasymmetrie

 Bij het evalueren van Nederlandstalige modeloutput treden specifieke taalkundige fenomenen op die de variantie van de testscores sterk beïnvloeden. Waar Engelstalige zinnen vaak een eenduidige grammaticale structuur hebben, kent het Nederlands complexe regels rond samengestelde woorden, verbuigingen en leenwoorden.

 Een model kan bijvoorbeeld consequent falen op de correcte aaneenschrijving van lange samenstellingen (zoals kwaliteitsbeheersingssysteem versus het foutieve kwaliteits beheersings systeem) of moeite hebben met het onderscheid tussen formele en informele aanspreekvormen (u versus je/jij). Als een testset tien vragen bevat over samengestelde zelfstandige naamwoorden en negentig algemene vragen, ontstaat er een zogeheten 'geclusterde foutenstructuur'.

 Wanneer we standaard bootstrappen over alle honderd items, behandelen we elk item als statistisch onafhankelijk. Als de testset echter thematische clusters bevat, leidt gewone resampling tot een onderschatting van de variantie. In dergelijke gevallen is geïnstratificeerd bootstrappen (stratified bootstrapping) noodzakelijk: we trekken dan bootstrap-steekproeven binnen elke taalcategorie afzonderlijk (bijvoorbeeld 10 samples uit de samenstellingen-groep en 90 samples uit de algemene groep), waarna we de resultaten samenvoegen. Dit voorkomt dat zeldzame maar cruciale Nederlandse taalvalkuilen onder- of oververtegenwoordigd raken in de betrouwbaarheidsgrenzen.

 
## Kosten- en doorlooptijdanalyse van resampling

 In tegenstelling tot het genereren van LLM-output via API's, is bootstrapping puur een post-processing bewerking die lokaal op de CPU wordt uitgevoerd. De kosten in termen van tokens en API-budget zijn derhalve nul euro. De enige investering zit in de rekentijd van de evaluatiemachine.

 Omdat bootstrapping vectoriseerbaar is in NumPy of C++, kost het genereren van 10.000 bootstrap-herhalingen over een dataset van 1.000 testitems op een moderne laptop minder dan 50 milliseconden. Zelfs een complexere BCa-berekening met jackknife-resampling vergt bij N = 500 slechts enkele seconden. Bootstrapping voegt daardoor vrijwel geen overhead toe aan een CI/CD-evaluatiepijplijn, terwijl het de interpretatiewaarde van de test enorm vergroot.

 
 Let op: De getallen in de onderstaande tabel zijn illustratieve rekenvoorbeelden van computatietijden op een standaard quad-core CPU, geen vaste systeemspecificaties.
 

 
 
 
 
 Aantal testitems (N) | 
 Bootstrap-iteraties (B) | 
 Methode | 
 Geschatte CPU-tijd | 
 Extra API-kosten | 
 

 
 
 
 100 | 
 2.000 | 
 Percentiel | 
 ~5 ms | 
 € 0,00 | 
 

 
 500 | 
 10.000 | 
 Percentiel | 
 ~25 ms | 
 € 0,00 | 
 

 
 500 | 
 10.000 | 
 BCa (incl. Jackknife) | 
 ~450 ms | 
 € 0,00 | 
 

 
 2.500 | 
 50.000 | 
 BCa (incl. Jackknife) | 
 ~8,2 s | 
 € 0,00 | 
 

 
 
 

 
## Zwakke punten en randvoorwaarden van bootstrapping

 Hoewel bootstrapping een krachtig wiskundig instrument is, kent de methode strikte theoretische begrenzingen die niet genegeerd mogen worden:

 
 
- Geen remedie voor een niet-representatieve testset: Bootstrapping meet uitsluitend de steekproefvariabiliteit. Als de oorspronkelijke testset systematisch bevooroordeeld is, slecht geannoteerd is of belangrijke productie-use-cases mist, zal het bootstrap-interval met grote precisie de verkeerde waarde omkaderen (garbage in, garbage out).
 
- Onderschatting van de staart bij extreem kleine steekproeven: Bij minder dan 30 à 40 datapunten (N < 30) kan bootstrapping de ware variantie niet accuraat herleiden. De resamples herhalen dan te vaak dezelfde zeldzame uitschieters, waardoor het interval kunstmatig smal kan uitvallen.
 
- Niet-onafhankelijke observaties: Als de evaluatiedata sequentiële afhankelijkheden bevat (zoals opeenvolgende beurten in een multi-turn dialoog of tijdreeksen), schendt standaard bootstrapping de i.i.d.-aanname (independent and identically distributed). In dergelijke scenario's moet block bootstrapping worden ingezet om de correlatiestructuur intact te houden.
 
- Rechtergrens-afkapping bij perfecte scores: Wanneer een model op alle items in de steekproef een score van 100% haalt, zal elke bootstrap-resample eveneens 100% opleveren. Het bootstrap-interval wordt dan [1.0, 1.0] met een variantie van nul. Dit wekt de valse illusie van perfecte zekerheid, terwijl de werkelijke populatiefoutkans bij een eindige steekproef simpelweg niet exact nul is (de zogeheten 'rule of three' stelt dat bij 0 fouten op N tests het 95%-bovengeheugenfoutpercentage rond 3/N ligt).
 

 
## Conclusie: van scorebord naar wetenschappelijke besluitvorming

 Het rapporteren van kale percentages bij LLM-benchmarks hoort thuis in marketingmateriaal, niet in serieuze software-engineering. Door non-parametrische betrouwbaarheidsintervallen te integreren in de evaluatierapporten, maken we inzichtelijk of een gemeten kwaliteitsverschil berust op toeval of op een daadwerkelijke structurele verbetering.

 De combinatie van paarsgewijze bootstrapping en robuuste BCa-intervallen stelt ontwikkelteams in staat om met minimale computationele kosten harde uitspraken te doen over promptwijzigingen, modelmigraties en kwantisatieverliezen. Het verankeren van deze statistische discipline voorkomt kostbare regressies en vormt het fundament onder een volwassen AI-ontwikkelproces.
