ISMS Copilot
Engineering

Waarom we compliancefeiten niet dedupliceren op basis van gelijkenis

In onze memory-dedup-evaluatie bedroegen tegenstrijdigheden gemiddeld 0,938 cosinus naar hun dichtstbijzijnde opgeslagen feit, en echte duplicaten 0,940. Er was geen enkele drempel die de paren die niet samengevoegd mochten worden duidelijk scheidde van de paren die dat wel moesten. Cosinus maakt dus nooit de samenvoegbeslissing in onze pipeline.

door ISMS Copilot··9 min read
Waarom we compliancefeiten niet dedupliceren op basis van gelijkenis

Een algemene gelijkenisscore beantwoordt één vraag goed: gaan deze twee uitspraken over hetzelfde onderwerp? Op het model dat we hebben gemeten, beantwoordde het niet de vraag die een geheugen van compliancefeiten daadwerkelijk nodig heeft: zijn deze twee uitspraken met elkaar in overeenstemming? We hebben de kloof gemeten in onze eigen data, en het is geen marge die je kunt wegstemmen. In onze memory-dedup-evaluatie bedroegen echte duplicaten gemiddeld 0,940 cosinus naar hun dichtstbijzijnde opgeslagen feit, en directe tegenstrijdigheden 0,938. Er was geen enkele globale drempel in die data die de herformuleringen die we wilden onderdrukken duidelijk scheidde van de tegenstrijdigheden die we niet mochten samenvoegen. We noemen dit de aboutness-val, en het is de reden dat cosinus in onze pipeline nooit de samenvoegbeslissing maakt.

De mislukking is stil en eenzijdig. Een gemiste deduplicatie laat een redundante rij achter, wat cosmetisch is. Een valse samenvoeging onderdrukt één van twee feiten die het oneens zijn, en als het feit dat wordt onderdrukt luidt "MFA is niet afgedwongen voor alle gebruikers", dan houdt een auditgerichte assistent nu het tegenovergestelde van de waarheid vast. We behandelen deze twee fouten als categorisch verschillend, en het hele ontwerp volgt uit die asymmetrie.

De meting

De evaluatie voert het echte backendbeslissingspad uit (dezelfde evaluateCandidate die de pipeline gebruikt) over een adversariale, synthetische, PII-vrije dataset met GRC-uitspraakparen. Elk paar is gelabeld met de relatie: een herformuleerde duplicaat die onderdrukt moet worden, of één van drie soorten die niet samengevoegd mogen worden: een verschillend feit dat op één token verschilt, een directe tegenstrijdigheid, of een scope-verfijning. Referentie: 25 juni 2026, mistral-embed (het v23.12-model achter de alias) voor de vectoren en een kleine Mistral-judge (mistral-small-2603, temperatuur 0) voor de beslissing, 261 paren, 522 modelaanroepen, ongeveer $0,036.

Het deel dat het bekijken waard is, is de inbeddingsstudie. Gemiddelde cosinus van de kandidaat naar zijn dichtstbijzijnde opgeslagen feit, per relatie (mistral-embed v23.12, uitvoering 25 juni 2026):

relatiegemiddelde cosinusn
duplicaat0,94010
tegenstrijdigheid0,9387
niet-duplicaat (één-token)0,902239
verfijning0,8475

Kijk naar de bovenste twee rijen. De gemiddelde tegenstrijdigheid ligt 0,002 onder de gemiddelde herformulering van hetzelfde feit. Het enkele woord dat de waarheidswaarde omkeert ("niet") verplaatst de vector nauwelijks, omdat beide zinnen overweldigend gaan over het afdwingen van MFA, en op dit model volgt nabijheid dat gedeelde onderwerp veel meer dan de ontkenning.

De niet-duplicaatfeiten met één-token verschil zijn bijna net zo dichtbij. "We hebben een SOC 2 Type 1-rapport afgerond" versus "Type 2" is geen pietluttigheid: een Type 1-rapport behandelt de geschiktheid van de controleontwerpen op een bepaalde datum, terwijl een Type 2-rapport ook de effectiviteit van de werking behandelt gedurende een bepaalde periode (AICPA, SOC 2-rapportagegids). Als je deze samenvoegt, vertel je een potentiële klant dat je bewijs hebt dat je niet hebt. In een end-to-end-test tegen de echte modules, werden "SOC 2 Type 1" en "Type 2" inbedd met 0,961 cosinus, boven het gemiddelde van echte duplicaten in de tabel. Dat ene voorbeeld is het belangrijke: een paar dat nooit samengevoegd mag worden, scoort hoger dan het gemiddelde paar dat dat wel mag. De niet-duplicaatklasse als geheel had een gemiddelde van 0,902.

