Voice agents
Voice agent live zetten: onze checklist voor de huisarts
Voordat een voice agent de lijn opneemt bij een huisarts, draaien we een checklist die niets met het model te maken heeft en alles met hoe calls écht klinken op maandag 08:02.

Het is maandag 08:02 in een huisartsenpraktijk ergens in Utrecht. De lijnen gingen om 08:00 open. Drie doktersassistentes zitten al aan de telefoon. Elf bellers staan in de wachtrij. De vierde assistent is de voice agent die we hebben gebouwd, en zij neemt nu twee minuten op.
Dit is het moment waarop de pre-launch checklist zich uitbetaalt of niet. Alles wat je vóór die minuut doet, is het enige wat telt. Daarna ben je aan het reageren.
Waarom een nieuw model geen launch-criterium is
Een voice agent in een huisartsenpraktijk faalt niet omdat het taalmodel verkeerd is. Hij faalt omdat de call klonk als een beroerte en de agent een afspraak op donderdag inplande. Hij faalt omdat de agent 1,8 seconde stilviel en de beller ophing. Hij faalt omdat de agent een paracetamoldosering noemde die de patiënt tien jaar lang onthoudt.
Het lastige aan een voice agent in de zorg heeft bijna niets te maken met welk model de telefoon opneemt. Het model telt mee, maar containment telt zwaarder. En containment zit grotendeels in het werk eromheen: wat de agent mag horen, wat hij mag zeggen, en waar hij gedwongen wordt over te dragen. Bijna niets op onze checklist gaat over modelkeuze. Het meeste gaat over die rails.
Detectie van rode vlaggen in de triage
Het eerste wat we testen, noemen we de no-book list. Er zijn calls die de agent nooit zelf mag afhandelen, hoe zelfverzekerd hij ook klinkt. De NHG-Triagewijzer, de Nederlandse triagestandaard voor huisartsen, deelt klachten in vijf urgentieniveaus, van U1 (levensbedreigend, ambulance nu) tot U5 (advies). Voor onze agents is de werkregel simpeler: alles wat U1 of U2 kan zijn, verlaat de handen van de agent binnen tien seconden.
We voeden de system prompt met de echte rode-vlaggenlijst die het assistententeam gebruikt. Pijn op de borst. Eenzijdige zwakte. Onduidelijke spraak. Een baby onder de drie maanden met koorts. Stridor. Suïcidale gedachten. Heftig bloedverlies. Vervolgens testen we elk item koud, in het Nederlands, in een klinische stem en in een paniekerige stem. We testen ze terwijl de beller iets anders doet: mompelt, onregelmatig ademt, met een tv op de achtergrond.
// no-book list: phrases that must escalate, in Dutch
const RED_FLAGS = {
cardiac: ["pijn op de borst", "drukkend gevoel", "uitstraling naar arm"],
stroke: ["scheef gezicht", "kan niet uit woorden komen", "plotseling raar"],
paeds: ["baby onder de drie maanden", "koorts bij baby"],
mental: ["uit het leven stappen", "doe mezelf wat aan"],
};
// runs every turn on a rolling 20s transcript window
function shouldEscalate(transcript: string): boolean {
const lowered = transcript.toLowerCase();
return Object.values(RED_FLAGS)
.flat()
.some(phrase => lowered.includes(phrase));
}
De grootmoedertest
Daarna draaien we wat we de grootmoedertest noemen. Een groot deel van de calls bij een Nederlandse huisarts komt van mensen die hun klacht niet beschrijven zoals de NHG dat doet. Een vrouw van 78 zegt niet "ik heb unilaterale faciale paralyse". Ze zegt "ik voel me niet lekker en mijn man kijkt raar". We geven de agent honderd van zulke formuleringen, gesampled uit geanonimiseerde gespreksnotities, en we kijken of de rode-vlaggenlaag nog steeds afgaat. Zo niet, dan verbreden we de patronen en testen we opnieuw.
AVG, NEN 7510 en de dingen die we nooit opschrijven
Een Nederlandse huisartsenpraktijk valt onder de AVG en in de praktijk ook onder NEN 7510, de nationale norm voor informatiebeveiliging in de zorg. De Autoriteit Persoonsgegevens is steeds actiever rond zorgdata. Voordat we live gaan, lopen we drie dingen langs.
Eén: opnames. We bewaren standaard geen audio. De transcript is voldoende voor bijna elke operationele behoefte. Als de praktijk per se audio wil (sommige willen dat, voor training van assistentes), dan staat het versleuteld op een EU-server, met een rollende delete na 30 dagen. Geen uitzonderingen.
Twee: transcripten. We strippen het BSN voordat het in enige langetermijnopslag terechtkomt. De agent mag een BSN horen, real-time valideren tegen het HIS, en daarna laten vallen. We testen dit door dertig nep-BSN's de lijn in te lezen en daarna de database te controleren. Wat lekt, gaat terug naar de redactor.
Drie: de verwerkersovereenkomst. Die wordt getekend vóór de lijn live gaat, niet erna. Als je launcht en daarna achter papierwerk aanrent, ben je het nieuwsitem.
De overdracht
Elk checklist-item hierboven kan misgaan. De overdracht is wat een fout herstelbaar houdt.
We geven de agent drie triggers om over te dragen naar een mens:
- De beller vraagt erom ("ik wil een mens", "kan ik iemand spreken", alles wat naar die intentie wijst).
- De confidence van de agent op intent-classificatie zakt twee beurten op rij onder een drempel.
- De rode-vlaggenlaag gaat af.
De overdracht zelf is een warme transfer naar een vrije assistente, met een gesproken eenregelige briefing ("mevrouw De Vries, 64, klaagt over pijn op de borst sinds twintig minuten") en de volledige transcript op het scherm van de assistente voordat de verbinding er is. Is er binnen twaalf seconden geen assistente vrij, dan routeren we naar de directe lijn van de arts.
Voicemail is geen overdracht. Het is een ophanger in een andere jas. Als je fallback "laat een bericht achter, we bellen u terug" is, dan heb je geen fallback.
Openingstijden, de HAP en 112
Een praktijk die om 17:00 sluit, stopt om 17:00 niet met patiënten hebben. Elke voice agent die wij opleveren heeft een klok, een agenda en een mening over het verschil tussen reguliere uren, lunchpauze, feestdagen (Koningsdag is de klassieke misser) en het moment waarop calls naar de regionale huisartsenpost moeten worden doorgezet.
De 112-herinnering staat los, en die zit bovenaan de prompt. Als iets in de woorden of toon van de beller wijst op een spoedgeval dat de agent niet kan beoordelen, is de afsluitzin altijd dezelfde: "Bij twijfel, bel 112." We laten het model die zin niet herformuleren. We pinnen 'm als letterlijke string en we testen die pin elke release.
Hallucinatie-rails op afspraken en medicatie
Dit is het stuk dat in demo's misgaat en mensen in productie voor schut zet.
Twee regels. De agent boekt nooit een afspraakslot dat hij niet net in dezelfde beurt uit de HIS-agenda heeft teruggelezen. Is het HIS onbereikbaar, dan zegt de agent dat en biedt een terugbeloptie. Hij "noteert vast iets voorlopig" nooit. We hebben demo's gezien waarin het model een donderdag om 10:15 verzint die in geen enkel systeem bestaat. Dat is een incident op praktijkniveau dat staat te wachten.
De agent noemt ook nooit een getal hardop over medicatie. Geen dosering, geen frequentie, geen sterkte. Vraagt de beller ernaar ("hoeveel paracetamol mag mijn dochter?"), dan bevestigt de agent dat en routeert naar een assistente. We hebben dit met dertig variaties getest en het model wilde behulpzaam zijn bij achtentwintig ervan. We hebben die behulpzaamheid eruit moeten engineeren, met een harde string-match-rail bovenop de prompt-instructie. De prompt alleen was niet genoeg.
De audit log
Eén ding dat bijna iedereen vergeet: de audit log. Elke actie die de agent doet (elke boeking, elke annulering, elk receptverzoek dat naar de arts wordt gerouteerd) wordt naar een per-call ledger geschreven met een timestamp, een hash van de beller, de uitgevoerde actie en de reden die het model noemt. We maken die leesbaar voor de doktersassistente, niet alleen voor een developer.
Dit is de goedkoopste verzekering die je koopt. Twee uur bouwen, en de eerste keer dat een beller zegt "de receptioniste beloofde me een afspraak om 10:00", heb je de echte transcript en de echte database-schrijfactie. Of je hebt 'm niet, en je biedt je excuses aan.
De stresstest
Het laatste wat we doen voordat er één echte call binnenkomt, is een sessie van 90 minuten met drie van ons op de lijn, om beurten de slechtste versie van een beller. Tv op de achtergrond. Huilend kind. Gemompeld Nederlands. Fries accent. Midden in een zin ophangen en terugbellen. Proberen door de begroeting van de agent heen te praten. Een nep-BSN voorlezen waarvan het laatste cijfer expres fout is. Na drie seconden ophangen om te zien of de agent dat behandelt als een opzettelijk korte call of als een netwerkhapering.
We loggen elke fout met een timestamp en we leveren niet op tot de foutenlijst leeg is, of tot elk overgebleven item een schriftelijke akkoordverklaring van de praktijkhouder heeft. Niet van het assistententeam. Van de eigenaar.
De schaduwweek
Als de checklist slaagt, gaat de agent nog niet live voor het publiek. Hij schaduwt. De telefoonlijn blijft precies zoals hij de week ervoor was. De agent luistert mee met elke call en produceert wat hij gezegd zou hebben, in een zijkanaal dat alleen wij en de praktijk lezen. We vergelijken zijn acties met die van de mens, vijf werkdagen lang. We dichten de gaten. Dan, en pas dan, zetten we hem op de lijn.
Het kleinste wat je vandaag kunt doen
Run je een praktijk en denk je na over voice-automatisering, begin dan niet met een demo van een leverancier. Begin met één uur naar je eigen inkomende calls luisteren, met toestemming, en schrijf elk ding op dat een mens in de eerste tien seconden doet. Die lijst gaat je verbazen. De voice agent moet dat allemaal kunnen, plus niets van de no-book list. De rest is engineering.
Toen we eerder dit jaar de voice agent bouwden voor een huisartsenpraktijk in de Randstad, liepen we steeds tegen het gat aan tussen hoe de NHG een call beschrijft en hoe een maandagochtendcall echt klinkt. Uiteindelijk hebben we de rode-vlaggenlaag bijna volledig getraind op transcripten van de eigen assistentes van de praktijk, niet op het gepubliceerde protocol.
Kern
Een voice agent bij een huisartsenpraktijk faalt niet op het model. Hij faalt op de rails eromheen, en de pre-launch checklist gaat vooral over die rails.
FAQ
Mag een Nederlandse huisartsenpraktijk een voice AI-agent inzetten?
Ja, onder de AVG en NEN 7510, mits er een getekende verwerkersovereenkomst ligt, de data binnen de EU blijft, het BSN uit de langetermijnopslag wordt gestript en de beller wordt geïnformeerd dat een geautomatiseerd systeem de lijn opneemt.
Neemt de voice agent gesprekken met patiënten op?
Standaard bewaren we alleen de transcript, niet de audio. Heeft de praktijk audio nodig voor training van assistentes, dan staat het versleuteld in de EU en wordt het na 30 dagen rollend verwijderd.
Wat gebeurt er als het HIS onbereikbaar is tijdens een call?
De agent verzint geen afspraakslots. Hij vertelt de beller dat het systeem plat ligt, biedt binnen een afgesproken venster een terugbeloptie aan en schrijft het verzoek naar een fallback-queue waar de assistentes mee werken.
Hoe lang duurt de volledige pre-launch checklist?
Voor een praktijk op één locatie ongeveer drie weken: één voor setup en HIS-integratie, één voor testronden inclusief de live stresssessie, en één schaduwweek voordat de agent een publieke call opneemt.