De woordenschatbotsing: wanneer een veiligheidsklasseerder je hele domein flagt
Een generiek moderatieklasseerder gaf 15 van de 15 berichten verkeerd aan over een periode van 17 dagen in ons complianceproduct. Onze gebruikers bespreken immers bedreigingen voor hun werk. De oplossing verplaatste het risico in plaats van het te verwijderen.

Een generiek veiligheidsklasseerder draagt een verborgen aanname met zich mee: dat gesprekken over aanvallers, exploits en witwassen zeldzaam en verdacht zijn. Richt je zo’n klasseerder op een security- en complianceproduct en die aanname keert zich om. Over een productievenster van 17 dagen dat eindigde op 10 april 2026 gaf Mistral’s mistral-moderation-latest-alias (destijds verwijzend naar de gepinde mistral-moderation-2603) 15 berichten in onze app aan als schadelijk. Elk bericht was een vals positief. De precisie was nul. Niet verslechterd, niet ruisig: nul van de vijftien.
Dit is een specifiek, gemeten resultaat op ons eigen verkeer en het benoemt een faalmodus die onzichtbaar blijft tot je de vlaggen één voor één leest. We noemen het de woordenschatbotsing: in een specialistisch domein is de gevaarlijke woordenschat van de klasseerder de werkwoorden van het domein zelf. Het signaal dat zeldzaam zou moeten zijn, wordt de basisratio.
De vlaggen
Van de 15 vlaggen vielen er 14 in de categorie dangerous_and_criminal_content van de klasseerder en 1 in violence_and_threats. Toen we ze teruglazen, was het patroon direct duidelijk. Het betrof allemaal legitieme GRC-discussies:
- Reverse engineering van cloudproviderservices, in de context van intellectuele-eigendomsverplichtingen. ISO/IEC 27001:2022 Annex A controle A.5.32 luidt letterlijk "Intellectual property rights"; een gebruiker die deze controle uitvoert, moet praten over reverse engineering om erover te redeneren.
- Een risicobeoordeling geschreven in het Spaans, waar "amenazas" (bedreigingen) het gewone woord is voor hetgeen elke risicoregister opsomt.
- Anti-witwaswerk, waar "blanqueo" (witwassen) het onderwerp is, niet een bekentenis.
- Red teaming en penetratietestervaring.
- DAST, dynamisch scannen van een applicatie op kwetsbaarheden.
Geen van deze zaken is criminele content. Het is de dagelijkse woordenschat van infosec-professionals, compliance officers en auditors. De klasseerder is niet defect. Op algemeen webverkeer is een bericht over het reverse engineering van een leverancierssysteem een plausibel zwak gevaarssignaal, en een generiek klasseerder is gebouwd om het als zodanig te behandelen. Onze gebruikers vormen de populatie voor wie datzelfde signaal het tegenovergestelde betekent. We zouden deze faalvorm verwachten van elke generieke klasseerder die op dezelfde manier wordt gebruikt, omdat het voortkomt uit de generieke benadering in plaats van uit de implementatie van één leverancier. De fout lag bij ons: we behandelden een algemene a priori als domeinbewust.
Overblokkeren is geen veilige standaard
De reflex is om vals positieve resultaten te zien als de onschuldige kant van de precisie-recall-trade-off. Een echte dreiging missen en je hebt een veiligheidslek; te veel vlaggen en je hebt, in het slechtste geval, wat ruis. In productie had de ruis tanden, en het is de moeite waard om concreet te zijn over de secundaire kosten, want daar zat de echte schade:
- Alertmoeheid versloeg het net. Elk bevestigd event stuurde een e-mail naar onze security-inbox. Vijftien opeenvolgende valse alarmen leerden het team om moderatiealerts te negeren. Een veiligheidsnet waar iedereen heeft geleerd op te negeren, is geen veiligheidsnet.
- Een recht-op-verwijderingsprobleem. Geflagde threads werden vergrendeld tegen verwijdering, zodat bewijs niet kon worden vernietigd. Dat is redelijk voor echt misbruik. Toegepast op een vals positief betekende het dat een gebruiker zijn eigen compliancegesprek niet kon verwijderen, wat een risico op GDPR Artikel 17 (recht op verwijdering) creëerde. Dat recht, onderworpen aan zijn eigen voorwaarden en uitzonderingen, dekt selectieve verwijdering, niet alleen het sluiten van een account.
- Een ongefundeerd label. Goedaardige gebruikersberichten zaten in een opslag waarvan de semantiek "gevaarlijk en criminele content" was. Dat is een bewering over een persoon waar we niet achter konden staan.
Precisie, niet recall, was de metriek die ons pijn deed, en de mislukking was niet cosmetisch.
Waarom de voor de hand liggende oplossingen niet werken
Twee oplossingen suggereren zichzelf aan en beide zijn verkeerd.
Stem de klasseerder af. Dat kan niet. Het moderatie-eindpunt is een vaststaande klasseerder. De API accepteert een modelidentificatie en een invoertekst en retourneert categoriewaarden. Er is geen systeemprompt, geen instructieveld, geen plek om te zeggen "dit is een complianceproduct". Een vaste klasseerder geeft je een draaiknop zonder cijfers.
Schakel de ruisige categorieën uit. Het uitschakelen van dangerous_and_criminal_content en violence_and_threats zou elke valse positief die we hadden gezien verwijderen. Het zou ook de enige categorieën verwijderen waaronder een echte dreiging in ons domein ooit naar boven zou komen. Dat is geen kalibratie, het is het net uitzetten en de stilte succes noemen.
De tweefasenoplossing
Houd de snelle klasseerder aan als fase één; deze draait nog steeds op elk bericht. Wanneer het iets flagt, geef het bericht door aan een tweede-rechter: een klein chatmodel (Mistral Small) met een systeemprompt die de legitieme infosec- en complianceonderwerpen beschrijft waar onze gebruikers daadwerkelijk over praten. De rechter retourneert één van twee vonnissen: BEVESTIGD of VALS_POSITIEF.
Alleen BEVESTIGD-events stromen door naar het alert-en-vergrendelpad. VALS_POSITIEF-events gaan naar een aparte onderdrukte opslag, bewaard voor audit en driftdetectie maar met nul gebruikersgevolgen: geen e-mail, geen vergrendeling voor verwijdering, geen crimineel label. De rechter vuurt ongeveer één keer per dag op een geflagd bericht, dus de toegevoegde kosten zijn verwaarloosbaar. En hij faalt gesloten: als de rechter een fout maakt, tijd uitvalt of iets anders retourneert dan een schoon vonnis, wordt het bericht behandeld als BEVESTIGD. De ergste situatie is de oude ruisige basislijn, nooit een stilzwijgend weggelaten dreiging.
Geïmplementeerd op 10 april 2026 bracht dit onze vals-positiefratio op die vlaggen van 15 van de 15 terug naar nul, zonder één categorie uit te schakelen.
De valkuil: we verplaatsten het risico, we verwijderden het niet
Dit is het deel dat de moeite van het meenemen waard is, omdat het verder gaat dan moderatie. Het toevoegen van een soepele tweede fase verwijdert risico niet. Het verplaatst het, van een faalmodus die je kunt zien naar een faalmodus die je niet kunt zien.
Voorheen was de faalmodus overblokkeren, en die was luid: elke valse positief deed de alarmbel rinkelen. Daarna werd de dominante faalmodus dat de rechter te soepel is en iets stilzwijgend doorlaat wat hij had moeten bevestigen. Die faalmodus is stil bij constructie. Het schrijft naar een opslag waar niemand een e-mail over ontvangt.
We kregen een levende demonstratie van hoe desoriënterend het stille regime is. Op 14 april 2026, vier dagen na de fix, stopten de moderatie-alarmemails volledig. Van buitenaf is een plotselinge nul niet te onderscheiden van een kapotte pijplijn: de klasseerder die open faalt, een storing, een weggevallen trigger. Het kostte het lezen van de onderliggende data om "gezond en stil" te onderscheiden van "stilzwijgend donker". Toen we leesrechten hadden op de onderdrukte opslag, auditteerden we elk Mistral Small-oordeel dat zich daar sinds de implementatie van 10 april 2026 had opgehoopt: 40 onderdrukte rijen, en naar onze lezing was geen enkele een echte dreiging die ten onrechte werd weggelaten. Het bevestigde pad klopte exact over dezelfde periode: 23 bevestigde events op 23 alarmemails. Het net was intact. Maar de enige manier om dat te weten was door het ding dat stil was geworden te auditen.
De tweede fase heeft dus zijn eigen evaluatie nodig, op zijn eigen schema. De onderdrukte opslag wordt nu maandelijks steekproefsgewijs gecontroleerd op over-soepelheid van de rechter, en een goedkope dagelijkse telling op de bevestigde tabel houdt in de gaten of de pijplijn stilvalt. De les is niet "voeg een LLM-rechter toe". Het is: wanneer je een zichtbaar falen repareert met een stillere component, budget dan voor het auditen van het stille, anders heb je een probleem dat je kunt meten ingeruild voor een probleem dat je niet kunt zien.
Een draagbare checklist
Als je een generiek klasseerder draait over een specialistisch corpus—medisch, juridisch, security, financieel of compliance—controleer dan voordat je de output vertrouwt:
- Controleer op een woordenschatbotsing. Maak een lijst van de normale werkwoorden in je domein. Als die woorden overlappen met de gevaarlijke categorieën van de klasseerder, is de precisie op jouw verkeer een open vraag, geen aanname. Meet het.
- Lees de vlaggen, tel ze niet alleen. Een precisiecijfer verbergt het patroon; de individuele vals positieve resultaten onthullen het. Vijftien vlaggen vertelden ons niets tot we vijftien vlaggen lazen.
- Beprijz overblokkeren eerlijk. Traceer wat een vals positief downstream triggert. Alertmoeheid, een vergrendeling voor verwijdering die botst met een wettelijk recht op verwijdering, een label dat je niet kunt onderbouwen. Overblokkeren is zelden gratis.
- Als de klasseerder vaststaat, wikkel hem dan in, vecht er niet tegen. Wanneer je het model niet kunt instrueren, voeg dan een domeinbewuste fase eromheen toe in plaats van categorieën in hun geheel uit te schakelen.
- Laat de wrapper gesloten falen. Een fout van de rechter moet escaleren, nooit onderdrukken, zodat een storing in de wrapper het net niet stilzwijgend kan openbreken.
- Geef de stille fase zijn eigen audit. Elke component die stilzwijgend onderdrukt moet een geplande review krijgen van wat het heeft onderdrukt, plus een levendigheidstest die "gezond en stil" onderscheidt van "donker".
Beperkingen
Dit is één product, één domein en een kleine steekproef: 15 vlaggen over een enkel 17-daags venster dat eindigde op 10 april 2026, plus 40 onderdrukte rijen in de weken erna. Het is een momentopname op de mistral-moderation-latest-alias zoals die in dat venster werd opgelost, geformuleerd als onze eigen meting op ons eigen verkeer. Het is geen algemene bewering over de kwaliteit van die klasseerder buiten ons domein. De foutratio van de rechter zelf is begrensd door de gesloten-foutstandaard, maar is niet nul—en dat is precies waarom hij wordt geaudit in plaats van vertrouwd. Waarin we zeker zijn, is het mechanisme: wanneer de gevaarlijke woordenschat en de domeinwoorden dezelfde woorden zijn, is de precisie van een generiek klasseerder een meting die je moet nemen, geen eigenschap die je kunt aannemen.
Gerelateerde artikelen

De verzadigingsval: wanneer je evaluatiebasis te goed is om te meten
Bij een rechtstreekse vergelijking (14 taken, 2026-06-11) scoorde onze basislijn met één beurt 0,984 en gelijkde 13 van de 14 taken, waardoor een uitdager die nooit slechter presteerde een winpercentage van 7,1% behaalde tegen een 60%-scheidingsdrempel. De drempel mat niet langer de uitdager, maar de taken zelf.

Zelfherstellende metrics: wanneer een groene evaluatie een echte regressie verbergt
Bij onze multi-document diepte-evaluatie (2026-06-04, GLM-4.7) scoorde een clausule-mappingsmetriek bijna perfect 1.0, terwijl de per-documentanalyse van het model daalde naar ongeveer een derde van de standalone diepte. De voor de hand liggende metriek was degene die loog.