Waarom een enkele drempel ze niet scheidt

De instinctieve reactie, zodra je ziet dat een duplicaat hoog scoort, is om een samenvoegdrempel net onder die score in te stellen. Onze data pleit hiertegen op twee manieren. De klassenmiddens scheiden niet: 0,940 voor duplicaten en 0,938 voor tegenstrijdigheden zijn, voor doeleinden van drempelinstelling, hetzelfde getal. En we hebben een concreet tegenvoorbeeld boven dat getal, het Type 1 versus Type 2-paar op 0,961, een moet-niet-samengevoegd voorbeeld dat hoger scoort dan het gemiddelde echte duplicaat. Een globale cut die laag genoeg is om alledaagse herformuleringen te onderdrukken, zou op deze data ook feiten onderdrukken die we hebben gemeten en die uit elkaar moeten worden gehouden. We beweren niet te hebben bewezen dat er voor geen enkel dataset of model een scheidende grens kan bestaan. We rapporteren dat op deze adversariale GRC-set, met dit inbeddingsmodel, geen enkele globale cosinusdrempel de veilige-samenvoegparen scheidde van de fatale-samenvoegparen.

Dus inbeddingen doen één taak in onze pipeline: retrieval. De cosinusvloer is 0,55, opzettelijk laag, en hij bestaat alleen om te bepalen welk opgeslagen feit het waard is om de kandidaat mee te vergelijken. Hij beslist niet of er samengevoegd moet worden. Zodra de dichtstbijzijnde buur is opgehaald, wordt de beslissing genomen door een mechanisme dat kijkt naar de tokens waar cosinus onder gewicht heeft.

De architectuur die tegenstrijdigheden uit elkaar houdt

Twee lagen, en de deterministische laag is autoritair.

Ten eerste, een deterministische controle op beschermde tokens. We vergelijken de kandidaat met zijn opgehaalde buur voor de tokens die compliancebetekenis dragen: ontkenning ("niet", "niet meer"), kwantificatoren en scope ("alle", "alleen", "beheerders"), jurisdicties en regio's, frameworkversies, SOC 2-typen, getallen en eenheden. Een eenzijdig verschil in een beschermde klasse blokkeert de samenvoeging, en het overschrijft de judge wat de judge ook retourneert. "MFA is afgedwongen" versus "MFA is niet afgedwongen" wordt geblokkeerd door de ontkenningsregel, ongeacht hoe vergelijkbaar ze eruitzien.

Ten tweede, een conservatieve judge. Het model moet 0,8 zekerheid bereiken om een kandidaat als duplicaat te onderdrukken; onder die waarde houdt het beide rijen vast. Het is geneigd om vast te houden, omdat de twee foutrichtingen niet symmetrisch zijn: een behouden duplicaat is cosmetisch, een samengevoegde tegenstrijdigheid is corruptie.

De poort die het systeem moet passeren: nul valse samenvoegingen op de 251 moet-niet-samengevoegde paren. Het heeft die gehaald, nul waargenomen valse samenvoegingen. Als vuistregel is 3/251 ongeveer 1,2%, maar op een vaste, gecureerde set is dat een heuristiek, geen echte betrouwbaarheidsgrens en geen productiegarantie. De eigenschap waarop we ons daadwerkelijk verlaten is smaller en steviger: de deterministische controle alleen, zonder model in de lus, blokkeerde alle 251, dus de vloer wordt vastgehouden door code die je kunt lezen in plaats van een model dat je moet vertrouwen.

Wat de judge misleidde

Het eerlijke deel. Een opvolgopschonings-evaluatie twee dagen later, 27 juni 2026, bracht één valse samenvoeging aan het licht die een eerdere versie van de controle miste: "SSO is beschikbaar voor zakelijke klanten" versus "SSO is beschikbaar voor alle klanten". Het model oordeelde dat de bredere uitspraak een onschuldige verfijning was van de smallere en voegde ze samen. Het is de aboutness-val één niveau hoger: de twee zinnen gaan bijna volledig over de beschikbaarheid van SSO, en de judge, net als de inbedding, gaf minder gewicht aan de kwantor die veranderde voor wie het feit geldt. De oplossing was om een eenzijdige verandering in een scope-dragende klasse (kwantificatoren, onderwerpen, ontkenning, modaliteit) in de deterministische controle te plaatsen in plaats van het aan de judge over te laten, plus een expliciete toepassings-scope-regel in de judge-prompt als verdediging in de diepte. Na de fix toonde die evaluatie nul valse samenvoegingen, 18 van de 18 verschillende paren uit elkaar gehouden, en 8 van de 8 echte duplicaten teruggevonden.

