← Blog

Chat agents

Chat agent voor KLIC-triage: 1.860 meldingen per week

Een Apeldoornse glasvezelploeg van 26 man verzoop in 1.860 KLIC-vragen per week, met op elke vraag een WIBON-klok van 20 werkdagen. De chat agent vist de gevaarlijke er eerst uit.

Jacob Molkenboer· Oprichter · A Brand New Company· 20 jun 2026· 10 min
Open manilla map met formulieren, chartreuse memo, koperen bel, indexkaart en rood lint op ivoren bureau.

De KLIC-coördinator bij de Apeldoornse glasvezel-aannemer komt om 06:45 binnen. Tegen de tijd dat haar koffie op tafel staat, zijn er in het weekend 41 nieuwe graafmeldingen in de gedeelde inbox geland. Drie ervan kruisen een Gasunie-hogedruktracé. Ze heeft op elk 20 werkdagen voordat de WIBON-meldtermijn dichtklapt — maar alleen op die drie, de gaskruisingen, betekent een gemiste deadline een stillegging, een boete, of een gat in een leiding die 66 bar voert.

Vermenigvuldig dat met een ploeg van 26 man die onder de straten van Gelderland glasvezel legt en de inbox krijgt 1.860 vragen per week binnen. De bottleneck zat nooit in het graven. Hij zat in het bij de juiste persoon krijgen van de juiste melding voordat de kalender hem doodde. Wij werden binnengehaald om een chat agent te bouwen die de Gasunie-kruisingen er eerst uitvist, de rest naar de planner stuurt, en nooit een veiligheidsbuffer gokt.

Het archief waar niemand aan wilde komen

Toen wij binnenkwamen, was de setup herkenbaar voor iedereen die ooit een Nederlandse infra-aannemer heeft doorgelicht die voorbij de twintig man groeide zonder zijn tooling te herbouwen. Twee systemen dragen het werk.

  • Een AutoCAD Map 3D 2015 KLIC-archief op een fileserver in de backoffice. Elf jaar aan Kadaster-leveringen, geïndexeerd op graafmelding-nummer en een spreadsheet met zes tabbladen die iedereen stilletjes wantrouwt.
  • Een SQL Server 2017-database met daarin de sleuf-planning, het ploeg-rooster, en een triagetabel die in zes jaar organisch is gegroeid. Drie van de kolommen heten opmerking, opmerking2 en vraag_van_klic. Twee daarvan zijn nullable. Eén is NVARCHAR(MAX).

Niets was kapot. De KLIC-coördinator kon in theorie elke melding zelf beantwoorden. Ze kon alleen geen 372 per dag aan en tegelijkertijd de Gasunie-kruisingen in de gaten houden. Het eerste wat ze tegen ons zei, over een bureau bezaaid met geprinte PDF's van Kadaster KLIC: "Ik wil gewoon die drie gevaarlijke bovenaan hebben."

Waarom 75 seconden, en niet 20 minuten

WIBON geeft een grondroerder 20 werkdagen tussen melding en graafwerk. Op papier ruim voldoende. In de praktijk staat de uitvoerder binnen vier dagen met een graafmachine op het asfalt. Dus de melding moet getrieerd worden, naar de planner gestuurd, gekruist met de sleuf-planning, en — als hij een Gasunie-tracé raakt — doorgeschoven naar de KLIC-coördinator zelf voor een handmatige check tegen de RDI-richtlijn graafschade voorkomen.

Het oude trage pad: melding komt binnen per mail of via het KLIC-WIN-portaal, secretaresse stuurt door naar de planner, planner opent de AutoCAD-tekening en de SQL-planning, scant op overlap, stuurt een vraag terug als iets onduidelijk is. Gemiddelde reactietijd: 2 uur 40. Staart: drie dagen, als de planner op een project zat.

We mikten op 75 seconden om één reden. De WhatsApp Business-inbox van het team had over zes maanden gemeten een mediaan van 90 seconden voor het eerste menselijke antwoord. Alles trager dan dat, en de uitvoerder belde. Alles sneller, en de uitvoerder vertrouwde het kanaal. Een telefoontje kostte twaalf minuten uit andermans dag. Het getal was niet uit de lucht gegrepen.

Wat we hebben gebouwd

