ISMS Copilot
Engineering

De stille nul: wanneer een ontbrekende beoordelingsscore een meting wordt

Bij onze 2026-07-17 ablatie van GRC-strategieën voor documentgeneratie (GLM-5.2 en Claude Opus 4.8 als schrijvers en als 1-10 rubriekbeoordelaars) had pass 2 79 van de 446 geregistreerde beoordelingsrijen geen algemene score. De aggregator telde elk ervan als 0. Dezelfde nul-opvulling had een effect van 3,25 punten gecreëerd in pass 1, en toen dit verdween formuleerden we een theorie over beoordelaarsvooroordeel om dit te verklaren. Het gepaarde verschil tussen de twee beoordelaars op dezelfde documenten bedroeg 0,12.

door ISMS Copilot··14 min read
De stille nul: wanneer een ontbrekende beoordelingsscore een meting wordt

Het gevaarlijkste getal in een LLM-beoordeelde evaluatie is niet een bevooroordeelde score. Het is een ontbrekende score, omdat een permissieve aggregator deze zonder dat je het merkt omzet in een nul, waarna je een theorie bouwt om die nul te verklaren. Dat weten we omdat we het tweemaal binnen dezelfde evaluatie hebben meegemaakt. Bij een offline ablatie die op 2026-07-17 werd afgerond, vergeleken we tien generatiestrategieën voor GRC-leverables (beleidspakketten, een verwerkersregister RoPA, een SOC 2-gapanalyse, een ISO/IEC 42001 AI-beleid, een EU AI Act-classificatie), blind beoordeeld door twee beoordelaarsmodellen op een 1-10 rubriek. Pass 1 rapporteerde dat het renderen van een volledig leverable in één keer 3,25 punten beter scoorde dan het stap-voor-stap renderen. Bij pass 2 verdween dat effect naar 0,66, en onze eigen methodologienota diagnosticeerde de ineenstorting als een artefact van de beoordelaar: één beoordelaarsmodel was "1,5-2 punten meer toegeeflijk" dan de andere. Beide bevindingen waren dezelfde bug. Zevenennegentig van de 446 beoordelingsrijen in pass 2 hadden geen overall-veld, de reducer voerde Number(r[d]) || 0 uit, en elke gemiddelde overall in de scorekaart van het rapport, plus beide frameworkzware hoofdfiguren, wordt precies gereproduceerd door die 79 rijen als nullen te middelen. We noemen dit de stille nul, en deze post beschrijft wat het ons kostte en wat we nu controleren.

De evaluatie, en wat deze rapporteerde

De opzet was gebruikelijk voor dit soort werk. Negen bevroren scenario's, allemaal synthetisch en gebaseerd op een fictieve 20-persoon Berlijnse SaaS-startup (een tiende, een due-diligencememo van een leverancier, stond in het testbestand maar werd niet gerenderd in de onderzochte passes), ontworpen rond de meest uitdagende vormen van compliance-schrijven die we tegenkomen: een meersectie intern auditrapport, een beleidspakket met meerdere documenten, een GDPR Art. 30-verwerkersregister, frameworkzware taken over SOC 2, ISO/IEC 42001 en de EU AI Act, een beleid gebaseerd op de werkruimte, een twaalf-documentenrun, een opdracht met ambigu scope. Tien varianten varieerden de generatiestrategie: render een vooraf goedgekeurde sectie-voor-sectie-opdracht stap voor stap, render dezelfde opdracht in één keer, genereer de opdracht opnieuw met een strengere planner eerst, schrijf vrij vanuit de klantopdracht zonder opdracht, voeg een reflectielus toe van concept-critique-revisie, en wissel het schrijfmodel. De twee schrijfmodellen waren z-ai/glm-5.2 en anthropic/claude-opus-4.8, beide aangeroepen via OpenRouter in juli 2026. Tot drie pogingen per scenario en variant in pass 2; twee varianten waren slechts gedeeltelijk gevuld (de variant met opnieuw gegenereerde opdracht met 18 renders en de offline stap-voor-stap herhaling met 17, tegenover 27 voor de andere nieuw gerenderde varianten), en de vastgelegde basislijn is een eenmalige referentieset van negen documenten.

