Voice agents
Voice-agents in de thuiszorg: een case uit Apeldoorn
Dinsdagochtend 7:42, 84 voicemails in de inbox en de coördinator heeft nog geen koffie gehad. Dit is de voice-agent die we bouwden om die inbox op te ruimen, van begin tot eind.

De inbox van 7:42
Op dinsdagochtend om 7:42 opent de coördinator van een thuiszorgcoöperatie van 42 mensen in Apeldoorn haar gedeelde telefoon-inbox. Er staan 84 voicemails in van afgelopen nacht. De meeste zijn van familieleden van cliënten. Drieëntwintig gaan over medicatie. Vier zijn in het Turks. Twee gaan over een val. Eén is een man die alleen wil bevestigen dat de verpleegkundige die om 11:00 komt dezelfde is als gisteren.
Ze heeft 50 minuten tot de ochtendstandup. Daarnaast heeft ze vandaag haar eigen caseload van 14 huisbezoeken.
Dit is de dienst die een voice-agent kleiner moest maken.
Waarom een voice-agent en geen chatbot
Het eerste gesprek met het bestuur van de coöperatie duurde veertig minuten. Ze hadden al twee keer eerder een chatbot gepitcht gekregen, door twee verschillende leveranciers. Beide pitches stierven op dezelfde zin: "de families gaan 'm niet gebruiken."
Ze hadden gelijk. De families in kwestie zijn meestal tussen de 58 en 81. Ze bellen. Ze spreken berichten in. Een handjevol Turkstalige families gebruikt WhatsApp-voicenotities. Niemand van hen gaat om 22:30 een vraag in een webformulier typen over of Mevrouw De Boer haar metoprolol mag innemen met haar diureticum.
Een voice-agent ontmoet mensen waar ze al zijn: aan de telefoon. Hij neemt op. Hij begrijpt de vraag. Hij logt het antwoord ergens waar een mens het 's ochtends kan controleren. Dat is het hele product.
Het contract van 90 seconden met Nedap Ons
De coöperatie draait op Nedap Ons, het de facto elektronische dossier voor thuiszorgorganisaties in Nederland. Alles wat de agent doet, moet landen in Nedap Ons, in het dossier van de juiste cliënt, in het juiste gestructureerde veld, binnen 90 seconden. Dat getal kwam van de coördinator. Het was de langste vertraging die ze tolereerde voordat ze families zelf zou terugbellen.
90 seconden is geen technische randvoorwaarde. Het is een vertrouwensgrens. Als de samenvatting er drie minuten over doet voordat hij in het dossier verschijnt, stopt het team met de agent vertrouwen, en gaan ze families weer op de oude manier terugbellen "voor de zekerheid." Dan wordt de agent overhead in plaats van verlichting.
We halen de SLA met een pipeline van vier stappen:
telefoon → STT (NL + TR) → intent- en entity-extractie → Nedap Ons API-write
~6s ~8s ~3s ~2s
Elke stap heeft een knop en een faalmodus. De STT draait op een zelf-gehoste Whisper-variant, gebatcht per gesprek, met de audio opgeknipt op zinsgrenzen in plaats van vaste intervallen. Vaste intervallen kostten ons 4 tot 9 seconden per gesprek, omdat het model de chunk moest uitwachten. Detectie op zinsgrens bracht dat terug naar ~6 seconden mediaan. De intent-laag draait op een kleine classifier met een harde lijst van 41 medicijnnamen die de coöperatie daadwerkelijk voorschrijft, plus het personeelsrooster en de standaard bezoektijden. Het beperken van de vocabulaire op deze laag is wat het percentage foute writes laag genoeg krijgt om het ding überhaupt te kunnen gebruiken.
De overige 71 seconden zijn buffer. Die gebruiken we. Ongeveer 4% van de gesprekken gaat door een tweede extractieronde, omdat de eerste lage confidence teruggaf op de medicijnnaam. Confidence onder 0,86 triggert een re-prompt of een verduidelijkingsbeurt ("zei je metoprolol of metronidazol?"), wat 12 tot 18 seconden toevoegt maar het percentage foute writes met een ordegrootte verlaagt.
De Nedap Ons-write zelf is twee operaties: een notitie met transcript op de tijdlijn van de cliënt, en een update van een gestructureerd veld als het gesprek een actiegerichte entiteit bevatte (een medicijnnaam, een bezoektijd, een geregistreerde val). Die gestructureerde update maakt het gesprek later doorzoekbaar. Vrije-tekst-transcripten in een dossier zijn nuttig om 8:00 de volgende ochtend en vergeten om 8:00 de maandag erna. Een flagged_medication-veld met timestamp is wat de medicatiebeoordeling op vrijdag daadwerkelijk uitvraagt.
Dat is de SLA waar het team om geeft. Niet "hoe snel reageert de AI," maar "hoe lang voordat ik in mijn EPD kan zien dat dit gesprek heeft plaatsgevonden."
Routing voor de Wkkgz
De Wet kwaliteit, klachten en geschillen zorg (Wkkgz) regelt kwaliteit, klachten en geschillen in de zorg. Voor ons doet ze één belangrijk ding: bepaalde categorieën familiecommunicatie moeten beoordeeld kunnen worden door een gekwalificeerde zorgprofessional, en klachten hebben een formeel afhandelingstraject met wettelijke termijnen.
De agent kan die niet beantwoorden. Dat willen we ook niet.
Dus de tweede taak van de pipeline, parallel aan de dossier-write, is een classifier die naar het transcript kijkt en bepaalt of het gesprek het volgende bevat:
- een klacht, ook een zachte ("ze was twee uur te laat")
- een klinische vraag die het oordeel van een geregistreerde verpleegkundige nodig heeft
- een veiligheidssignaal (elke melding van een val, verwarring, geweigerde medicatie of agressie)
- een verzoek om het zorgplan te wijzigen
Als één van die dingen afgaat, stopt de agent met antwoorden. Hij wordt een router. De samenvatting van het gesprek landt in het dossier, maar pageert ook de dienstdoende wijkverpleegkundige via een apart kanaal (in ons geval een Teams-webhook naar een "Wkkgz"-kanaal, met een SLA-timer van 15 minuten die de wijkverpleegkundige moet bevestigen).
De agent probeert nooit een familielid een klacht uit het hoofd te praten. Hij zegt niet "ik begrijp uw frustratie." Hij zegt, in het Nederlands: "ik zorg dat er vandaag een verpleegkundige terugbelt. Is het nummer waarvandaan ik bel het juiste?"
Als je een voice-agent klacht-achtige gesprekken laat afhandelen in de zorg, bouw je geen automatisering. Je bouwt een aansprakelijkheid. Routeer, los niet op.
Turks is geen vertaalprobleem
Ongeveer 11% van de cliënten van de coöperatie is eerste- of tweede-generatie Turks-Nederlands. De families spreken een mix. De grootmoeder spreekt Turks. De dochter die de telefoontjes pleegt, spreekt Nederlands met Turkse leenwoorden en switcht midden in een zin. De zoon op de achtergrond spreekt vloeiend Nederlands en Turks voor emotionele nadruk.
We hebben twee aanpakken geprobeerd.
De eerste was om de taal aan het begin van het gesprek te detecteren en door te schakelen naar een Turks-only flow. Dat faalde binnen een week. De helft van de Turks-Nederlandse families code-switcht in dezelfde zin ("hij heeft zijn ilaç niet ingenomen"). Een eentalige flow miste óf de medicijnnaam, óf vroeg de familie om zich te herhalen, wat ze betuttelend vonden.
De tweede aanpak, die we nu draaien, is één pipeline die gemengde Nederlands-Turkse input van begin tot eind verwerkt. Het speech-to-text-model is een Whisper-variant, gefinetuned op Nederlandse zorg-audio met Turkse medische vocabulaire erbij. De intent-laag is taalonafhankelijk. Het antwoord wordt gegenereerd in de taal die de beller als laatste gebruikte.
We houden ook een aparte text-to-speech-stem aan per taal, met een bewuste accentmatch. De Turkse stem is geen Anatolisch Turks. Het is Turks zoals het in Nederland wordt gesproken door de generatie die als gastarbeider kwam en de kinderen die hier opgroeiden. De families merkten het in de eerste week op. Twee van hen vroegen wie de stem had ingesproken.
Dat is de wijziging die de tevredenheid van Turkstalige families verschoof van "ze bellen wel terug" naar "ze hoeven niet meer terug te bellen."
Wat de agent niet doet
Dit is de slide die we het team blijven laten zien tijdens de onboarding, want dit is de slide waarmee de agent vertrouwd wordt:
- Hij geeft geen medicatie-advies. Hij logt de vraag en pageert de verpleegkundige.
- Hij bevestigt geen bezoektijden op eigen houtje. Bezoektijden komen uit de planmodule van Nedap Ons. De agent leest ze uit, maar de bron van de waarheid is de planner.
- Hij doet geen intake van nieuwe cliënten. Nieuwe families praten met een mens.
- Hij blijft niet aan de lijn bij een val of een gesprek met een verwarde oudere. Hij triggert het veiligheidssignaal en doet een warme doorverbinding naar het dienstnummer.
Warme doorverbinding betekent hier dat de agent aan de lijn blijft tot een mens opneemt. Neemt niemand binnen 45 seconden op, dan escaleert de agent naar een tweede nummer, daarna een derde. Elke stap wordt gelogd met de timestamp die de coöperatie nodig heeft voor haar audit trail. In de zorg telt het spoor zwaarder dan de latency.
De reden om op te sommen wat de agent niet doet, is dat het de enige eerlijke manier is om te beschrijven wat hij wél doet. "Voice-agent voor de thuiszorg" is te breed. "Voice-agent die routine-callbacks van familie over medicatie, bezoeklogistiek en zorgplan-vragen afhandelt, en al het andere binnen 90 seconden naar een mens routeert" is het product.
De nieuwscyclus van deze week staat vol verhalen over AI-agents die dingen deden die ze nooit hadden mogen doen, waaronder eentje die ongeautoriseerde acties uitvoerde binnen een Fedora-omgeving. De les voor de zorg is niet "deploy geen agents." Het is het omgekeerde: deploy ze, maar schrijf de deny-list vóór de allow-list, en maak de deny-list non-negotiable in code, niet in de prompt.
Cijfers na vijf maanden
We zetten de agent aan in januari, na acht weken shadow-mode waarin de agent elk gesprek transcribeerde en classificeerde maar niet antwoordde. De coördinator beoordeelde een sample van 30 transcripten per dag en corrigeerde de classifier. De meeste fouten in die periode waren "dit is een klacht" dat verkeerd werd gelezen als "dit is een klinische vraag." Tegen week zes was de classifier het in 94% van de gevallen eens met de coördinator, de drempel die het bestuur stelde voor live-gang.
Stand van zaken vorige week:
- 1.640 gesprekken per week afgehandeld, gemiddeld (vanaf een softe start van 380/week)
- 71% door de agent afgesloten zonder menselijke tussenkomst
- 23% gerouteerd naar de dienstdoende verpleegkundige via het Wkkgz-kanaal
- 6% geëscaleerd naar de coördinator om niet-klinische redenen (meestal facturatie)
- Mediane tijd van gesprek-einde tot dossier-write: 47 seconden
- 95e-percentieltijd: 81 seconden (binnen ons contract van 90 seconden)
- Inbox van de coördinator om 7:42: gemiddeld 11 voicemails, voorheen 84
De coördinator doet de ochtendstandup nu met haar koffie.
We gaan geen percentage publiceren voor "familietevredenheid", omdat we nog geen schone manier hebben om dat te meten. Wat we wel hebben: de coöperatie verlengde het contract in mei en voegde een tweede locatie toe.
De bouw, in één diagram
Het hele systeem is zes blokken:
[Telefoon (KPN)]
|
v
[Voice gateway / SIP]
|
v
[STT (NL + TR gemengd)]
|
v
[Intent + entity-laag] -----> [Wkkgz-classifier] --> [Teams-webhook naar dienstdoende verpleegkundige]
|
v
[Reply-generator (NL of TR)]
|
v
[Nedap Ons API-write]
Niets hier vereist een research-budget. Het interessante werk zat niet in de modellaag. Het zat in de SLA van 90 seconden, de Wkkgz-routinglogica en de keuze om Nederlands-Turks code-switching te behandelen als één taal in plaats van twee.
Toen wij de voice-agent voor de coöperatie in Apeldoorn bouwden, was het ding waar we steeds tegenaan liepen het gat tussen wat een voice-agent geloofwaardig kan zeggen en wat een zorgteam tolereert dat hij zegt. Uiteindelijk losten we het op door eerst de "doet niet"-lijst te schrijven en pas daarna de "doet wel"-lijst, en door de Wkkgz-router te behandelen als de belangrijkste component in de stack. Dat is hetzelfde soort werk dat in onze andere AI-agents gaat.
Het kleinste wat je vandaag zou kunnen doen, als je een zorgteam runt of een vergelijkbare buiten-kantooruren-inbox: trek de voicemails van vorige week in een spreadsheet, tag elk bericht met "beantwoorden", "routeren" of "klacht", en tel. De meeste teams ontdekken dat de eerste kolom tweederde van het volume is. Dat is het deel dat de agent zou moeten overnemen. De rest blijft mensenwerk, en dát is het punt.
Kern
Bij voice-agents in de zorg: schrijf eerst de 'doet niet'-lijst, dan pas de 'doet wel'-lijst, en zet de deny-list in code, niet in de prompt.
FAQ
Waarom een voice-agent in plaats van een chatbot voor thuiszorgfamilies?
Familieleden tussen de 58 en 81 bellen, ze typen niet. Een voice-agent bereikt ze op het kanaal dat ze toch al gebruiken. Chatbot-pilots bij dezelfde coöperatie waren twee keer eerder gestrand.
Wat is de SLA van 90 seconden en waarom doet die ertoe?
Het is de maximale tijd tussen het einde van een familiegesprek en het verschijnen van de samenvatting in Nedap Ons. Voorbij de 90 seconden stopt het team met de agent vertrouwen en gaat het families weer handmatig terugbellen.
Hoe gaat de agent om met klachten onder de Wkkgz?
Hij doet dat niet. Een parallelle classifier detecteert klachten, veiligheidssignalen en klinische vragen, en pageert de dienstdoende wijkverpleegkundige via een Teams-webhook met een bevestigingstimer van 15 minuten.
Hoe wordt Turks afgehandeld als families code-switchen met Nederlands?
Eén pipeline verwerkt gemengde Nederlands-Turkse input van begin tot eind. Een Whisper-variant gefinetuned op Nederlandse zorg-audio met Turkse medische vocabulaire; antwoord in de taal die de beller als laatste gebruikte.
Kan de agent het zorgplan van een cliënt wijzigen of bezoektijden bevestigen?
Nee. Bezoektijden worden uitgelezen uit de planner van Nedap Ons, maar die planner is de bron van de waarheid. Wijzigingen in het zorgplan en intake van nieuwe cliënten gaan altijd naar een mens.