
Het wetsartikel was echt. Het antwoord was toch illegaal.
Het eerste antwoord dat ik ooit een overheidschatbot zelfverzekerd en fout zag geven ging over een Section 8-huursubsidiebon.
Een verhuurder vraagt, in gewone woorden, of hij een huurder mag weigeren die de huur met een huursubsidiebon zou betalen. Het juiste antwoord is nee. Weigeren is discriminatie op basis van inkomstenbron onder NYC Admin. Code § 8-107(5), en de Human Rights Commission van de stad kan civiele boetes opleggen tot $250.000 voor een opzettelijke overtreding. Dit is geen strikvraag. Het is gevestigd recht. En in oktober 2023 vertelde New York City's eigen MyCity-bot, draaiend op Azure AI, bedrijfseigenaren en verhuurders precies het tegenovergestelde. The Markup documenteerde het in maart 2024: de bot zei dat verhuurders houders van huursubsidiebonnen mochten weigeren, dat winkels contantloos mochten worden, dat werkgevers een deel van de fooien van hun werknemers mochten inhouden. Elk van die antwoorden was illegaal, en elk droeg het zegel van de stad op een .gov-domein.
Ik bouwde CivicCite niet omdat een model hallucineerde. Ik bouwde het vanwege de antwoorden die bijna goed waren, en ik wil je vertellen over het ene dat veranderde hoe ik over het hele probleem denk. Als je het ding zelf wilt zien, staat het hier: veriprajna.com/nl/demos/overheids-ai-die-de-wet-citeert-of-zwijgt. Het corpus is een synthetische-maar-getrouwe demo-graaf, geen juridisch advies. Maar het mechanisme is echt, en het mechanisme is het deel waarover het loont te discussiëren.
Het moment dat bleef hangen was niet de bot die een wet verzon. Het was mijn eigen pijplijn die het juiste wetsartikel ophaalde en toch het foute antwoord opstelde.
De week die ik besteedde aan retrieval toevoegen aan een probleem dat retrieval niet kan raken
Ik begon precies zoals bijna iedereen in GovTech begint, overtuigd dat de fix voor een liegende chatbot beter ophalen was. Geef het model de echte gemeentelijke code. Veranker elk antwoord in een echte bepaling. Retrieval-augmented generation, het standaardantwoord op de standaardangst: dat het model dingen verzint. Het is een schoon verhaal, het demoot prachtig, en ik geloofde het langer dan ik had moeten doen.
Toen las ik de Stanford-cijfers en die vernielden het verhaal. Magesh en collega's, in een studie uit 2025 gepubliceerd via JELS, maten de twee doelgericht gebouwde juridische onderzoekstools die precies dit doen. Lexis+ AI hallucineerde bij 17% van de zoekopdrachten. Westlaws AI-Assisted Research hallucineerde bij 33%. Dit zijn geen speelgoedchatbots. Dit zijn systemen die eerst het wetsartikel ophalen en daarna genereren, gebouwd door bedrijven waarvan de hele business is om gelijk te hebben over de wet. Grofweg één op de drie antwoorden van de tweede tool was nog steeds fout. Ophalen verbeterde het concept. Het maakte het antwoord niet veilig om vrij te geven.
Ik wil eerlijk zijn over hoe dat voelde, want ik had net een week dezelfde architectuur gebouwd en me er slim over gevoeld. Mijn pijplijn ontleedde de vraag van de burger in atomaire juridische deelvragen, haalde kandidaat-bepalingen op uit een gemeentelijke-code-graaf, en dwong het model alleen te schrijven vanuit wat het had opgehaald. Bij de Section 8-vraag deed het alles goed tot de laatste stap. Het vond § 8-107(5). Het juiste wetsartikel. Het haalde de exacte tekst over rechtmatige inkomstenbron. En toen stelde het een zin op die in wezen zei: ja, je mag de huursubsidiebon weigeren.
De juiste wet. Het foute antwoord. Bovenop elkaar in hetzelfde concept.
Ophalen geeft het model het juiste wetsartikel. Het doet niets om te voorkomen dat het model dat wetsartikel achterstevoren leest.
Dat was de week dat het probleem van vorm veranderde voor mij. Ik had hallucinatie als de vijand behandeld, en hallucinatie is echt, maar het is de fout die je je kunt voorstellen te vangen. De fout die de MyCity-antwoorden daadwerkelijk uitzond is subtieler en erger: de juiste bepaling aangehaald, de verkeerde conclusie gesteld. Nergens in de zin een verzinsel. Niets voor een "heb je dit verzonnen"-filter om te vangen, want er was niets verzonnen. Alleen een zelfverzekerde verkeerde lezing van een wet die precies daar lag. Die faalmodus is onzichtbaar voor ophalen, want ophalen controleert alleen of het wetsartikel aanwezig is, nooit of de zin het de juiste kant op las.
Wat is erger, een verzonnen wet of een echte die verkeerd gelezen is?
Ik bleef bij die vraag terugkomen, en mijn antwoord werd steeds zekerder. De verzonnen wet is de veiligere mislukking.
Denk na over wat een burger met elk doet. Een overduidelijk verzonnen wetsartikel leest vreemd, citeert een codesectie die nergens op uitkomt, voelt niet goed. Een echt wetsartikel achterstevoren gelezen leest perfect. Het heeft een echt citaat. De sectie bestaat. Een verhuurder leest "ja, je mag de huursubsidiebon weigeren," ziet een echt codenummer eraan, en handelt ernaar. Nu is er een illegale weigering, een huurder met een discriminatieclaim, en een papieren spoor dat terugleidt naar een overheidsantwoord. Precies de juistheid van het citaat maakt de foute conclusie gevaarlijk. Het is de legitimatie waarmee het slechte advies binnenkomt.
Dus de check waar ik het meest om gaf was nooit "is dit citaat echt." Het was "ondersteunt dit citaat deze zin daadwerkelijk." In de pijplijn is die check entailment: gegeven de opgestelde claim en de exacte tekst van de aangehaalde bepaling, impliceert de tekst de claim, spreekt die tegen, of geen van beide. Bij het Section 8-concept wordt het "ja" van het model gevangen als tegengesproken door § 8-107(5), omdat de bepaling duidelijk het tegenovergestelde zegt. Daar sterft het concept. Wat overleeft, en wat de poort uiteindelijk vrijgeeft, is de gecorrigeerde claim: een verhuurder mag niet weigeren, en hier is het wetsartikel dat dat zegt.

