Naar de inhoud
NLEN
Illustratie: Inter-annotator agreement berekenen bij LLM-jury's

Inter-annotator agreement berekenen bij LLM-jury's

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

Het inzetten van taalmodellen om de kwaliteit van andere modellen te beoordelen bespaart honderden uren aan handmatige review, maar introduceert tegelijk een kritiek meetprobleem: hoe valideer je of een geautomatiseerd oordeel betrouwbaar is? Zonder statistische toetsing van de inter-annotator agreement (IAA) blijft een geautomatiseerde jury een ondoorzichtige black box. We lopen dan het reële risico dat toevallige modelvariantie, promptgevoeligheden of inherente biases worden aangezien voor werkelijke kwaliteitsverschillen in de getoetste applicatie.

Dit artikel behandelt de wiskundige en praktische methoden om de betrouwbaarheid van LLM-jury's te kwantificeren. De focus ligt hier niet op het ontwerpen van prompts voor evaluatie, maar zuiver op de statistische verantwoording: hoe bereken je of twee jury-modellen, of een taalmodel en een menselijke expert, voldoende op één lijn zitten om beslissingen over productie-deployments te rechtvaardigen. Wie de conceptuele grondbeginselen van automatische beoordelaars wil doornemen, kan vooraf de achtergronden van LLM-as-a-Judge opzetten bestuderen. Hieronder werken we de formules, rekenvoorbeelden, meetprotocollen, code-implementaties en taalspecifieke valkuilen stap voor stap uit.

Waarom percentage-overeenstemming misleidend is

De meest intuïtieve manier om overeenstemming tussen beoordelaars te bepalen is de ruwe proportie: het aantal keren dat de juryleden exact hetzelfde oordeel vellen, gedeeld door het totale aantal geëvalueerde items. In software-evaluaties leidt deze eenvoudige berekening echter vrijwel altijd tot een gevaarlijke overschatting van de werkelijke betrouwbaarheid.

Het kernprobleem is het ontbreken van een correctie voor toevalsovereenstemming. Zodra een testset te maken heeft met een aanzienlijke klasse-onbalans — wat in praktische AI-evaluaties de standaard is — inflateert de ruwe overeenstemming enorm. Stel dat we een RAG-systeem toetsen op het optreden van hallucinaties en dat 90 procent van de gegenereerde antwoorden in de benchmark feitelijk correct is. Als we twee volstrekt willekeurige jury-modellen zouden inzetten die blind in 90 procent van de gevallen het label "Correct" uitdelen, ontstaat er puur op basis van kansberekening al een overeenstemming van meer dan 80 procent:

P(beide toevallig 'Correct') = 0,90 * 0,90 = 0,81
P(beide toevallig 'Fout')    = 0,10 * 0,10 = 0,01
Verwachte toevalskans (Pe)   = 0,81 + 0,01 = 0,82

Een naïeve meting rapporteert in dit scenario 82 procent overeenstemming, wat de illusie wekt van een solide evaluatiepijplijn. In werkelijkheid voegt het jury-panel geen enkele informatieve waarde toe. Om te bepalen of een geautomatiseerd oordeel daadwerkelijk onderscheidend vermogen bezit, moeten we overstappen op kansgecorrigeerde coëfficiënten waarin de geobserveerde overeenstemming ($P_o$) wordt afgezet tegen de toevallig verwachte overeenstemming ($P_e$).

Cohen's kappa voor paarsgewijze categorische scores

Voor situaties waarin we exact twee beoordelaars vergelijken over een vaste set categorieën — bijvoorbeeld een LLM-jury versus een menselijke domeinexpert, of twee verschillende LLM-modellen onderling — is Cohen's kappa ($\kappa$) de klassieke standaard. De coëfficiënt drukt uit welk deel van de potentiële overeenstemming boven het toevalsniveau daadwerkelijk is gerealiseerd.

De wiskundige definitie luidt:

kappa = (Po - Pe) / (1 - Pe)

Hierin is $P_o$ de geobserveerde proportie van overeenstemming en $P_e$ de verwachte overeenstemming onder de aanname van statistische onafhankelijkheid tussen de beoordelaars. De mogelijke waarden van $\kappa$ lopen van -1 tot +1:

Rekenvoorbeeld (ter illustratie, geen productieresultaat):
Twee jury-instanties beoordelen 200 modelantwoorden op een binaire schaal: Voldoet (V) of Voldoet Niet (VN).