Eén chat agent, drie oppervlakken: het WhatsApp Business-nummer dat de buitenploeg al gebruikte, een Teams-app voor het kantoor, en een ingesloten widget op het klantenportaal voor tickets. Onder de motorkap dezelfde agent, drie verschillende sets toegestane tools.

De agent heeft read-only toegang tot vier dingen.

  1. Het KLIC-archief, ontsloten via een dunne REST-shim die wij hebben geschreven en die de Kadaster-XML-leveringen parseert en geometrie, netbeheerder en tracé-naam als GeoJSON beschikbaar maakt. AutoCAD Map 3D blijft op de fileserver staan; we hebben hem niet aangeraakt.
  2. De SQL Server 2017-planningsdatabase, via drie read views die we samen met de DBA hebben ontworpen. Geen writes, geen joins over de verouderde opmerking-puinhoop. We hebben de kolommen gepakt die te vertrouwen waren en de rest met rust gelaten.
  3. De WIBON-klok: een afgeleide tabel die voor elke open melding berekent hoeveel werkdagen er nog over zijn, rekening houdend met Goede Vrijdag, Hemelvaart en de eigen vrije dagen van het project.
  4. Een vector store van de melding-correspondentie van de afgelopen 18 maanden, zodat de agent uitgewerkte voorbeelden heeft van hoe het team daadwerkelijk op KLIC reageert.

Het interessante stuk is de router. Elk binnenkomend bericht wordt in twee stappen geclassificeerd. Eerst beslist een klein model of het gaat over een specifiek melding-nummer, een vraag over de planning, een interne 'kan ik vandaag graven'-vraag, of ruis. Daarna, als er een melding-nummer wordt herkend, draait de agent een deterministische geometrische check tegen het archief.

# Requires shapely for geometry ops. archive_layers is the nightly
# GeoJSON snapshot, loaded once per worker and cached in-process.
from shapely.geometry import shape  # used upstream to build layer.geometry

def classify_crossing(melding_geom, archive_layers):
    """
    Return ('gasunie', meta) if the graafpolygoon crosses, or sits within
    a 5 m buffer of, any Gasunie hogedruk-tracé in the KLIC-archief.
    The 5 m buffer matches the Gasunie-instructie voor grondroerders.
    """
    for layer in archive_layers:
        if layer.netbeheerder != "Gasunie Transport Services B.V.":
            continue
        if layer.druk_klasse not in ("HD", "HD/HTL"):
            continue
        if melding_geom.intersects(layer.geometry.buffer(5.0)):
            return ("gasunie", {
                "layer_id": layer.id,
                "trace": layer.tracé_naam,
                "afstand_m": round(melding_geom.distance(layer.geometry), 2),
                "druk_klasse": layer.druk_klasse,
            })
    return ("normal", {})

De geometrie komt uit die nachtelijke snapshot. De shim plakt de Kadaster-XML per netbeheerder samen tot één FeatureCollection, laadt die één keer per Python-worker en houdt hem in geheugen. Het hele archief — elf jaar aan leveringen — past in 480 MB RAM. Spatial indexing gebeurt via een STR-tree die bij het laden wordt opgebouwd; een polygoon-lookup duurt gemiddeld 4 milliseconden, 99e percentiel 11. We schuiven de geometriegrens niet op. We weigeren PostGIS aan te roepen voor een probleem dat in het procesgeheugen past.

Als de classifier gasunie teruggeeft, doet de agent drie dingen tegelijk. Hij bevestigt de vraag in de chat, pint de melding in de queue van de KLIC-coördinator met tracé-naam en berekende afstand, en plaatst een regel in een Teams-kanaal dat zij de hele dag openhoudt. End-to-end is P95 71 seconden. P99 is 88. Cold-start is het trage pad; al het andere komt uit de cache.

Waarschuwing

De buffer van 5 m staat niet ter discussie. De Gasunie-instructie voor grondroerders schrijft die voor bij hogedruk-tracés, en de chat agent mag dat getal nooit ter discussie stellen. Is de geometrie in het KLIC-archief ouder dan 24 maanden, verbreed de buffer dan naar 7 m en zet de melding op een verse KLIC-uitvraag. Geometriedrift is echt, en de aansprakelijkheid van de aannemer is echt.

