# Elo-ratingsysteem opzetten voor modelvergelijking

[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/)[llmnet.nl — hoofdsite](https://llmnet.nl/)[](https://x.com/intent/post?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking&text=Elo-ratingsysteem%20opzetten%20voor%20modelvergelijking)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking)[](https://www.reddit.com/submit?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking&title=Elo-ratingsysteem%20opzetten%20voor%20modelvergelijking)[](#)[](https://x.com/intent/post?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking&text=Elo-ratingsysteem%20opzetten%20voor%20modelvergelijking)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking)[](https://www.reddit.com/submit?url=https%3A%2F%2Fbenchmark.llmnet.nl%2Felo-ratingsysteem-opzetten-voor-paarsgewijze-modelvergelijking&title=Elo-ratingsysteem%20opzetten%20voor%20modelvergelijking)[](#)

 
# Elo-ratingsysteem opzetten voor paarsgewijze modelvergelijking

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

 Bij het evalueren van grote taalmodellen voor open taken — zoals creatieve samenvattingen, domeinspecifieke klantenservice of complexe redeneervraagstukken — schieten absolute cijferschalen (zoals een rapportcijfer van 1 tot 10) structureel tekort. Beoordelaars schalen inconsistente standaarden, cijfers kalibreren moeizaam en een 7 voor de ene annotator is een 9 voor de andere. Een paarsgewijze vergelijking (A versus B) lost deze schaalinconsistentie op door de vraag te reduceren tot een binaire of drieledige keuze: welke reactie beantwoordt de vraag beter, of is het een gelijkspel?

 Om uit honderden of duizenden losse duels een coherente, eendimensionale ranglijst te distilleren, vormt een Elo- of Bradley-Terry-ratingsysteem de industriestandaard. Dit artikel legt uit hoe je zelf een robuuste paarsgewijze meetpijplijn opzet, welke wiskundige formules je hanteert, hoe je systematische meetfouten neutraliseert en hoe je de benodigde steekproefomvang berekent. Dit artikel bakent zich specifiek af van absolute scoringsmethodes en richt zich puur op relatieve toernooistructuren tussen concurrerende modelversies.

 
## Het fundament: Van individuele duels naar een relatieve schaal

 Het klassieke Elo-systeem, oorspronkelijk ontwikkeld voor de schaaksport door Arpad Elo, modelleert de relatieve vaardigheid van entiteiten op basis van de uitkomst van directe confrontaties. Wanneer model A wint van model B, stijgt de rating van model A en daalt die van model B. De mate van aanpassing hangt af van de verwachting vooraf: wint een zwaar favoriet model van een zwakkere variant, dan verandert de score nauwelijks; wint het zwakkere model onverwacht, dan vindt er een forse correctie plaats.

 De wiskundige kern bestaat uit twee stappen: het berekenen van de verwachte winstkans en het bijwerken van de scores na de geobserveerde uitslag. De verwachte score \(E_A\) van model A tegenover model B met actuele ratings \(R_A\) en \(R_B\) wordt berekend met een logistische functie:

 E_A = 1 / (1 + 10^((R_B - R_A) / 400))
E_B = 1 / (1 + 10^((R_A - R_B) / 400))

 Zodra het duel is voltooid en de werkelijke uitslag \(S_A\) bekend is (waarbij 1 staat voor winst van A, 0.5 voor gelijkspel en 0 voor winst van B), worden de ratings bijgewerkt met een vaste factor \(K\):

 R'_A = R_A + K * (S_A - E_A)
R'_B = R_B + K * (S_B - E_B)

 De constante 400 bepaalt de schaal: een ratingverschil van 400 punten impliceert dat het sterkere model een theoretische winstkans van ongeveer 91% heeft tegenover de tegenstander, terwijl een verschil van 0 punten resulteert in een winstkans van exact 50%.

 
## Klassiek online Elo versus Bradley-Terry met Maximum Likelihood

 In een statische benchmarkomgeving heeft het iteratief updaten van klassieke Elo-scores een belangrijk nadeel: de volgorde waarin gevechten worden verwerkt beïnvloedt de uiteindelijke eindscore (orde-afhankelijkheid). Bovendien reageert het systeem sterk op de gekozen \(K\)-factor. Om dit op te lossen, gebruikt men in moderne LLM-evaluaties bij voorkeur het Bradley-Terry-model via Maximum Likelihood Estimation (MLE).

 Het Bradley-Terry-model postuleert dat elk model \(i\) een latente vaardigheidsparameter \(\beta_i\) bezit, zodanig dat de kans dat model \(i\) wint van model \(j\) gelijk is aan:

 P(i wint van j) = exp(\beta_i) / (exp(\beta_i) + exp(\beta_j)) = 1 / (1 + exp(-(\beta_i - \beta_j)))

 In plaats van incrementele updates worden alle verzamelde duels in één batch geoptimaliseerd door de gecombineerde log-likelihood van alle geobserveerde uitslagen te maximaliseren via logistische regressie. De resulterende coëfficiënten \(\beta\) worden vervolgens lineair getransformeerd naar de vertrouwde schaal (vaak met een ankerwaarde van 1000 of 1500 voor het basismodel):

 Elo_i = 1000 + \beta_i * (400 / ln(10))

 Het grote voordeel van Bradley-Terry via MLE is dat de ranking volledig volgorde-onafhankelijk is, optimaal gebruikmaakt van alle historische data en direct toestaat om betrouwbaarheidsintervallen te berekenen. Om te bepalen hoeveel duels noodzakelijk zijn voordat een gemeten verschil statistisch significant is, raadpleeg je het overzicht over [statistiek voor LLM-evaluaties en steekproefgroottes](https://benchmark.llmnet.nl/statistiek-voor-evaluaties), waarin de theoretische onderbouwing van betrouwbaarheidsmarges bij modeltoetsing gedetailleerd wordt behandeld.

 
## Matchmaking-strategieën: Efficiënte toewijzing van duels

 Bij \(N\) modellen groeit het aantal unieke modelparen kwadratisch volgens \(N(N-1)/2\). Als je 10 modelvarianten wilt vergelijken, zijn er 45 unieke paren. Bij 50 modellen loopt dit op naar 1225 paren. Het volledig uniform random selecteren van paren is inefficiënt: duels tussen een extreem sterk model en een zeer zwak model leveren nauwelijks informatiewaarde op (de uitkomst staat vrijwel vast), maar kosten wel inference-tokens en beoordelaarsuren.

 
 
 
 
 Strategie | 
 Mechanisme | 
 Voordeel | 
 Valkuil | 
 

 
 
 
 Uniform Random | 
 Elk paar heeft gelijke kans om getrokken te worden. | 
 Eenvoudig te implementeren, geen selectiebias. | 
 Verspilt duels aan ongelijke matchups; trage convergentie. | 
 

 
 Swiss-system / K-nearest | 
 Koppelt modellen met vergelijkbare tussenratings. | 
 Maximale informatiewinst per duel (winstkans rond 50%). | 
 Risico op geïsoleerde clusters; vereist af en toe cross-tier duels. | 
 

 
 Anchor-based (Hub) | 
 Nieuwe modellen vechten primair tegen geijkte ijkmodellen. | 
 Snelle positionering van nieuwe checkpoints met minimale runs. | 
 Gevoelig voor circulaire non-transitieve interacties met het ijkmodel. | 
 

 
 
 

 Voor een productie-evaluatie werkt een hybride opzet het beste: start met een korte exploratiefase (uniform random of ankergevechten) om een ruwe schatting te krijgen, en schakel daarna over op actieve sampling waarbij paren worden gekozen waarvan het absolute verschil in geschatte vaardigheid zo klein mogelijk is.

 
## De beoordelaar inrichten: Mens versus LLM-as-a-Judge

 De uitkomst van een duel (\(S_A\)) moet worden vastgesteld door een onafhankelijke arbiter. Dit kan een menselijke domeinexpert zijn of een krachtig geautomatiseerd taalmodel. Beide benaderingen vereisen specifieke maatregelen om validiteit te waarborgen.

 Wanneer een menselijk panel wordt ingezet, moeten strikte annotatie-instructies voorkomen dat subjectieve smaak de overhand krijgt. Voor richtlijnen over het kalibreren van menselijke beoordelaars en het meten van inter-beoordelaarsbetrouwbaarheid kun je het artikel over [menselijke evaluatie opzetten en annotatie-richtlijnen](https://benchmark.llmnet.nl/menselijke-evaluatie) bestuderen, waarin methodes voor consensusvorming worden toegelicht.

 Wanneer een taalmodel als scheidsrechter optreedt, moeten we rekening houden met bekende systematische afwijkingen. Voor een diepgaande analyse van de foutmarges en validatiemethodes van geautomatiseerde arbiters biedt het dossier over [LLM-as-a-judge methodologie](https://benchmark.llmnet.nl/llm-as-a-judge) onmisbare achtergrondinformatie over modelkeuze en promptontwerp.

 
## Drie hardnekkige meetfouten en hoe je ze neutraliseert

 Paarsgewijze evaluaties met modellen als beoordelaar hebben last van drie specifieke meetfouten die de Elo-scores zwaar kunnen vertekenen als er niet expliciet voor gecorrigeerd wordt:

 
### 1. Positiebias (Position Bias)

 Veel taalmodellen hebben een sterke voorkeur voor de eerste kandidaat (Optie A) of juist de tweede (Optie B), puur vanwege de volgorde waarin ze in de prompt verschijnen. Om dit te neutraliseren is een swap-test verplicht: elk duel wordt tweemaal uitgevoerd, waarbij in de tweede doorgang de antwoorden van plek wisselen.

 Wint model X zowel op positie A als op positie B, dan is de uitslag onomstotelijk winst voor X. Wint de kandidaat op positie A ongeacht welk model er staat, dan is er sprake van positiebias en moet het resultaat worden geregistreerd als een ongeldige meting of een gelijkspel.

 
### 2. Lengtebias (Verbosity Bias)

 Zowel menselijke beoordelaars als LLM-arbiters associëren langere, uitvoerige antwoorden onbewust met hogere kwaliteit, zelfs wanneer de extra tekst louter opvulling bevat. Om dit tegen te gaan kun je lengte-genormaliseerde prompts hanteren (waarbij beide modellen een strikte tokenlimiet meekrijgen) of de beoordelaar expliciet instrueren om beknoptheid en informatiedichtheid te belonen.

 
### 3. Zelfvoorkeur (Self-enhancement Bias)

 Wanneer modelfamilie Z optreedt als beoordelaar van een duel waarin een model uit dezelfde familie meedoet, kent de arbiter onevenredig vaak de overwinning toe aan zijn eigen stamboom. Dit los je op door een jury van meerdere heterogene modellen (van verschillende leveranciers) in te zetten of door een model te kiezen dat zelf niet deelneemt aan het toernooi.

 
## Betrouwbaarheidsintervallen via bootstrapping

 Een Elo-score zonder betrouwbaarheidsinterval suggereert een schijnnauwkeurigheid die in werkelijkheid niet bestaat. Een verschil van 15 Elo-punten tussen twee modellen kan puur op toeval berusten als er slechts 100 duels zijn gespeeld. Om de onzekerheidsmarge te kwantificeren passen we non-parametrische bootstrapping toe.

 Het bootstrapping-algoritme verloopt als volgt:

 
 
- Neem de volledige dataset van \(M\) gespeelde duels.
 
- Trek met teruglegging (resampling with replacement) een nieuwe steekproef van exact omvang \(M\).
 
- Bereken de Bradley-Terry Elo-ratings over deze gesamplede dataset.
 
- Herhaal stap 2 en 3 minimaal 1000 keer.
 
- Bepaal voor elk model het 2.5e en 97.5e percentiel van de distributie; dit vormt het 95%-betrouwbaarheidsinterval.
 

 Pas wanneer de betrouwbaarheidsintervallen van twee modellen elkaar niet overlappen, mag met statistische zekerheid worden geconcludeerd dat het ene model superieur is op de geteste promptverzameling.

 
## Praktijkvoorbeeld: Python-implementatie met Bradley-Terry

 Hieronder staat een compact, zelfstandig werkend implementatiescript in Python dat een lijst van duelresultaten omzet in Bradley-Terry-ratings via logistische regressie (scikit-learn), inclusief normalisatie naar een herkenbare Elo-schaal.

 import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression

def bereken_bradley_terry_elo(duels_df, basis_rating=1000.0, schaalfactor=400.0):
 """
 Berekent Elo-ratings via Bradley-Terry logistische regressie.
 duels_df bevat kolommen: 'model_a', 'model_b', 'winnaar' ('model_a', 'model_b', of 'tie')
 """
 # Filter gelijkspelen of splits ze in halve overwinningen
 duels = []
 for _, row in duels_df.iterrows():
 if row['winnaar'] == 'model_a':
 duels.append((row['model_a'], row['model_b'], 1.0))
 elif row['winnaar'] == 'model_b':
 duels.append((row['model_a'], row['model_b'], 0.0))
 elif row['winnaar'] == 'tie':
 # Gelijkspel telt als twee halve duels in spiegelbeeld
 duels.append((row['model_a'], row['model_b'], 0.5))

 modellen = sorted(list(set(duels_df['model_a']).union(set(duels_df['model_b']))))
 model_idx = {model: i for i, model in enumerate(modellen)}
 n_modellen = len(modellen)

 # Bouw featuresmatrix (1 voor model_a, -1 voor model_b)
 X = []
 y = []
 sample_weights = []

 for ma, mb, res in duels:
 row = np.zeros(n_modellen)
 row[model_idx[ma]] = 1.0
 row[model_idx[mb]] = -1.0
 
 if res == 0.5:
 # Gelijkspel gewogen verwerken
 X.append(row)
 y.append(1.0)
 sample_weights.append(0.5)
 X.append(row)
 y.append(0.0)
 sample_weights.append(0.5)
 else:
 X.append(row)
 y.append(res)
 sample_weights.append(1.0)

 X = np.array(X)
 y = np.array(y)
 weights = np.array(sample_weights)

 # Fit logistische regressie zonder intercept met L2-regularisatie
 lr = LogisticRegression(fit_intercept=False, C=1.0, solver='lbfgs')
 lr.fit(X, y, sample_weight=weights)

 coefs = lr.coef_[0]
 # Converteer log-odds coëfficiënten naar Elo-schaal
 elo_scores = coefs * (schaalfactor / np.log(10))
 # Centreer rond basis_rating
 elo_scores = elo_scores - np.mean(elo_scores) + basis_rating

 resultaten = pd.DataFrame({
 'Model': modellen,
 'Elo': np.round(elo_scores, 1)
 }).sort_values(by='Elo', ascending=False).reset_index(drop=True)

 return resultaten

 
## Kosten- en tokenberekening voor een evaluatierun

 Het uitvoeren van een grootschalig Elo-toernooi brengt aanzienlijke reken- en API-kosten met zich mee. Laten we de tokenbelasting doorrekenen voor een toernooi met 6 concurrerende modellen op een dataset van 250 evaluatievragen.

 
 Rekenvoorbeeld (indicatief):
 Bij 6 modellen en een round-robin toernooi zijn er 15 unieke paren. Met 250 vragen en een verplichte swap-test (2 posities per vraag) ontstaan er \(15 \times 250 \times 2 = 7.500\) unieke duels.
 Elk duel vereist:
 - Promptinvoer voor de arbiter (vraag + antwoord A + antwoord B): gemiddeld 900 tokens.
 - Beoordelingsredenering + eindoordeel: gemiddeld 250 tokens.
 Totaal volume voor de arbiter: 6,75M input tokens en 1,87M output tokens, exclusief de initiële generatiekosten van de 6 kandidaatmodellen (die elk 250 antwoorden moeten genereren).
 

 Om deze kosten te beheersen is het verstandig om vooraf een strak budgetplan op te stellen. In het artikel over [de kosten van evalueren beheersen bij LLM-toepassingen](https://benchmark.llmnet.nl/kosten-van-evalueren) vind je strategieën om het aantal benodigde API-aanroepen drastisch te beperken zonder in te boeten op statistische zeggingskracht.

 Wanneer je tientallen modelvarianten parallel aanroept via diverse leveranciers, kan infrastructuurcomplexiteit snel toenemen. Het centraal routeren van deze calls via een tussenlaag helpt om rate limits en uitval op te vangen; zie hiervoor de handleiding over [de kracht van een LLM API-aggregator](https://api.llmnet.nl/aggregator-uitleg) voor technische integratiepatronen.

 
## Nederlandstalige valkuilen bij paarsgewijze modelduels

 Bij het benchmarken van Nederlandstalige modeluitvoer treden specifieke taalkundige fenomenen op die paarsgewijze ratings kunnen vertekenen als de beoordelaar er niet op gekalibreerd is:

 
 
- Aanspreekvorm-inconsistentie (je/u): Veel modellen wisselen binnen één antwoord tussen formele en informele aanspreekvormen. Een arbiter die getraind is op Engelse data mist deze stijlfout vaak, terwijl een menselijke lezer zich hier direct aan stoort.
 
- Anglicismen en leenvertalingen: Modellen vertalen Engelse idioomconstructies regelmatig letterlijk naar het Nederlands (zoals "dat maakt zin" in plaats van "dat heeft zin"). Als beide modellen dezelfde fout maken, ziet de arbiter het niet; als één model correct Nederlands hanteert, moet de scoringsprompt expliciet instrueren dat natuurlijk taalgebruik zwaarder weegt dan vaktermen.
 
- Samenstellingen en spatiefouten: De beruchte Engelse ziekte (losse woorden schrijven waar een koppelteken of aaneenschrijving vereist is, zoals model evaluatie in plaats van modelevaluatie) komt massaal voor bij kleinere open-source checkpoints. De evaluatie-instructie moet expliciet bepalen of spellingfouten tot puntenaftrek leiden.
 

 
## Kwaliteitscontrole: Wanneer verwerp je een toernooi-uitkomst?

 Een berekende Elo-ranglijst mag nooit klakkeloos worden overgenomen. Er gelden vier concrete afkeurcriteria op basis waarvan een toernooirun ongeldig verklaard moet worden:

 
 
- Hoge positie-inconsistentie (> 15%): Als in meer dan 15% van de duels de uitslag omdraait puur door de volgorde van kandidaat A en B te wisselen, is de arbiter onvoldoende gekalibreerd voor de taak.
 
- Niet-transitieve lussen (steen-papier-schaar): Als model A structureel wint van B, B wint van C, maar C met grote overmacht wint van A, schendt de data de transitiviteitsaanname van het Bradley-Terry-model. Dit duidt meestal op een dataset met sterk uiteenlopende subdomeinen (bijvoorbeeld code versus poëzie) die niet op één hoop geveegd mogen worden.
 
- Overmatige lengtecorrelatie (\(r > 0.65\)): Als de correlatie tussen het aantal gegenereerde tokens en de uiteindelijke Elo-rating extreem hoog is, meet het toernooi waarschijnlijk tekstlengte in plaats van inhoudelijke kwaliteit.
 
- Te breed betrouwbaarheidsinterval: Als het 95%-betrouwbaarheidsinterval van de topkandidaten breder is dan 80 Elo-punten, zijn er simpelweg te weinig duels gespeeld om een verantwoorde architectuurkeuze op te baseren.
 

 Door deze controles structureel in te bouwen ontstaat een meetomgeving die reproduceerbare, statistisch harde en bedrijfskritische beslissingen over modelselectie mogelijk maakt.