Waar ik op stond, en de reden dat dat scherm bestaat, is dat entailment geen black box is die je moet geloven. Je kunt de Verify-fase openen en de ruwe input en output lezen: de opgestelde claim, de wettelijke tekst waartegen die is gecontroleerd, het label, en de reden in de eigen woorden van de bepaling. Een oordeel dat je niet kunt inspecteren is geen verificatie. Het is een second opinion met betere productiewaarden. Ik had al op de dure manier geleerd dat als je het ene model het andere laat scheidsrechteren, je twee modellen krijgt die het eens zijn — iets zwakkers dan het lijkt.
De zet die uiteindelijk werkte was stoppen met proberen het model betrouwbaar te maken
Ik herinner me de exacte herkadering, omdat het voelde als opgeven en bleek het hele ontwerp te zijn. Ik stopte met proberen het model betrouwbaar te maken en begon zijn betrouwbaarheid irrelevant te maken.
De verschuiving is deze. Het taalmodel in CivicCite is een adviseur. Het ontleedt de vraag, stelt een kandidaat-antwoord op, biedt een entailment-oordeel. Het mag nooit iets vrijgeven. Buiten het agent-framework, in gewone deterministische Python, zit iets wat ik de Wettelijke Besluitpoort noem, en die geeft een deelantwoord alleen vrij wanneer vier voorwaarden tegelijk gelden: het citaat bestaat, de bepaling is van kracht, de aangehaalde tekst impliceert de claim, en niets conflicteert ermee. Mis er één en het antwoord wordt niet verzonden. Twee van die checks zijn pure rekenkunde en logica. Van kracht is een datumvergelijking: de bepaling heeft geen intrekkingsdatum en de ingangsdatum ligt op of vóór de peildatum. Conflict is een graaflezing. Er is geen prompt, geen temperature, geen overtuigen.