De beoordeling was blind en absoluut: elke beoordelaar zag de klantopdracht en één document, nooit de variant of het schrijfmodel, en kreeg de instructie om strikt JSON terug te geven met vijf sub-scores (correctheid, volledigheid, diepgang, citaties, eerlijkheid), een overall, een lijst met fabricagevlaggen en een éénregelige uitspraak. Twee beoordelaarsmodellen, dezelfde als de schrijvers. Pass 1 gebruikte een anti-zelfvoorkeurstoewijzing: de GLM-beoordelaar voor door Claude geschreven varianten en de Claude-beoordelaar voor door GLM geschreven varianten, omdat zelfvoorkeur bij LLM-beoordelaars gedocumenteerd is: Panickssery, Bowman en Feng toonden aan dat LLM-beoordelaars hun eigen generaties herkennen en bevoordelen (arXiv:2404.13076, 2024-04-15), en Zheng et al. catalogiseerden zelfversterkende, positie- en woordrijkheidsvooroordelen in LLM-as-a-judge-opstellingen (arXiv:2306.05685, 2023-06-09). Pass 2 paste beide beoordelaars toe op elke variant en middelde ze, wat een betere opzet is.

De hoofdfiguur van pass 1, uit de scorekaart: de gefocuste éénkeer-render scoorde 7,56 overall tegen 4,31 voor de stap-voor-stap-render van dezelfde opdracht op hetzelfde model. Een topologie-effect van 3,25 punten. De hoofdfiguur van pass 2: dat effect was 0,66, de vrije schrijfopdracht vanuit de taak was de beste variant, en de stap-voor-stap-ontwerp stond onderaan op kwaliteit en slechtst op eerlijkheid en fabricage. De methodologienota van het rapport verklaarde de kloof tussen de passes: het beoordelen van verschillende varianten met verschillende beoordelaars had absolute scores onvergelijkbaar gemaakt, omdat de GLM-beoordelaar ongeveer 1,5-2 punten meer toegeeflijk was dan de Claude-beoordelaar. "Vergelijk nooit absolute LLM-beoordelaarsscores tussen varianten die door verschillende modellen zijn beoordeeld" werd als les genoteerd. Het klonk goed. Het was niet wat de data zeiden.

Wat de rijen werkelijk bevatten

Op 2026-08-19 lazen we het ruwe beoordelingsbestand opnieuw, rij voor rij, in plaats van de scorekaart. Van de 446 unieke (scenario, variant, poging, beoordelaar)-rijen die in pass 2 waren vastgelegd (van de 466 geplande; 20 geplande beoordelingen hebben helemaal geen rij, wat de harness correct als mislukkingen registreerde en buiten elke gemiddelde hield), hadden 79 geen overall-sleutel, 18%. Ze splitsten zich in tweeën. Vijfenzestig rijen waren complete beoordelingen minus één veld: alle vijf sub-scores aanwezig, fabricagevlaggen aanwezig, de éénregelige uitspraak aanwezig, en geen overall. De beoordelaar had de JSON teruggegeven die we vroegen, met één sleutel weggelaten, de sleutel die toevallig tussen eerlijkheid en fabricage_vlaggen in het gevraagde schema stond. Veertien rijen waren JSON-objecten zonder rubrieksvelden, die de parser accepteerde omdat deze elk JSON-object accepteerde. De ontbrekendheid was niet gelijkmatig verdeeld over de beoordelaars: in onze run hadden 56 van de 229 rijen van de Claude-beoordelaar (24%) geen overall, allemaal van het gedeeltelijke type, en 23 van de 217 rijen van de GLM-beoordelaar (11%) hadden er geen, 9 gedeeltelijk en de 14 lege objecten. We hebben niet onderzocht waarom; onze beoordelaarsprompt, de JSON-modusafhandeling op de route die we gebruikten en de 1.200-tokenuitvoerlimiet zijn allemaal kandidaten, en het percentage is een eigenschap van onze oproep, niet een claim over een van de leveranciers.

De aggregator voerde vervolgens het natuurlijke TypeScript-geval uit:

for (const d of dims) out[d] = Number(mean(js.map((r) => Number(r[d]) || 0)).toFixed(2));

Een rij zonder overall werd een 0 in een kolom waar elke echte waarde tussen 1 en 10 lag, en de geldige verdeling was hard geclusterd aan de top (van de 367 geldige overall-scores waren 299 8 of hoger). Één nul in een cel van zestien verplaatst het gemiddelde met ongeveer een half punt op de scoreschalen die we observeerden. Acht nullen in een cel van zestien halveren het.

