← Blog

Voice agents

Voice agents stresstesten: scepticus plus judge model

Een outbound voice agent staat klaar om maandag zijn eerste echte klant te bellen. Voordat dat gebeurt, zetten we hem aan de lijn met een Nederlandse scepticus en een judge model.

Jacob Molkenboer· Oprichter · A Brand New Company· 6 jun 2026· 8 min
Zwarte bakelieten telefoonhoorn van haak op leren onderlegger, groen zijden lint over de haak, kaart met lakzegel ernaast.

Het is zondagavond. Een outbound voice agent die we bouwden voor een Nederlandse logistieke klant moet maandag om 09:00 warehouse managers gaan bellen om afhaalmomenten te bevestigen. De happy path werkt. We hebben de agent veertig keer het script horen doorlopen met onze eigen ops lead aan de andere kant, in de aardige rol. Niemand op het team wil degene zijn die dinsdag uitlegt dat het eerste echte gesprek misging omdat een manager in Tilburg iets zei wat de agent in tests nooit had gehoord.

Dus voor de agent een echt gesprek voert, brengt hij het weekend aan de lijn door met een ander soort klant. Een Nederlandse scepticus, gespeeld door een tweede model. Elk transcript beoordeeld door een derde. Een onvoldoende blokkeert de maandag-deploy.

Waarom happy-path tests de ergste failures missen

Outbound voice agents falen op een specifieke manier. Ze klinken competent, totdat ze iemand tegenkomen die geen haast heeft om mee te gaan in het verhaal. Een warehouse manager die sinds 05:30 op de laadkade staat, laat zich niet door een onbekende stem door een bevestiging in vijf stappen leiden. Hij onderbreekt. Hij vraagt waarom. Hij geeft antwoorden van één woord die technisch ja zijn, maar nee betekenen. Hij pauzeert negen seconden en zegt dan één korte zin die de agent moet kunnen verwerken zonder de draad kwijt te raken.

Niets daarvan komt naar boven in scripted QA. De ops lead die de agent veertig keer testte heeft een vriendelijke stem en een belang bij een werkende agent. Hij is de verkeerde tegenstander. De juiste tegenstander is verveeld, druk, en licht wantrouwig tegenover het hele concept. Het type dat in een ander tabblad de Hacker News thread leest met de vraag waarom de HN-crowd zo anti-AI is, en het stilletjes eens is met de top comment.

De rig in drie delen

We red-teamen outbound agents tegen drie componenten voordat het eerste echte gesprek plaatsvindt. Een transcript-replay laag die de agent aanstuurt zonder telefoonminuten te verbranden. Een scepticus-persona die de worst-case klant speelt in de doeltaal van de agent. Een judge model dat elk transcript op vijf dimensies scoort en de run laat falen als één ervan onder de drempel valt.

De hele loop draait in CI. Een gefaalde run blokkeert de deploy.

De transcript-replay laag

Echte telefoongesprekken zijn duur en traag om op te itereren. Voor het red team strippen we de audio stack en draaien we de agent als text-in, text-out. Dezelfde system prompt, dezelfde tools, hetzelfde geheugen, hetzelfde model. Alleen zonder TTS en STT in het pad.

Dit vangt ruwweg 80% van de failures die in een echt gesprek bovenkomen, voor zo'n 1% van de kosten. De overige 20% zijn audio-specifiek. Barge-in afhandelen. Silence detection. Accenten die het STT model nog niet heeft gehoord. Daar heb je een echte audio rig voor nodig. Met de transcript rig kun je de audio rig uitstellen tot de logica klopt.

import asyncio
from rig import outbound_agent, sceptic, judge

async def run_red_team(scenario):
    history = []
    agent = outbound_agent.start(scenario)
    customer = sceptic.start(scenario)

    for _ in range(20):
        line = await agent.say(history)
        history.append(("agent", line))
        if customer.wants_to_hang_up(line):
            break
        reply = await customer.respond(history)
        history.append(("customer", reply))

    return await judge.score(history, scenario)

De Nederlandse scepticus-persona

De tweede component is het stuk waar de meeste teams afsnijden. Ze schrijven één enkele "rude customer" prompt en gaan live. Dat is niet genoeg.

Een bruikbare scepticus-prompt doet vijf dingen. Hij onderbreekt op een vast schema. Hij weigert het eerste antwoord minstens één keer per gesprek. Hij eist een bron voor elk getal dat de agent noemt. Hij gooit regionale details erin die de agent niet zou moeten kennen. En hij hangt abrupt op bij een hallucinatie, zodat de rig "klant verloren" als een echt resultaat kan scoren in plaats van als een onvolledige run.