Ik zeg nu constant twee zinnen. De ene is de agents adviseren, de poort beslist. De andere is dat een LLM zichzelf niet langs de poort kan stemmen, hoe zelfverzekerd zijn concept ook is. Dat doet er meer toe dan het klinkt, want de verleidelijke mislukking in dit hele veld is het model zijn eigen werk laten beoordelen en dat cijfer "verificatie" noemen. Een model dat het antwoord opstelt kan niet het ding zijn dat certificeert dat het antwoord veilig is. De poort is doelbewust dommer dan het model en doelbewust erbuiten, en dat is precies het punt. De intelligentie stelt voor. De code beschikt.
Het model is een goede schrijver en een slechte rechter. Dus laat ik het schrijven, en laat ik het nooit oordelen.
De demo is eerlijk over zijn randen, en ik ook. Het corpus is een synthetische-maar-getrouwe graaf van gemeentelijke code, geparafraseerd uit echte bepalingen, geen bron van gezag. De 311-escalatierouting wordt berekend en getoond, maar de connector naar een echt zaak-systeem is gestubd. De begrensde opstelling gebruikt een allowlist-validator en één her-vraag in plaats van productie token-level decoding. Wat echt is, is de beslissingslogica, en de beslissingslogica is het product.
Waarom ik stilte meer vertrouw dan een goed antwoord
Ik had niet verwacht trots te zijn op de demo die weigert te antwoorden, en nu is het mijn favoriete ding dat hij doet. Het duidelijkste voorbeeld is een foodtruck.
Een verkoper vraagt of hij zijn truck de hele dag op een parkeerplaats met meter mag laten staan onder de algemene verkopersparkeerregel. De gewone assistent antwoordt vrolijk en fout, en citeert een regel alsof die live is. CivicCite stelt ook een kandidaat op, en die kandidaat citeert een parkeerbepaling die is ingetrokken. Dan draait de actualiteitscheck. De bepaling heeft een intrekkingsdatum. Van kracht faalt. En in plaats van terug te vallen op een aangrenzende regel en te bluffen, houdt de poort het antwoord in, markeert de vraag als buiten geverifieerde dekking, en routeert die naar een live afdeling met de gedeeltelijke bevindingen eraan.

Een fout antwoord op een overheidsdomein is geen gêne. Het is een aansprakelijkheid met de naam van de stad erop.
Kijk naar wat dat scherm weigert te doen. Het synthetiseert geen plausibel antwoord uit een dode wet. Het zegt, in gewone taal, dat de enige bepaling die dit adresseert is ingetrokken en dat niets momenteel van kracht de vraag regelt, en het draagt de burger over in plaats van te gokken. Eerlijke onthouding wint van een zelfverzekerd fout antwoord, vooral bij de overheid. En bij de overheid zijn de inzetten niet reputatieel. Overheidsjuridisch advies zit in de bedrijfsmatige-functiezone, wat betekent dat er geen soevereine-immuniteitsschild is om achter te schuilen wanneer het antwoord fout blijkt.
Dit is geen hypothetische zorg meer, wat deels is waarom ik het ding nu bouwde in plaats van later. Er waren 78 chatbotgerelateerde wetsvoorstellen in 27 staten in 2026. New Yorks S7263 bereikte het senaatsplenum op 26 februari 2026. De hoogrisicoverplichtingen van Annex III van de EU AI Act worden afdwingbaar op 2 augustus 2026, met boetes tot €15M of 3% van de wereldwijde omzet. De regelgevingsvraag verschuift van "is je AI behulpzaam" naar "kun je bewijzen dat je AI dat mocht zeggen." Stilte kun je verdedigen. Een zelfverzekerd fout antwoord niet.
Het cijfer waarop een toezichthouder daadwerkelijk kan handelen
Ik dacht ooit dat de kopmetriek voor een systeem als dit een hallucinatiepercentage was, en nu denk ik dat dat instinct precies achterstevoren is. Een percentage is het verkeerde ding om een toezichthouder te geven.
Stel je voor dat jij de Law Department van de stad bent, het kantoor dat de aansprakelijkheid draagt wanneer een antwoord fout gaat. "Onze chatbot hallucineert slechts 4% van de tijd" is niet geruststellend. Het is een bekentenis dat vier op de honderd burgers een antwoord krijgen met het gezag van de stad erachter en niets achter het antwoord. Het cijfer dat iets betekent gaat niet over hoe vaak het model fout zit. Het gaat erover of er ooit iets ongeverifieerds de deur uit mocht. Dus de metriek waar ik de benchmark omheen bouwde is deze: op een vaste, gelabelde golden set van 12 queries, door de echte pijplijn gedraaid, het aantal antwoorden vrijgegeven zonder een geverifieerde, van kracht zijnde wettelijke basis. Het doel is nul van de twaalf.
Een hallucinatiepercentage vertelt een toezichthouder hoe vaak je faalde. Het kan hen niet vertellen dat je het ving.