Hieronder staat de pass-2-scorekaart zoals gepubliceerd, naast dezelfde rijen met ontbrekende scores behandeld als ontbrekend. Beide beoordelaars, alle scenario's, overall op 1-10:

VariantGepubliceerde overallGeldige-rij overallGeldige beoordelaar n / beoordelaarsrijen
Stap-voor-stap opdracht render, vastgelegde basislijnuitvoer6,567,5014 / 16
Stap-voor-stap opdracht render, offline herhaling (GLM-5.2)6,128,0825 / 33
Éénkeer-opdracht render (GLM-5.2)6,788,0742 / 50
Éénkeer-opdracht render + reflectie (GLM-5.2)7,028,1444 / 51
Opnieuw gegenereerde opdracht + éénkeer-render (GLM-5.2)6,327,6828 / 34
Vrije schrijf vanuit opdracht (GLM-5.2)6,388,3040 / 52
Vrije schrijf + reflectie (GLM-5.2)6,087,7141 / 52
Éénkeer-opdracht render (Claude Opus 4.8)7,458,5946 / 53
Éénkeer-opdracht render + reflectie (Claude Opus 4.8)6,568,5340 / 52
Vrije schrijf vanuit opdracht (Claude Opus 4.8)7,538,4947 / 53

Elke gepubliceerde overall in deze tabel is het nul-opgevulde gemiddelde tot twee decimalen. De tien varianten die leken te variëren van 6,08 tot 7,53 variëren in werkelijkheid van 7,50 tot 8,59, een band van ongeveer één punt, en de top vier varianten zitten binnen 0,3 van elkaar. De gepubliceerde frameworkzware uitkomst, degene waarop het rapport het zwaarst leunde ("Claude vrij 8,06 versus opdracht 6,59; GLM vrij 7,19 versus opdracht 6,40"), wordt 9,06 versus 8,62 (16 en 13 geldige rijen) en 8,85 versus 8,73 (13 en 11). Een effect van 1,47 punten is 0,44; een effect van 0,79 punten is 0,12.

Pass 1 is het duidelijker geval. De 4,31 van de stap-voor-stap-variant kwam van zestien rijen van de Claude-beoordelaar waarvan er acht geen overall hadden; de acht die wel een score hadden, middelden 8,62. De 7,56 van de gefocuste variant kwam van achttien rijen met twee ontbrekend; de zestien geldige scoorden gemiddeld 8,50. Het 3,25-puntentopologie-effect dat de hele investering lanceerde, was op de rijen die een score droegen, minus 0,12.

De theorie die we op de bug bouwden

Dit is het deel dat de moeite waard is om te internaliseren, omdat de bug zelf saai is. Toen pass 2 de resultaten van pass 1 niet kon reproduceren, deden we wat zorgvuldige mensen doen: we zochten naar een mechanisme. Het anti-zelfvoorkeurontwerp betekende dat de door Claude geschreven en door GLM geschreven varianten in pass 1 waren beoordeeld door verschillende beoordelaars, de gedocumenteerde vooroordelen van LLM-beoordelaars maakten "de beoordelaars verschillen in strengheid" plausibel, en een scorekaart waar de door Claude beoordeelde varianten laag zaten en de door GLM beoordeelde varianten hoog, maakte het erop lijken dat het gemeten was. Dus schreven we een toegeeflijkheidsoffset van 1,5-2 punten op en een regel over het nooit vergelijken van absolute scores tussen beoordelaars.

De ruwe rijen laten ons toe die theorie direct te testen, omdat pass 2 beide beoordelaars dezelfde documenten liet beoordelen. Over de 148 (scenario, variant, poging)-paren waar beide beoordelaars een overall teruggaven, was het gemiddelde GLM-minus-Claude-verschil +0,12. Drieënzeventig paren waren identiek, 41 hadden GLM één punt hoger, 17 hadden Claude één punt hoger, en 17 verschilden twee of meer punten. In de pass-1-data was hetzelfde gepaarde verschil minus 0,06 over 72 paren. Onder de 148 complete paren is er geen teken van een 1,5-punt toegeeflijkheidsverschil. Wat er wel was: ontbrekendheid, in twee lagen. Tussen beoordelaars had 24% van de rijen van één beoordelaar geen overall tegenover 11% van de andere, en het anti-zelfvoorkeurontwerp plaatste de beoordelaar met het hogere percentage op elke door GLM geschreven variant, dus als familie verzamelden die varianten meer nullen, wat hun scores omlaag duwde in vergelijkingen tussen families. Binnen een beoordelaar varieerde de ontbrekendheid per variant: de twee varianten in de pass-1-hoofdfiguur waren beide door GLM geschreven en beide door Claude beoordeeld, en ze hadden acht versus twee rijen zonder overall. Het 3,25-puntentopologie-effect was nooit een vergelijking tussen beoordelaars. We hadden ontbrekendheid gelezen als strengheid, en de verklaring was voldoende bevredigend dat niemand het bestand opende.

