RAG
Field-service RAG: papier vervangen bij installateur
Het is 18:40 op dinsdag in Eindhoven. De officemanager heeft 23 papieren werkbonnen op haar bureau liggen, elk in een ander handschrift, allemaal voor morgenochtend in Exact Online.

18:40 op een dinsdag in Eindhoven
De officemanager heeft 23 papieren werkbonnen op haar bureau liggen. Elke bon in een ander handschrift. Elke bon moet morgenochtend in Exact Online staan, want de boekhouder sluit de week op woensdag. Ze pakt het bovenste vel. De monteur schreef Vitodens 100-W, gewisseld, plus 3x flexkoppeling 22mm, 1.5u arbeid, klant tekent voor akkoord. Ze opent het project in Exact, typt het materiaal in, kiest de uurcode, hangt de scan van de bon eraan. Drieënveertig toetsaanslagen per klus. Dat doet ze nu al elf jaar elke werkdagavond.
Dit is het probleem dat we in februari mochten oplossen. Het bedrijf is een installateur met 41 mensen in de regio Eindhoven. Twaalf servicebussen, drie leerlingen, één kantoor. Hun gereedschap is uitstekend: bestickerde bussen, gekalibreerde lekdetectoren, gecertificeerde monteurs, een Volvo-dealerplaat boven de werkplaatsdeur. Hun dataflow eindigt bij een klembord.
Waarom het papier het zo lang volhield
Elke eerdere poging om hun werkbonnen te digitaliseren liep om dezelfde reden vast. De bonnen zijn geen formulieren. Het zijn notities. Een monteur schrijft ketelaanvoer 62 graden, retour 41, modulatie ok, klant klaagde over tikken in radiator 1e verdieping, niet gevonden. Die zin moet vertaald worden naar: één arbeidsregel, eventueel één materiaalregel als er iets gewisseld is, een projectnotitie voor de volgende servicebeurt en een follow-up-vlag voor de planner. Geen enkele standaard field-service-app doet die vertaling. Ze geven je een formulier met checkboxes en de monteurs negeren dat, omdat de klant naast ze staat en wil praten over het getik in de radiator.
Dus hield het bedrijf het papier aan. De rekening werd betaald door de officemanager, na werktijd. Twee eerdere leveranciers hadden ze een iPad-app en een tablet-formulierbouwer aangepraat. Beide pilots stortten binnen een maand in. De monteurs weigerden te typen. Ze schreven op papier en voerden het formulier vervolgens om 18:00 in het depot opnieuw in op de tablet. De tablet voegde een stap toe, hij haalde er geen weg.
Hoe de herbouw eruitziet
We hebben geen app gebouwd. We hebben een kleine assistent gebouwd die op de telefoon van de monteur leeft, aan het einde van elke klus een foto plus een spraakmemo van 20 seconden opneemt, en daarmee een conceptregel voor Exact Online genereert die de officemanager de volgende ochtend op haar laptop goedkeurt. De spraakmemo is het dragende stuk. Monteurs typen niet op een telefoon met koude handen om 17:00 in november. Wel praten ze ertegen.
De flow ziet er zo uit:
telefoon (PWA)
├─ foto van de papieren bon (nog steeds nodig voor garantie)
├─ spraakmemo 20s in het Nederlands, vaak Brabants accent
└─ gestructureerde velden: projectnummer, eindtijd, handtekeningscan
│
▼
edge function (Supabase)
├─ Whisper-transcriptie (nl) met eigen vocab
├─ RAG over: SKU-catalogus, uurcodes,
│ contractvoorwaarden klant, merkglossary
└─ gestructureerd concept → Exact Online (staging-tabel)
│
▼
kantoorlaptop (web-UI)
├─ side-by-side: papieren scan | conceptregel
├─ goedkeuren met één klik → push naar Exact
└─ afgewezen regels gaan naar een correctielog
De PWA was een bewuste keuze. Monteurs updaten hun Android-telefoon hooguit eens in de twee jaar, als ze het al doen. Een native app had elke keer een geforceerd upgrade-gevecht betekend zodra de SKU-catalogus van de groothandel verandert, en dat gebeurt op een eigen schema. De PWA ververst stilletjes op de achtergrond en wij bepalen het tempo van de rollout.
Waarom dit echt een RAG-probleem is
Met alleen een LLM kom je een procent of zestig ver. Die maakt van drie flex 22mm een plausibele materiaalregel en hangt er een plausibele uurcode aan. Plausibel is niet goed genoeg voor de boekhouding.
De materiaalcatalogus heeft 4.200 SKU's. Er zijn zes verschillende flex 22mm-SKU's, afhankelijk van of de koppeling voor water is, gas, cv, zonneboiler of één van twee garantievarianten. De verkeerde keuze betekent 12 euro margefout per bus per dag. Vermenigvuldigd over twaalf bussen en 220 werkdagen is dat het salaris van de officemanager.
Dus we hebben de agent gegrond op de drie eigen bronnen van waarheid van het bedrijf: de SKU-tabel van hun groothandels (Technische Unie en Itho Daalderop), de uurcodelijst gespiegeld vanuit Exact, en een merkglossary die we met de hand hebben opgesteld met de seniormonteur op twee middagen in de werkplaats. Die glossary is de onbezongen held. Hij mapt Vito naar Viessmann, Inti naar Intergas, ketel naar de juiste boilerlijn-familie, en een lange lijst regionale uitspraakvarianten naar de producten die de monteurs eigenlijk bedoelen. De originele RAG-paper van Lewis et al. framede retrieval als manier om feitelijke grounding in generatie te injecteren. In een installateur met 41 mensen zijn de feiten: welke SKU, welke uurcode, welke contractclausule.
De grounding-stap zelf is klein. Het werk zit in het eerlijk houden van de indexen.
def ground_voice_note(transcript: str, project_id: str) -> dict:
sku_hits = sku_index.search(transcript, k=8)
hours = hour_codes_for_project(project_id)
glossary = brand_glossary.expand(transcript)
contract = contract_terms_for(project_id)
prompt = build_prompt(
transcript=transcript,
sku_candidates=sku_hits,
hour_codes=hours,
glossary_hints=glossary,
contract_clauses=contract,
)
return draft_entry(prompt) # returns Exact-shaped JSON
Het probleem met het Brabants accent
Whisper is goed in Nederlands. Hij is minder goed in het zachte, zangerige Brabants dat een monteur spreekt terwijl hij tegen een Vitodens leunt met een ventilator op de achtergrond. De eerste pilotweek liet een woordfoutpercentage van 14% zien op monteursaudio, tegenover 4% op de referentieopnames van de officemanager. Dat verschil bepaalt of een agent bruikbare concepten levert of SKU's verzint.
We hebben twee dingen gedaan. We hebben een klein bestand met eigen vocab fijn afgesteld (zo'n 600 termen: SKU-stammen, merkfamilies, monteursjargon) en dat in de transcriptiestap meegegeven. En we hebben een betrouwbaarheidsdrempel op het transcript zelf gezet. Zakt de logprob van Whisper voor een named entity in de audio onder de drempel, dan gokt de agent niet. Hij weigert het concept en stuurt de monteur een seintje om opnieuw op te nemen. Nadat het vocab-bestand live ging, daalde het woordfoutpercentage op monteursaudio naar 6%. Goed genoeg.
De Exact Online-integratie
Exact Online is de saaie helft van dit verhaal en de helft die 60% van de bouw kostte. Hun REST API is functioneel, maar niet royaal. Eén projecturenregel heeft de project-GUID nodig, de item-GUID, de uurtype-GUID, een datum, een kostenplaats, en (voor materiaal) een aparte verkoopfactuurregel als de klant op een per-call-contract zit. Zes lookups voordat je één rij kunt wegschrijven.
We cachen agressief. De projectlijst ververst elke vijftien minuten. De materiaalcatalogus ververst één keer per nacht tegen de groothandelfeed. Uurtypes en kostenplaatsen veranderen nooit, dus die staan in een statische tabel die de agent uit het geheugen leest. Op het hot path van de agent zit precies één Exact-write per goedgekeurde regel, en nul reads. Dat is wat van een concept een geboekte regel maakt in 22 seconden.
De API van Exact Online dwingt een rate limit per divisie af die niet zichtbaar is in de UI. We liepen er in pilotweek twee tegenaan toen de officemanager 60 regels in één minuut in bulk goedkeurde. Strooi writes over maximaal acht per seconde per divisie, en lees de X-RateLimit-headers op elke response. Een retry-storm tegen Exact zet je OAuth-token de rest van de dag op zwijgen.
Die 22 seconden, ontleed
Het kerngetal is precies omdat we elke stap hebben gemeten:
- Upload van de spraakmemo en Whisper-transcriptie: 4,1s mediaan
- RAG-retrieval over de drie indexen: 0,7s
- Conceptgeneratie met de gegronde context: 6,8s
- Beoordeling van de side-by-side weergave door de officemanager: ongeveer 9s menselijke tijd
- Goedkeuren, dan Exact-write, dan bevestiging: 1,4s
Totale wandkloktijd van spraakmemo tot geboekt in Exact: 22 seconden mediaan, 38 seconden p95. De oude werkwijze kostte op een goede dag twee minuten en veertig seconden per klus, en daar zat het scannen nog niet bij.
Waar die 14 uur vandaan kwamen
De officemanager registreerde haar tijd twee weken voor en vier weken na de livegang. Voor: 17,5 uur per week aan werkbonverwerking, inclusief het scannen, het invoeren, monteurs achternajagen voor onleesbaar handschrift en de woensdagochtendreconciliatie met de boekhouder. Na: 3,5 uur per week, vrijwel allemaal aan de side-by-side beoordeling en het log met afgewezen regels. Netto besparing: 14 uur per week. Ze gaat nu vier van de vijf dagen om 17:00 naar huis in plaats van 19:00.
De monteurs bespaarden ook tijd, al was het minder. De gemiddelde administratie aan het einde van een klus daalde van zes minuten (formulier invullen, handtekening ophalen, vel fotograferen voor de eigen administratie) naar twee minuten (papieren bon fotograferen die voor de garantie nog steeds nodig is, plus de spraakmemo van 20 seconden). Het papier is er nog omdat de garantievoorwaarden van twee van hun ketelleveranciers expliciet een papieren handtekening op een vel in hun eigen format eisen. Dat gevecht zijn we niet aangegaan. Dat is in jaar één de verkeerde keuze.
De weigeringslogica die het vertrouwen van de officemanager won
De agent weigert een concept onder vier voorwaarden: spraakmemo korter dan vier seconden, foto onleesbaar onder een scherptedrempel, transcriptbetrouwbaarheid onder de vloer voor een named entity, of een SKU-kandidaat waarvan de top-match een similarity-score onder 0,72 heeft. Het weigeringspercentage stabiliseerde op 6%, vrijwel allemaal op klussen die na 18:00 in het donker doorliepen.
Die weigeringen gaan terug naar de telefoon van de monteur met één regel: opnieuw opnemen, foto te donker. De monteur lost het binnen 30 seconden op vanuit de bus. Die ene guardrail was het verschil tussen een agent die de officemanager vertrouwt en een die ze constant moet babysitten. Een agent die 94% van de klussen onbewaakt goed doet, is meer waard dan een die er 98% goed doet maar waarbij de manager nooit kan zien welke 2% fout is zonder elke regel te lezen.
Lessen uit de herbouw
Drie dingen die we weer zo zouden doen. Eén: uitleveren als PWA. Monteurs updaten telefoons in geologische tijd. Een PWA wordt direct gefixt als de catalogus verandert. Twee: schrijf de merkglossary met de hand, met de seniormonteur erbij, voordat je het model aanraakt. De glossary is het institutionele geheugen van het bedrijf en het staat in geen enkele catalogus. Drie: behandel het ERP-schrijfpad als het lastigste onderdeel van het systeem. De agent mag fout zitten en herstellen. Een dubbel geboekte regel in Exact niet.
Twee dingen die we anders zouden doen. De buffer voor de spraakmemo stond eerst op 60 seconden, en dat is te lang. Monteurs vullen die tijd met geklets dat het model in de war brengt. We hebben hem op 20 seconden gezet en de kwaliteit van de concepten ging omhoog. En we hadden het log met afgewezen regels vanaf dag één moeten bouwen. We zetten dat er pas in week drie bij en het werd het meest bruikbare onderdeel van het systeem. Het is de audit trail van de officemanager en de data waarmee we de SKU-disambiguatie scherp houden.
Wat je deze week kunt doen
Heb je een servicebedrijf met papieren werkbonnen en een ERP achter de schermen, dan heb je geen pilot met 41 mensen nodig om te zien of dit voor jou werkt. Pak tien opeenvolgende werkbonnen van vorige week. Schrijf per bon op welke velden er precies in je ERP belanden. Tel de lookups per regel. Zijn dat er meer dan drie, en zit je officemanager hier na werktijd mee, dan ligt de casus voor een agent er al. Het zware werk zit in de glossary en de ERP-integratie, niet in het model.
Toen we deze RAG-agent bouwden voor de Eindhovense installateur, was het ding dat we steeds onderschatten hoeveel van het werk buiten het model gebeurt. De retrieval-index kostte een week. De merkglossary kostte twee middagen. Het Exact Online-schrijfpad, het afhandelen van de rate limits en de weigeringslogica kostten zes weken. Dat is de vorm van elke field-service-herbouw die we tot nu toe hebben opgeleverd.
Kern
In field-service RAG is het model het makkelijke deel. De merkglossary, de ERP-rate-limits en de weigeringslogica zijn wat het vertrouwen van de officemanager wint.
FAQ
Waarom een PWA en geen native iOS- of Android-app?
Monteurs updaten hun telefoons zelden. Met een PWA duwen we wijzigingen in catalogus en prompts direct door zonder een geforceerde upgrade-cyclus af te wachten, en we vermijden de app-store-review helemaal.
Hoe voorkom je dat de agent SKU's verzint?
Grounden op de groothandelcatalogus plus een betrouwbaarheidsdrempel per entity. Komt de top-SKU-match onder 0,72 similarity, dan weigert de agent een concept en vraagt hij de monteur om opnieuw op te nemen.
Waarom houden jullie de papieren bon eigenlijk nog?
Twee van de ketelleveranciers eisen voor garantiegeldigheid een papieren handtekening op hun eigen formulier. Dat gevecht was in jaar één de moeite niet waard. Het papier wordt gefotografeerd en door de agent verder genegeerd.
Hoe lang duurde de volledige bouw?
Elf weken van kickoff tot uitrol bij de officemanager. Zes van die weken waren de Exact Online-integratie, de rate-limit-afhandeling en de weigeringslogica. Het model- en retrieval-werk kostte minder dan drie weken.
Werkt de agent ook in dialect of alleen in standaard-Nederlands?
Allebei, nadat we voor Whisper een eigen vocab-bestand van 600 termen fijn hebben afgesteld. Het woordfoutpercentage op Brabants Nederlands daalde van 14% naar 6% nadat dat vocab live ging.