Ik wil precies zijn over wat dat cijfer wel en niet is, want het te hard claimen zou de hele premisse verraden. Het is een resultaat op een vaste gelabelde set, geen open-wereld-garantie en geen "nul hallucinatie," een frase die naar mijn mening geen eerlijk persoon zou moeten verkopen. Het model stelt nog steeds imperfecte claims op. Het punt is dat de ongeverifieerde worden vastgehouden, niet dat ze nooit worden opgesteld. Naast dat cijfer zitten er nog twee: 100% auditrecorddekking, wat betekent één indiendbaar record per query of het verzonden of geweigerd wordt, en disposition-overeenstemming met de gelabelde ground truth. De plain-RAG-baseline, de MyCity-architectuur zonder poort, zou de gedocumenteerde illegale antwoorden op dezezelfde set hebben verzonden. Die vergelijking is context, niet de kop.
Het record is het deel dat ik het hardst zou verdedigen.

Elke query, vrijgegeven of geweigerd, produceert een Wettelijk Besluitverslag: de disposition, het citaat, alle vier checkresultaten, de beslissing, als gestructureerde data die je kunt indienen en opnieuw draaien. Het noemt NIST AI RMF logging en FedRAMP en StateRAMP continuous monitoring als de standaarden waarnaar het is gebouwd. Ik ben voorzichtig met die zin. Gebouwd naar is een richting, geen certificering, en ik zal niet claimen dat CivicCite tegen een van hen is gecertificeerd. Maar een auditor wil geen belofte dat het model slim is. Een auditor wil een record, per interactie, dat precies laat zien waarom een antwoord mocht bestaan, in een vorm die overleeft wanneer iemand het probeert te breken. Reproduceerbaarheid is wat een beslissing tot bewijs maakt, en bewijs is waar een toezichthouder op kan handelen.
En als je het liever bekijkt dan mij het te laten beschrijven, hier is de hele demo van begin tot eind.
De vraag waarmee ik blijf zitten
Ik blijf terugkomen op iets dat me verraste aan mijn eigen reactie. De eerste keer dat ik CivicCite een vraag zag weigeren en doorsturen naar een afdeling, las een deel van mij dat als het systeem dat faalde.
Het faalde niet. Het deed het ene ding dat de zelfverzekerde bots niet kunnen: de rand kennen van wat het kan bewijzen en daar stoppen. Ik had zo lang geoptimaliseerd voor een goed antwoord dat ik stilletjes had aangenomen dat een goed antwoord het doel was. Dat is het niet. Bij de overheid is het doel een verdedigbaar antwoord, en de afstand tussen die twee woorden is de hele reden dat dit product bestaat. Een verdedigbaar antwoord ziet er soms uit als een vrijgegeven citaat. Even vaak ziet het eruit als een doorgestuurde vraag en een ingediend record.
Dus de vraag die ik zou achterlaten bij iedereen die AI voor een overheid bouwt, of die koopt, is niet "hoe nauwkeurig is je model." Betere modellen blijven beter worden in vloeiende, contextueel foute antwoorden schrijven, want vloeiendheid was nooit het ontbrekende stuk. De vraag die ik stel voordat er iets de poort uitgaat is smaller en harder. Kun je nu, meteen, bewijzen dat dit exacte antwoord te herleiden is tot een wetsartikel dat bestaat en momenteel van kracht is, en zou dat bewijs een rechtbank overleven die wilde dat het faalde? Als het antwoord nee is, maakt het niet uit hoe goed het model is. Het systeem moet stil blijven. Je kunt het hoe dan ook zien beslissen, hier: veriprajna.com/nl/demos/overheids-ai-die-de-wet-citeert-of-zwijgt.
Vertrouwen hoort niet thuis in een model dat je moet geloven. Het hoort thuis in code die je kunt auditen.