Het patroon herhaalt zich over de lagen. De inbedding geeft structureel minder gewicht aan ontkenning en scope op dit model. De judge geeft er zachtjes minder gewicht aan. De laag die ze betrouwbaar ving in onze runs is de laag die de exacte tokens benoemt die een compliancefeit omdraaien, en die laag is deterministische code, geen ander model dat gevraagd wordt om voorzichtig te zijn.

Beperkingen

Dit is een kwaliteitsbeslissingspoort over gelabelde paren, één kandidaat tegen zijn gematchte buur, geen grootschalige retrievalbelastingstest, en de tegenstrijdigheids- en verfijningklassen zijn klein (7 en 5 paren), dus hun gemiddelden zijn indicatief, geen strakke schattingen. De cosinuswaarden zijn specifiek voor mistral-embed v23.12 op deze GRC-zinnen; een ander inbeddingsmodel zou ze verschuiven, en de ontkenning-ongevoeligheid die we waarnamen is specifiek voor het model dat we hebben gemeten, geen wet van gelijkenisinbeddingen. Contrastief getrainde modellen kunnen worden afgestemd om tegenstrijdigheden uit elkaar te duwen, door ze als harde negatieven te gebruiken (SimCSE, EMNLP 2021), dus de juiste lezing is "meet je eigen model", niet "inbeddingen kunnen dit nooit". De duplicaatrecall in de dedup-run was 0,5, vijf van de tien echte duplicaten onderdrukt. Dat is de prijs die we hebben gekozen: de judge houdt beide rijen vast zodra hij onzeker is, dus recall is de hefboom die we afstellen terwijl de waargenomen vals-samenvoegteller op nul blijft. We geven er de voorkeur aan om een paar redundante echte feiten te dragen dan ooit twee die het oneens zijn samen te voegen.

De aboutness-val, en een checklist

De les om mee te nemen uit dit verhaal: op het model dat we hebben gemeten, betekende een hoge gelijkenisscore dat twee uitspraken over hetzelfde onderwerp gingen, niet dat ze het met elkaar eens waren, en deduplicatie vereist instemming. Wanneer een dergelijk geheugen gedocumenteerde informatie is waarop een ISMS vertrouwt, vereist ISO/IEC 27001:2022 Artikel 7.5.3 dat het wordt beschermd tegen verlies van integriteit (ISO/IEC 27001:2022, Artikel 7.5.3, editie 2022-10); als een stille samenvoeging een vereist record onnauwkeurig maakt, is dat een verlies van integriteit in die zin. Als je een geheugen of kennislaag bouwt met semantische deduplicatie, voer dan deze test uit:

  • Meet de verdeling, ga niet uit van aannames. Inbed labelduplicaten, tegenstrijdigheden en bijna-verschillende paren uit je eigen domein, op je eigen model, en kijk naar de cosinus per relatie. Als de tegenstrijdigheidsscores overlappen met de duplicaatsscores, zal geen enkele drempel boven die score ze scheiden.
  • Gebruik inbeddingen voor retrieval, niet voor de samenvoegbeslissing. Een lage cosinusvloer om een vergelijkingsbuur te kiezen is prima. Het gebruik van dezelfde score om een samenvoegbeslissing te nemen is hoe een tegenstrijdigheid stilletjes wordt verwijderd.
  • Plaats een deterministische controle voor de samenvoeging. Benoem de tokens die betekenis omdraaien in je domein (ontkenning, kwantificatoren, scope, versies, jurisdicties, eenheden) en laat een eenzijdige verandering in een van deze klassen de samenvoeging blokkeren, ongeacht wat de judge retourneert.
  • Maak de judge conservatief en asymmetrisch. Neig ernaar om beide rijen vast te houden. Bepaal welke fout cosmetisch is en welke corruptie, en laat het model nooit de tweede opofferen om de eerste te vermijden.
  • Houd vast aan nul van de fatale fout, pas de recall apart aan. Houd valse samenvoegingen op nul als de poort; verbeter de duplicaatrecall tegen dezelfde poort zonder de vloer te verlagen.
  • Neem de bijna-missers op in je dataset. Het paar dat de scope verbreedt en als een verfijning klinkt, is het paar dat wordt samengevoegd. Uitgeschreven getallen, kleine letters in afkortingen en kwantorwissels zijn waar een judge stilletjes faalt.

Alle bovenstaande cijfers zijn onze eigen metingen op onze eigen synthetische GRC-fixture, mistral-embed v23.12 en mistral-small-2603 bij temperatuur 0, gedateerd 25 juni 2026 en 27 juni 2026. De dataset bevat geen klantgegevens.

Gerelateerde artikelen