De saaie 98,5%

Het Gasunie-pad telt omdat het niet mag falen. Maar het is 1,5% van de meldingen, ruwweg 28 per week. De andere 1.832 zijn het midden van de verdeling: een melding kruist een KPN-glasvezel, een Liander-LS-kabel, een Vitens-drinkwaterleiding. Die beantwoordt de agent zelf. Hij legt uit welke kabels en leidingen in de polygoon liggen, wat de veilige afstanden zijn, welke collega die week de sleuf in planning heeft, en of het project al een lopende KLIC-uitvraag heeft die je beter kunt bundelen.

Hier verdient het 11 jaar oude archief zichzelf terug. De ploeg vertrouwt de geometrie — ze leggen er al ruim tien jaar glasvezel tegen. We hebben hem niet gemigreerd. We hebben hem ingepakt. AutoCAD Map 3D blijft de source of truth voor het tekenwerk van de KLIC-coördinator. De agent leest een afgeleide GeoJSON-snapshot, die elke nacht ververst wordt vanuit de laatste Kadaster-levering. Als de snapshot-job faalt, valt de agent terug op 'vraag een mens' en zegt dat ook tegen de gebruiker. Hij gokt niet.

De vorm van het gesprek

Uitvoerders op een graafmachine willen geen bullet points. We zijn uitgekomen op drie antwoordvormen en hebben geweigerd er een vierde bij te zetten.

  • Groen: één regel, in het Nederlands, met daarin de kabels en leidingen onder de polygoon en de meter-afstand tot het dichtstbijzijnde gevoelige tracé. "Onder de Acaciastraat ligt KPN-glasvezel op 1,2 m, geen Gasunie. Sleuf staat ingepland voor di 23-06."
  • Geel: één regel context plus de naam van de collega om te bellen. De agent probeert nooit zelf een planningsconflict op te lossen.
  • Rood: een bevestiging dat de melding wordt geëscaleerd, de tracé-naam, en het aantal werkdagen dat nog op de WIBON-klok staat. Daarna stilte van de agent tot een mens hem oppakt. Geen vervolgnudges, geen auto-replies, geen 'kan ik nog ergens mee helpen'.

De vorm telde zwaarder dan het model. We hebben twee weken een spraakzamere persona geprobeerd. De uitvoerders hebben het kanaal gemute.

De eerste twee weken waren afstellen

We hebben elk antwoord van de agent meegekeken en elke correctie van de KLIC-coördinator. Op dag tien zat de override-rate onder de 2%. Vrijwel geen van de overrides waren classificatiefouten. Het was de agent die technisch kloppende dingen zei in een toon die op een graafmachine verkeerd valt — te veel slagen om de arm, te veel mitsen en maren, één regelverwijzing te veel. We hebben de system prompt in dat raam drie keer herschreven. We hebben de classifier en de geometrische buffer niet aangeraakt. Toon is goedkoop te wijzigen; de veiligheidsgrens niet, dus die staan vanaf dag één op verschillende release-cadensen.

De cijfers, na drie maanden

We zijn medio maart live gegaan. Drie maanden later, op het dashboard van de aannemer zelf.

  • 1.860 vragen per week, omhoog van 1.420 in februari. De buitenploeg ging het kanaal gebruiken voor dingen waar ze vroeger voor belden.
  • P95 op het eerste antwoord: 71 seconden. Mediaan: 9 seconden.
  • Gasunie-escalaties: 28 per week, 100% in de queue van de coördinator, nul gemist binnen het WIBON-venster, nul auto-replies verstuurd op een melding met Gasunie-kruising.
  • Agenda van de KLIC-coördinator: 14 uur per week terugverdiend. Die besteedt ze nu aan de verouderde opmerking-backlog, die iedereen al jaren wilde opschonen.

Wat we niet hadden voorspeld: de planner is gestopt met AutoCAD Map 3D openen voor routinematige vragen. Tekenen doet hij er nog wel in. Hij heeft het alleen niet meer nodig om te beantwoorden of 'straat X volgende dinsdag vrij is'. Dat is een stille winst. Het betekent ook dat de uiteindelijke migratie weg van AutoCAD Map 3D — en iedereen weet dat die komt — goedkoper is geworden. Er zijn nu minder menselijke workflows aan vastgepind.