Verdeling van de oordelen:
- Beide oordelen V: 140 keer
- Beide oordelen VN: 24 keer
- Jury 1 oordeelt V, Jury 2 oordeelt VN: 16 keer
- Jury 1 oordeelt VN, Jury 2 oordeelt V: 20 keer

Berekening van geobserveerde fracties:
- Jury 1 totaal V = (140 + 16) / 200 = 0,78; totaal VN = 0,22
- Jury 2 totaal V = (140 + 20) / 200 = 0,80; totaal VN = 0,20
- $P_o$ = (140 + 24) / 200 = 164 / 200 = 0,82
- $P_e$ = (0,78 * 0,80) + (0,22 * 0,20) = 0,624 + 0,044 = 0,668

Resultaat voor Cohen's kappa:
$\kappa = (0,82 - 0,668) / (1 - 0,668) = 0,152 / 0,332 \approx 0,458$.

In dit illustratieve voorbeeld zakt een ogenschijnlijk acceptabele ruwe score van 82 procent terug naar een matige $\kappa$ van circa 0,46. Dit legt genadeloos bloot dat een aanzienlijk deel van de overeenstemming werd gedreven door de dominante klasse. Om vast te stellen of je steekproefomvang groot genoeg is om betrouwbare uitspraken te doen over deze kappa-waarden, biedt het overzicht over statistiek voor evaluaties de nodige wiskundige kaders rond steekproefgroottes en power-berekeningen.

Gewogen kappa voor ordinale evaluatieschalen

Niet alle LLM-evaluaties zijn binair. Veel benchmarks hanteren een Likert-schaal (bijvoorbeeld 1 tot 5 sterren voor antwoordkwaliteit) of een rubric met kwaliteitsgradaties zoals Slecht, Matig, Goed en Uitstekend. Bij zulke geordende categorieën is een standaard ongecorrigeerde kappa te streng: een meningsverschil tussen score 4 en score 5 wordt daarin even zwaar bestraft als een fundamenteel conflict tussen score 1 en score 5.

Gewogen kappa (Weighted Kappa, $\kappa_w$) lost dit op door een gewichtenmatrix $w_{ij}$ te introduceren die de afstand tussen categorieën $i$ en $j$ kwantificeert. De formule gebruikt de oneensgezindheidsmatrix:

kappa_w = 1 - (som(w_ij * O_ij) / som(w_ij * E_ij))

Hierbij kiezen we afhankelijk van de taak tussen twee veelgebruikte wegingsschema's:

Krippendorff's alpha voor grotere panels en ontbrekende data

Wanneer we een meerkoppige jury inzetten — bijvoorbeeld een ensemble van drie verschillende LLM-modellen gecombineerd met twee menselijke annotatoren — schiet Cohen's kappa tekort. Fleiss' kappa kan meerdere beoordelaars hanteren, maar eist dat elk item door exact hetzelfde aantal beoordelaars wordt geëvalueerd en ondersteunt geen ontbrekende datapunten of ordinale gewichten.

Krippendorff's alpha ($\alpha$) is de meest robuuste en universele metriek voor geavanceerde LLM-evaluatiearchitecturen. De metriek bezit cruciale eigenschappen voor moderne benchmarks:

De algemene vorm van Krippendorff's alpha luidt:

alpha = 1 - (D_o / D_e)

Waarbij $D_o$ de geobserveerde oneensgezindheid binnen de eenheden is en $D_e$ de oneensgezindheid die toevallig tussen alle gemaakte observaties verwacht mag worden. In de wetenschappelijke literatuur geldt over het algemeen: $\alpha \ge 0,80$ duidt op een zeer betrouwbare meetopzet; waarden tussen $0,667$ en $0,800$ laten voorzichtige conclusies toe, en bij $\alpha < 0,667$ moet het evaluatieraamwerk worden afgekeurd en geherkalibreerd.

Metriek Aantal annotatoren Schaaltype Ontbrekende data Typische LLM-evaluatierol
Cohen's kappa Exact 2 Nominaal Nee LLM-jury ijken tegen één menselijke expert op binaire classificatie.
Gewogen kappa Exact 2 Ordinaal Nee Kwaliteitsscores (1–5 sterren) vergelijken tussen twee modelprompts.
Fleiss' kappa Vast aantal (> 2) Nominaal Nee Ensemble van identiek geconfigureerde jury-instanties zonder uitval.
Krippendorff's alpha Variabel (≥ 2) Nominaal, Ordinaal, Interval Ja Gemengde panels van LLM's en mensen met incidentele API-foutmeldingen.