Dat is de algemene vorm van de stille nul. Een ontbrekende waarde die wordt afgedwongen tot een getal ziet er niet uit als een fout; het ziet eruit als een lage score, en lage scores krijgen verklaringen. Een beoordelaar met een constante strengheidsoffset is een veel minder ernstig falen: de offset heft zich op in elke binnen-beoordelaar-vergelijking en verschijnt direct in een gepaarde controle. Een nul-opgevulde cel is niet consistent. Het schaalt met hoe vaak de parse faalde in die cel, en in onze data was dat percentage gecorreleerd met de variant.

Wat bleef staan

Niet alles in het rapport was fout, en de splitsing is leerzaam. De vijfenzestig gedeeltelijke rijen droegen nog steeds eerlijkheid en fabricage_vlaggen, dus die twee kolommen verloren alleen de veertien lege rijen. Herafgeleid op rijen met een geldige eerlijkheidswaarde, heeft de vastgelegde stap-voor-stap-basislijn nog steeds de laagste eerlijkheid (5,81 over 16 beoordelingen) en fabricagevlaggen op 16 van de 16, terwijl de variant van Claude's vrije schrijf de hoogste eerlijkheid heeft (9,75 over 52) en vlaggen op 1 van de 52. Die kloof is reëel. De kwaliteitsrangschikking loste grotendeels op in een één-puntband, en de claim dat "vrij schrijven beter is dan opdracht-renderen" ging van een hoofdfiguur naar +0,23 overall voor GLM-5.2 (8,30 tegenover 8,07) en -0,10 voor Claude Opus 4.8 (8,49 tegenover 8,59). De claim dat "reflectie schaadt" hield stand voor de GLM-vrije schrijf (7,71 met reflectie tegenover 8,30 zonder) en was een wash voor de Claude-opdracht-render (8,53 tegenover 8,59). We hebben de ablatie niet opnieuw uitgevoerd; de conclusies die het rapport trok worden herafgeleid uit de geldige rijen, en de methodologielessen die we werkelijk leerden staan hieronder.

Er is ook een compliance-lezing van dit verhaal, en die is niet louter decoratief. ISO/IEC 27001:2022 Artikel 9.1 b) vereist dat een organisatie de methoden voor monitoring, meting, analyse en evaluatie op een manier vaststelt die geldige resultaten waarborgt, en stelt dat de geselecteerde methoden vergelijkbare en reproduceerbare resultaten moeten opleveren om als geldig te worden beschouwd (ISO/IEC 27001:2022, Artikel 9.1, editie 2022-10). Een interne auditor die ontdekt dat een ISMS-prestatiedashboard blanco cellen als nul heeft gemiddeld, kan een non-conformiteit tegen dat artikel aanvoeren. Een evaluatiescorekaart die een architectuurbeslissing aandrijft, is analoog een meetmethode in dezelfde zin, en wij hielden het op een lagere standaard dan we voor een klant zouden hanteren.

Beperkingen

Dit is een heraggregatie van de beoordelingen die we al hadden, geen nieuwe run, en de geldige-rijaantallen erven elke beperking van de originele: negen scenario's, tot drie pogingen, gehele scores van twee LLM-beoordelaars geclusterd op 8-9, geen significantietesten, en een beoordelaar die zelf een model is. Geldige-rijcellen variëren van 14 tot 47 beoordelingen per variant over alle scenario's en van 4 tot 16 op de frameworkzware subset; de geldige scores hebben een standaardafwijking van 1,36, dus een naïeve rij-niveau standaardfout van een volledige-variant-gemiddelde (1,36 gedeeld door de wortel van n, zonder rekening te houden met het feit dat beoordelaars gepaard zijn en pogingen clusteren per scenario) is ruwweg 0,2 tot 0,4, en we lezen verschillen onder ongeveer een half punt tussen varianten als gelijkspel. De overall-vervalpercentages zijn wat we observeerden op onze prompt via één route in juli 2026, met een 1.200-tokenlimiet en JSON-modus aangevraagd; we hebben de oorzaak niet geïsoleerd en weten niet of het stabiel is. Het gepaarde beoordelaarverschil van 0,12 is specifiek voor deze rubriek en deze documenten. Geen van deze beperkingen verandert het centrale feit, dat niet afhankelijk is van een van deze kanttekeningen: de gepubliceerde overall-kolom werd berekend met 18% van de rijen afgedwongen tot nul, en de twee bevindingen die daarop werden gebouwd, overleven niet als we die verwijderen.