Wat we niet nog eens zouden doen

We hebben twee weken geprobeerd de agent direct voor het KLIC-WIN-portaal te zetten zodat hij namens de planner nieuwe meldingen kon indienen. We zijn ermee gestopt. Het portaal is niet gebouwd voor machine-interactie, de gevolgen van een foute melding zijn reëel (een verkeerde polygoon betekent dat de aannemer blind graaft), en de tijdwinst van 30 minuten woog niet op tegen het risico. De agent leest. Mensen dienen in. We kijken er opnieuw naar als het Kadaster een fatsoenlijke machine-interface biedt; tot die tijd blijft de grens staan.

We hebben ook geprobeerd de agent de opmerking terug te laten schrijven naar SQL Server. Zelfde antwoord. Het verouderde trio opmerking, opmerking2 en vraag_van_klic is betekenisvol voor de mensen die het hebben geschreven, op manieren die nergens gedocumenteerd staan. Lezen gaf de agent context. Schrijven had alleen maar dubbelzinnigheid toegevoegd aan een tabel die juist minder dubbelzinnigheid nodig heeft.

Waar de hefboom zit

De hefboom was niet het model. Het was de grens. De chat agent werd alleen snel doordat we een harde lijn trokken: lees het archief, wijzig het nooit; classificeer de kruising, keur hem nooit goed; beantwoord de saaie vragen, escaleer de gevaarlijke binnen 75 seconden. De WIBON-aansprakelijkheid blijft bij de aannemer. De agent zorgt er alleen voor dat de juiste mens de juiste melding ziet voordat de klok afloopt.

Toen we dit voor de Apeldoornse glasvezel-aannemer bouwden, zat het lastige niet in de geometrie of in de SQL. Het zat in het accepteren dat een AutoCAD-installatie uit 2015 precies bleef staan waar hij stond, en er omheen routeren. Zo zien de meeste van onze chat-agent-projecten eruit: een wrapper die het verouderde systeem respecteert, plus een queue die de mensen respecteert.

Wil je een audit van vijf minuten op je eigen inbox: tel de meldingen — of tickets, of telefoontjes — die je in een week afhandelt, en streep de gevallen aan waarin een gemiste deadline een echte aansprakelijkheid is: boetes, stilleggingen, veiligheid. Zit het tweede getal onder de 5%, dan heb je de vorm van een probleem dat een chat agent kan oplossen. Zit het boven de 20%, dan heb je eerst een procesprobleem.

Kern

Je vervangt geen 11 jaar oud KLIC-archief om sneller te worden. Je zet er een chat agent voor die weet welke 1,5% van de meldingen móét escaleren.

FAQ

Waarom hebben jullie niet meteen weg gemigreerd van AutoCAD Map 3D 2015?

Omdat het team de geometrie vertrouwt en de KLIC-coördinator er dagelijks in tekent. Een migratie is een aparte, langere klus. De chat agent heeft alleen een nachtelijke GeoJSON-snapshot nodig, dus we hebben het archief ingepakt in plaats van vervangen.

Hoe garanderen jullie dat een Gasunie-kruising nooit automatisch wordt beantwoord?

Twee hekken. Een deterministische geometrische check op elk melding-nummer, plus een allow-list op de antwoord-tool. De agent heeft geen rechten om een groen of geel antwoord te sturen wanneer de classifier gasunie teruggeeft. Hij kan alleen escaleren.

Kan de chat agent namens de planner nieuwe KLIC-meldingen indienen?

Nee, en we raden het op dit moment af. Het KLIC-WIN-portaal is niet gebouwd voor machine-interactie en een verkeerde polygoon betekent dat de ploeg blind graaft. De agent leest. Mensen dienen in. We kijken er opnieuw naar als het Kadaster een fatsoenlijke machine-interface biedt.

Wat telt de WIBON-klok eigenlijk?

Werkdagen tussen de melding-datum en de geplande graafdatum, exclusief Nederlandse feestdagen en de eigen vrije dagen van de aannemer. Twintig werkdagen is het wettelijk maximum; de agent zet een vlag bij alles onder de acht.

chat agentscase studyautomationintegrationsoperationsworkflow

Iets bouwen?

Start een project