Python-implementatie voor geautomatiseerde validatie

In een continue evaluatie-pijplijn berekenen we deze statistieken automatisch over de gelogde juryscores. Het onderstaande script demonstreert de berekening van nominale kappa, gewogen ordinale kappa en Krippendorff's alpha met behulp van scikit-learn en krippendorff.

import numpy as np
from sklearn.metrics import cohen_kappa_score
import krippendorff

# Voorbeelddata: 10 testcases beoordeeld op een schaal van 0 (Fout) tot 3 (Uitstekend)
# Beoordelaars: Expert (Mens), LLM_Rechter_A, LLM_Rechter_B
mens_expert   = [3, 2, 0, 1, 3, 0, 2, 3, 1, 2]
llm_rechter_a = [3, 2, 0, 2, 3, 0, 1, 3, 1, 2]
llm_rechter_b = [3, 1, 0, 1, 2, 0, 2, 3, 1, 2]

# 1. Cohen's Kappa (ongecorrigeerd vs lineair gewogen) Mens vs LLM A
kappa_ongecorrigeerd = cohen_kappa_score(mens_expert, llm_rechter_a)
kappa_lineair = cohen_kappa_score(mens_expert, llm_rechter_a, weights="linear")
kappa_kwadratisch = cohen_kappa_score(mens_expert, llm_rechter_a, weights="quadratic")

print(f"Mens vs LLM A - Nominale Kappa:     {kappa_ongecorrigeerd:.3f}")
print(f"Mens vs LLM A - Lineair Gewogen:    {kappa_lineair:.3f}")
print(f"Mens vs LLM A - Kwadratisch Gewogen:{kappa_kwadratisch:.3f}")

# 2. Krippendorff's Alpha over het voltallige panel (inclusief ontbrekende data)
# Matrix-formaat voor krippendorff-library: shape (aantal_beoordelaars, aantal_items)
# Stel voor dat LLM B een time-out had op item index 4 (aangeduid als np.nan)
llm_rechter_b_met_nan = [3, 1, 0, 1, np.nan, 0, 2, 3, 1, 2]

betrouwbaarheids_matrix = np.array([
    mens_expert,
    llm_rechter_a,
    llm_rechter_b_met_nan
])

alpha_ordinaal = krippendorff.alpha(
    reliability_data=betrouwbaarheids_matrix,
    level_of_measurement="ordinal"
)

print(f"Panel Krippendorff's Alpha (Ordinaal): {alpha_ordinaal:.3f}")

Wanneer uit de berekening blijkt dat de overeenstemming tussen de LLM-jury en de menselijke beoordelaars achterblijft, ligt de oorzaak vaak niet bij het model zelf, maar bij ambigue instructies in het evaluatieprotocol. Een grondige revisie van de menselijke evaluatierichtlijnen zorgt voor eenduidige rubrics, wat zowel de menselijke inter-beoordelaarsbetrouwbaarheid als de correlatie met LLM-jury's direct verhoogt.

Biases die overeenstemming kunstmatig beïnvloeden

Bij het analyseren van inter-annotator agreement bij LLM's moeten we bedacht zijn op systematische artefacten. Taalmodellen vertonen specifieke denkfouten die de berekende statistieken op twee manieren kunnen vervuilen: door agreement kunstmatig op te blazen of juist onterecht te kelderen.

1. Positiebias (Position Bias)

Bij paarsgewijze vergelijkingen (waarbij een rechter moet kiezen tussen Antwoord A en Antwoord B) heeft vrijwel elk taalmodel een sterke voorkeur voor de kandidaat op de eerste positie, ongeacht de inhoudelijke kwaliteit. Als we twee identieke modelinstanties loslaten op dezelfde prompts zonder de volgorde om te draaien, zullen beide modellen vaker optie A kiezen. De berekende kappa stijgt hierdoor aanzienlijk, maar meet niets anders dan gedeelde positievoorkeur.

Om dit effect te neutraliseren moet elke vergelijking symmetrisch worden geëvalueerd: eenmaal als $(A, B)$ en eenmaal als $(B, A)$. Pas wanneer een model consistent dezelfde kandidaat kiest ongeacht de volgorde, telt het oordeel als een valide annotatie. Bekijk de methoden om positiebias te meten en neutraliseren voor een volledige analyse van swap-inconsistentie.

2. Lengtebias (Verbosity Bias)