De stille nul, en een checklist

De kern van de zaak: in een LLM-beoordeelde evaluatie is een beoordelaarsoproep die geen score teruggeeft geen datapunt, en elke aggregator die het kan omzetten in één zal dat uiteindelijk doen in de cel waar het het meest uitmaakt. Beoordelaarsvooroordelenmitigaties zijn het waard om uit te voeren, en ze zijn waardeloos tot je je nullen hebt geteld. Als je een evaluatie uitvoert waarbij een model modeluitvoer beoordeelt, test dit er dan tegenaan:

  • Dwing nooit een ontbrekende score af. Number(x) || 0, x ?? 0, fillna(0) op een scorekolom: dit alles zet een afwezige beoordeling om in een score onder het minimum van de rubriek, slechter dan elke beoordeling die de rubriek toestaat. Behandel ontbrekend als ontbrekend (pandas slaat NaN standaard over bij een gemiddelde; onze handgemaakte reducer deed dat niet) en laat de scorekaart luid falen als een cel minder geldige tellingen heeft dan je vooraf hebt geregistreerd.
  • Druk geldige n af naast elk gemiddelde. Een cel die "4,31" leest en een cel die "4,31 (8/16)" leest, zijn verschillende claims. Onze scorekaart drukte n af als de rijteller, wat verborg dat de helft van één variant geen score had.
  • Valideer de uitvoer van de beoordelaar tegen het schema en herhaal. Een JSON-object is geen beoordeling. Vereis elk gescoorde veld, verwerp en herhaal bij een misser, en log het misserpercentage per beoordelaar en per variant. Een misserpercentage dat verschilt per beoordelaar of per variant is op zichzelf een bevinding, en in ons geval was het de bevinding.
  • Voordat je theorieën formuleert over beoordelaarsvooroordeel, bereken het gepaarde verschil. Als twee beoordelaars dezelfde documenten hebben beoordeeld, is het verschil op die paren het scoringsverschil tussen hen op die taak. Het onze was 0,12 op complete paren. Een verhaal van 1,5 punten dat je niet uit gepaarde rijen haalt, is een verhaal.
  • Behandel een onwaarschijnlijke effectgrootte als een datafout eerst. Een swing van 3,25 punten tussen twee renders van dezelfde opdracht op hetzelfde model, met scores geclusterd op 8-9 en zestien tot achttien rijen per variant, was onwaarschijnlijk groot ten opzichte van de waargenomen verdeling en had ons naar de rijen moeten sturen voordat we op zoek gingen naar een mechanisme.
  • Als je beoordelaars per variant wisselt, wissel je ook hun faalmodi. Anti-zelfvoorkeurtoewijzing is een verdedigbaar ontwerp, maar elke beoordelaarspecifieke fout (parsefouten, afkappingen, weigeringen) is dan geconfound met de behandeling. Elke beoordelaar op elke variant toepassen is veiliger, en het redt je nog steeds niet van nullen.
  • Herafleiding de hoofdfiguur uit het ruwe bestand voordat het rapport een theorie schrijft. De scorekaart is een view. De rijen zijn het bewijs. Ons rapport citeerde de scorekaart, verklaarde zijn eigen artefact met een mechanisme, en spelde dat mechanisme als les op. Het mechanisme was een ontbrekende sleutel.

Alle bovenstaande cijfers zijn onze eigen metingen op onze eigen synthetische GRC-testopstellingen (een fictieve startup, geen klantdata), schrijvers en beoordelaars z-ai/glm-5.2 en anthropic/claude-opus-4.8 zoals aangeboden via OpenRouter voor zowel renderen als beoordelen, ablatie afgerond op 2026-07-17, hergeaggregeerd uit de vastgelegde beoordelingen op 2026-08-19.

Gerelateerde artikelen