We zetten de scepticus vast op Nederlands omdat de meeste van onze voice agents in het Nederlands draaien en de failure modes taalspecifiek zijn. Een Nederlandse scepticus vraagt "waarom?" op een manier die een Engels-geprompt model dat naar Nederlands vertaalt niet haalt. Het lokale register telt. Echte scepticussen in het wild performen geen scepsis. Ze hebben gewoon haast.

persona: dutch-warehouse-manager
language: nl-NL
register: direct
energy: medium-high, slightly impatient
behaviors:
  - interrupt after 8 seconds of agent monologue
  - reply "ja" when the answer should be "nee" (about 1 in 10 turns)
  - ask "waarom?" the first time the agent quotes a fact
  - demand a source for any number
  - end the call if the agent contradicts an earlier tool output
forbidden:
  - long sentences
  - politeness rituals after the first turn
  - explaining what you do for a living

Het judge model

De derde component is de judge. Een tweede model leest het transcript na het gesprek en beoordeelt het op vijf dimensies. Vijf, omdat drie te grof is voor een bruikbaar signaal en tien te veel om in één oogopslag door te lezen.

Een judge model is geen perfecte reviewer. Er is een hele body of work over judge bias: voorkeur voor langere antwoorden, voor de eigen modelfamilie, voor een zelfverzekerde toon boven correcte inhoud. De originele LLM-as-a-Judge paper van Zheng et al. is nog steeds het juiste vertrekpunt. We dempen de bias op twee manieren. We gebruiken voor de judge een model van een andere leverancier dan voor de agent. En we kalibreren de judge op een gelabelde set van vijftig echte gesprekken voordat we de score op een nieuwe run vertrouwen.

Waarschuwing

Gebruik nooit dezelfde modelfamilie voor de agent en de judge. De judge geeft de output van zijn eigen familie stilletjes een hogere score, en je laat een deploy door die had moeten falen.

{
  "dimensions": [
    { "name": "factuality",            "weight": 0.30, "fail_below": 0.70 },
    { "name": "scope_discipline",      "weight": 0.25, "fail_below": 0.80 },
    { "name": "tone_match",            "weight": 0.15, "fail_below": 0.60 },
    { "name": "handoff_clarity",       "weight": 0.20, "fail_below": 0.70 },
    { "name": "interruption_recovery", "weight": 0.10, "fail_below": 0.50 }
  ],
  "pass_if": "weighted_score >= 0.75 AND no_dimension_below_floor"
}

Een failure die de rig ving

Bij de logistieke agent vlagde de rig een failure die in een echt gesprek pijnlijk was geweest. De agent had een tool die het eerstvolgende afhaalmoment teruggaf. De tool werkte. Maar toen de scepticus vroeg "waarom is dat het eerste moment?", verzon de agent een reden. Hij zei dat het depot dinsdagmiddag dicht was voor inventarisatie. Die inventarisatie bestond niet.

De judge vlagde het onder factuality op 0.42. Het transcript maakte de failure duidelijk. De fix was één regel toevoegen aan de system prompt: als de tool geen reden teruggeeft, zegt de agent "dat is wat het systeem mij geeft, ik kan een collega laten terugbellen als u de exacte reden wilt weten" en biedt hij een handoff naar een mens aan.

Die fix kostte tien minuten. Dezelfde failure vinden in live gesprekken had weken gekost, en waarschijnlijk één boze mail aan de klant.

Wat de vijf dimensies eigenlijk betekenen

Factuality. Heeft de agent iets gezegd dat niet in de tool output, de kennisbank of basale gedeelde wereldkennis staat. Dit is de dimensie die gehallucineerde redenen, verzonnen prijzen en zelfverzekerd klinkende onzin over bedrijfsbeleid vangt.

Scope discipline. Heeft de agent iets gezegd buiten het script. De goedkoopste manier om het vertrouwen van een klant te verliezen is een mening geven over iets waar je geen mening over hoort te hebben. Een afhaalbevestiging-agent die afdwaalt naar een opmerking over brandstofprijzen heeft al verloren.

Tone match. Klonk de agent als het merk, op hetzelfde energieniveau als de klant. Nederlandse B2B-logistiek is direct. Een agent die opent met "I hope you are having a wonderful morning" heeft de kamer verkeerd ingeschat voordat hij iets anders heeft gezegd.

