Cursussen AI in je bedrijf Week 8 Les 30 / 33

Case 2: semi-automatische email-triage

Hoe je 80% van je inbox voorsorteert zonder fouten

Maandagochtend. Je opent je inbox en ziet 73 nieuwe berichten. De helft is ruis, een paar zijn urgent, drie vragen vanavond antwoord of je raakt een klant kwijt. Voordat je aan het écht-werk toekomt, ben je een uur kwijt met uitzoeken wát werk precies is. In deze les bouw je een semi-automatisch triage-systeem: mails worden gesorteerd, gelabeld, gepriori­seerd, en voorzien van concept-antwoorden. Jij blijft aan het roer, maar je roer is kleiner.

De grote ontwerpbeslissing

Semi, niet volledig automatisch. De AI stuurt geen antwoord zonder jouw klik. Waarom? Omdat e-mail een kanaal is waar fouten reputatieschade opleveren. Een verkeerd toegewezen factuurvraag of een ongelukkig geformuleerd antwoord landt rechtstreeks bij je klant. Het is goedkoper voor jou om drie seconden op "verzenden" te klikken dan om één keer een boze klant te verliezen.

De winst zit daarom niet in verzending, maar in voorbereiding: classificatie, prioriteit, concepttekst, context-verrijking. Als jij je inbox opent en álles al keurig is gesorteerd mét antwoordconcept erbij, ben je twee derde van je tijd kwijt.

De flow

  1. Ophalen. Een PHP-cronjob haalt elke vijf minuten nieuwe mails op via IMAP.
  2. Classificatie. Elke mail gaat naar een klein model (Haiku) dat hem in één categorie plaatst: factuur, support, sales, spam, intern, overig.
  3. Prioriteit. Hetzelfde model schat urgentie in: hoog, midden, laag.
  4. Concept-antwoord. Voor relevante categorieën (support, sales) genereert Sonnet een concept-antwoord op basis van je kennisbank en klantgegevens.
  5. Presentatie. Je dashboard toont de gesorteerde inbox met label, prioriteit, concept. Jij leest, klikt akkoord of past aan, verstuurt.
✦ Twee modellen, twee doelen

Classificatie is een simpele taak die Haiku prima af kan. Concept-generatie vraagt redactioneel niveau — daar zet je Sonnet in. Door taken te splitsen betaal je voor het dure model alleen waar het nodig is. Alle 73 mails door Opus halen zou 20 keer duurder zijn zonder meetbare winst.

De classificatie-prompt

Klein, strak, één outputveld. De prompt vertelt Haiku exact welke labels er zijn en dwingt hem tot keuze. Structured output laat je het model antwoorden met JSON: {"categorie": "support", "prioriteit": "midden", "kernvraag": "Garantie op bespannen racket"}. Die kernvraag is handig voor de jump-to-inhoud in je dashboard.

Waar het fout gaat: mails met meerdere vragen (een factuur-klacht verpakt in een support-e-mail). Oplossing: sta een tweede label toe, of accepteer dat de mens in de lus die nuance soms zelf maakt. Perfecte classificatie is niet het doel; 85% correct met de rest als "overig" is prima.

Concept-antwoord met grounding

Voor de concept-stap koppel je de klantdata en je eigen kennisbank aan. Bij een support-vraag over garantie haalt je backend de bestellingen van die klant op én het relevante stuk uit je garantie-beleid. Die stukken komen als context in de prompt. Sonnet schrijft op basis daarvan een concept in jouw huisstijl.

De systeem-prompt is hier cruciaal: "Schrijf in warme, zakelijke toon in het Nederlands. Maximaal drie alinea's. Geen toezeggingen over retourgeld, garantie-uitbreidingen of kortingen zonder expliciete instructie. Verzin geen productdetails. Als het antwoord niet uit de context volgt, schrijf dan een korte bevestigingsmail dat de vraag wordt doorgezet naar een medewerker."

Die laatste zin is de escape-hatch. Betere concept-mails kun je niet schrijven als er geen antwoord is — beter dat het model dat toegeeft dan dat het iets verzint.

IMAP in PHP

De IMAP-extensie in PHP 8.3 is deprecated maar werkt nog; steeds meer solo-bouwers kiezen voor de pakketten webklex/php-imap of ddeboer/imap. Wat je nodig hebt: connectie, mailbox openen, sinds-laatste-poll messages ophalen, payload parseren (html + plaintext), bijlagen voor zover relevant, X-header-based deduplicatie zodat je dezelfde mail niet twee keer verwerkt.