LLM-jury's kennen structureel hogere scores toe aan langere, breedsprakige antwoorden met complexe opmaak (opsommingstekens, vetgedrukte koppen), zelfs wanneer een korter antwoord feitelijk accurater en beknopter is. Twee verschillende modellen uit dezelfde modelfamilie vertonen vaak exact dezelfde lengtegevoeligheid, wat leidt tot een hoge onderlinge overeenstemming die niet correleert met menselijke experts die beknoptheid prefereren.

3. Zelfvoorkeur (Self-Enhancement Bias)

Een model dat optreedt als beoordelaar waardeert teksten die door zijn eigen modelarchitectuur of familie zijn gegenereerd over het algemeen hoger dan teksten van concurrerende architecturen. Als een benchmark LLM-X inzet om LLM-X te vergelijken met LLM-Y, ontstaat een structurele afwijking ten opzichte van neutrale menselijke annotatoren, wat resulteert in een lage externe kappa.

Nederlandstalige eigenaardigheden in jury-overeenstemming

Bij het uitvoeren van betrouwbaarheidsmetingen op Nederlandstalige evaluatiesets treden specifieke linguïstische fricties op die de inter-annotator agreement tussen modellen en moedertaalsprekers onder druk zetten:

Om te verifiëren of de feitelijke claims in een Nederlandstalige tekst standhouden voordat de stijlbeoordeling plaatsvindt, is het raadzaam de procedures voor AI-antwoorden factchecken te integreren in de validatieketen van de annotatoren.

Kosten, steekproefomvang en rekenoverhead

Het meten van inter-annotator agreement verhoogt de computationele kosten van een evaluatiecampagne. Waar een naïeve evaluatie één enkele LLM-aanroep per testcase uitvoert, vereist een wetenschappelijk verantwoorde meetopzet minimaal twee onafhankelijke modelbeoordelingen plus symmetrische positiewisselingen.

De tokenconsumptie schaalt conform de volgende parameters:

Evaluatiestrategie Aanroepen per testcase Tokenvolume (1.000 cases) Statistische validiteit
Enkelvoudige LLM-run 1 ca. 1.000.000 tokens Geen betrouwbaarheidsmeting mogelijk; gevoelig voor ruis en toeval.
Dubbele jury met swap (A/B + B/A) 4 ca. 4.000.000 tokens Kwantificeert positiebias en levert robuuste Cohen's kappa op.
Multi-LLM Ensemble (3 modellen + swap) 6 ca. 6.000.000 tokens Maakt Krippendorff's alpha en meerderheidsstemming mogelijk.

Om deze kosten beheersbaar te houden zonder in te leveren op methodologische degelijkheid, passen we een tweestapsbenadering toe: we voeren de volledige agreement-berekening (inclusief menselijke calibratie) uit op een aselecte steekproef van 15 tot 20 procent van de testset. Pas wanneer de berekende Krippendorff's alpha op deze steekproef de drempelwaarde van $\alpha \ge 0,75$ overschrijdt, wordt de geautomatiseerde configuratie uitgerold over de resterende 80 procent van het evaluatievolume.

Praktisch protocol voor continue kwaliteitsbewaking

Het vaststellen van inter-annotator agreement is geen eenmalige exercitie bij het opzetten van een benchmark. LLM-aanbieders updaten hun gewichten en API-endpoints regelmatig, waardoor het gedrag en de scoringstandaarden van een LLM-jury geruisloos kunnen verschuiven (model drift).

Een robuust validatieprotocol omvat vier vaste fasen:

  1. IJkset vastleggen: Bouw een permanente gouden standaard van minimaal 150 representatieve testcases die handmatig zijn geannoteerd door minstens twee menselijke experts met een onderlinge overeenstemming van $\kappa \ge 0,80$.
  2. Baseline bepalen: Bereken vóór de start van de benchmark de gewogen kappa tussen de LLM-jury en de gouden standaard.
  3. Symmetrische scoring afdwingen: Voer alle geautomatiseerde vergelijkingen dubbel uit met verwisselde invoervolgorde om positionele variantie te isoleren.
  4. Periodieke regressietest: Evalueer de ijkset maandelijks opnieuw met dezelfde LLM-prompts. Daalt de berekende $\alpha$ met meer dan 0,05 ten opzichte van de baseline, dan moet de jury-prompt opnieuw worden gekalibreerd.

Door inter-annotator agreement als vaste kwaliteitsdrempel in te bouwen, transformeer je een subjectieve en wankele modelbeoordeling naar een reproduceerbaar, statistisch onderbouwd meetinstrument.