Handoff clarity. Wanneer de agent besluit dat hij het gesprek niet aankan, zegt hij dat dan helder, met een duidelijke vervolgstap. "Een collega belt u binnen het uur terug" verslaat "let me see if I can find someone who can help with that" met flinke marge.

Interruption recovery. Als de klant de agent onderbreekt, erkent de agent dan de onderbreking en reageert hij op wat er daadwerkelijk is gezegd, of maakt hij zijn vorige zin af alsof er niets is gebeurd. Dit is de dimensie die een acceptabele voice agent scheidt van eentje waar een echt mens mee uithoudt.

Waar de rig in de pipeline past

Voor een nieuwe outbound agent ziet de volledige pipeline die we draaien er zo uit.

  1. Agent bouwen tegen het scripted happy-pad.
  2. Twintig scripted scenario's draaien in de transcript rig.
  3. Twintig adversariële scenario's draaien met de scepticus-persona.
  4. De judge gate passeren op 0.75 gewogen score, geen dimensie onder zijn floor.
  5. Overstappen op een echte audio rig met synthetische stemmen op de STT- en TTS-round-trip.
  6. Vijf echte gesprekken naar interne nummers, opgenomen.
  7. Pilot met één segment echte klanten, handmatig gemonitord.
  8. Volledige uitrol.

Stappen 1 tot en met 4 draaien in CI bij elke wijziging aan de prompt of de toolset. We gaan pas door naar stap 5 als de gate slaagt. Er zijn kant-en-klare eval scaffolds die je hiervoor kunt aanpassen. De OpenAI evals repo is een redelijk startpunt om te forken en in de taal van je klant te herschrijven. Het verschil is in de praktijk dit: de inventarisatie-hallucinatie op zondagavond vangen, of dinsdagochtend, van een warehouse manager in Tilburg.

De judge kalibreren

Eén laatste opmerking over de judge. De eerste keer dat je de rig draait, zit de judge ernaast. Hij laat runs door die een menselijke reviewer zou afkeuren, en hij keurt runs af die een menselijke reviewer zou doorlaten. De fix is niet het model wisselen. De fix is vijftig echte of synthetische transcripts met de hand labelen, de judge erop draaien, en de rubric bijstellen tot de judge het in minstens 85% van de pass/fail beslissingen eens is met de mens.

Dat kost een lange middag. Je doet het één keer per agent. Daarna her-kalibreer je alleen als het domein van de agent verandert of als je het judge model wisselt. Zonder deze stap heb je een getal dat er rigoureus uitziet en niets betekent.

Toen we de outbound voice agent voor de bovengenoemde logistieke klant bouwden, was de eerste versie van onze scepticus te beleefd en miste hij de inventarisatie-hallucinatie drie runs op rij. We herschreven hem platter en drukker, en hij ving de failure bij de volgende pass. Als je outbound voice agents uitbrengt en je laatste niet door een scepticus en een judge hebt gehaald, is de audit die deze week de moeite waard is: schrijf de scepticus in de feitelijke taal van je klant, scoor eerst op factuality, en gate de deploy op het resultaat.

Kern

Voordat een outbound voice agent een echte klant belt, laat je hem draaien tegen een scepticus in de taal van de klant, en gate je de deploy op de score van een apart judge model.

FAQ

Mogen het agent model en het judge model hetzelfde zijn?

Nee. Een judge geeft output uit zijn eigen modelfamilie meestal een hogere score. Gebruik voor de judge een andere leverancier, of in elk geval een ander modelformaat, en kalibreer tegen menselijke labels.

Hoeveel adversariële scenario's zijn genoeg?

Twintig is een redelijke ondergrens voor een outbound agent met één doel. Elk scenario moet een andere failure mode raken: weigering, onderbreking, hallucinatie-aas, scope drift, plotselinge taalwissel.

Vervangt de transcript rig het testen met echte gesprekken?

Nee. Hij gate't het. De transcript rig vangt de logische failures goedkoop af. Je hebt nog steeds een echte audio rig en een kleine pilot nodig vóór de volledige uitrol, om barge-in, stiltes en STT-failures te vangen.

Wat als de agent in een andere taal dan Nederlands draait?

Zet de scepticus vast op die taal en schrijf de persona in die taal. Een vertaalde scepticus-prompt mist het register en idioom dat echte klanten gebruiken om terug te duwen.

voice agentsai agentstoolingoperationsautomation

Iets bouwen?

Start een project