De cron draait elke vijf minuten. Een tabel mail_triage bewaart message-id, afzender, onderwerp, body-plaintext, classificatie, prioriteit, conceptantwoord, status (nieuw, goedgekeurd, verzonden, genegeerd). Je dashboard is een simpele view op die tabel met knoppen. Geen microservice-architectuur nodig. Een enkele MySQL-tabel en een cronjob doet het werk.

✦ Geen uploads, geen uploads

Bijlagen van inkomende mail niet naar je VPS schrijven tenzij het noodzakelijk is voor de taak. Een factuur-PDF uitlezen? Stream de bytes naar de parser, verwerk in memory, gooi weg. Bewaren = AVG-risico en opslagkosten. Voor triage is de metadata en de body genoeg.

Foutafhandeling — waar het vastloopt

Onvermijdelijk gaat er iets mis. De IMAP-connectie valt uit. De AI-API retourneert een 529 (overloaded). Een mail is 200.000 tekens aan HTML-spam. Je structured output parseert toch niet. Je moet dit niet in productie ontdekken.

Eisen aan je cronjob: elke fase met try/catch, elke fout in een log-tabel met message-id, tijdstempel en exception. Bij AI-failures: exponential backoff (1s, 2s, 4s) en na drie pogingen de mail markeren als "triage-fail" zodat hij alsnog handmatig in je inbox zichtbaar is. Nooit een inkomende mail verloren laten gaan — het ergste scenario is dat een klant nooit antwoord krijgt omdat een stille fout hem uit de flow heeft gegooid.

Lange mails: cap op bijvoorbeeld 20.000 tekens body voor je naar de classificator stuurt. Daarboven eerste 20k gebruiken of eerst een samenvatting laten maken met Haiku. Je hebt zelden meer dan een paar duizend tekens nodig om de categorie te weten.

Sample-review procedure

Eenmaal per week (zet het in je agenda) pak je twintig random mails uit je triage-tabel en controleer je of de classificatie klopte en of het concept goed was. Dit is je eigen eval-set op productie-data. Afwijkingen noteren: waar zit de fout, is het een edge case, kan de prompt hier beter op?

Na drie maanden heb je een dataset van je eigen soorten mails, je eigen fouten, en gerichte prompt-aanpassingen die niet uit een tutorial komen maar uit jouw bedrijf. Dat is de echte waarde van semi-automatisering: de menselijke blik blijft dwingend, maar wordt gerichter.

Uitbreidingen — als de basis staat

Interessant worden de uitbreidingen zodra de basis rustig draait. Automatische toewijzing aan collega's als je team groeit. Detectie van dubbele klantvragen (dezelfde persoon in drie dagen drie keer over hetzelfde — misschien een systeemfout ergens). Trigger op sentiment: boze mails meteen boven aan je stapel. Koppeling met je CRM zodat elk contact automatisch wordt vastgelegd. Langzaam schuift het systeem op van "leest je mail voor je" naar "vertelt je welke dag je hebt".

Geen daarvan is nodig om waarde te halen. De eerste cronjob met labels en concepten is al goud. Alles daarna is garnering.

Kosten, indicatief

Classificatie van 1.000 mails per maand met Haiku, ongeveer 500 tokens per mail: zo'n 0,50 dollar. Concept-generatie voor 30% van die mails (de relevante) met Sonnet, gemiddeld 3.000 tokens input en 500 output: ongeveer 5 dollar. Totaal: onder de tien dollar per maand voor een systeem dat een uur per dag aan sorteerwerk wegneemt. Dit soort verhoudingen maakt AI-automatisering voor solo-bedrijven economisch vanzelfsprekend.

Drie dingen om mee te nemen

  1. Semi is de kracht. Laat de AI voorbereiden, laat de mens beslissen. Dat is waar de snelheidswinst én de veiligheid samenvallen.
  2. Twee modellen, twee prijsklassen. Haiku voor classificatie, Sonnet voor concepten. Factor tien goedkoper dan alles door het dure model halen.
  3. Faal zichtbaar. Geen enkele mail mag stil verdwijnen. Exceptions loggen, retry-logica, hand-over bij aanhoudende fouten.

In de volgende case bouw je een kennisbank waar je AI op leunt in plaats van op zijn trainingsgeheugen. RAG op je eigen documenten.

Tot dan. Blijf scherp.

Cursus
↑ Overzicht