Dewei Zhai

2026-05-10 · bijgewerkt 2026-09-04

Klein budget, serieus gebouwd: hoe deze site en Agent tot stand kwamen

Een kleine Cloudflare- en DeepSeek-stack met deterministische context, aanpasbaar gedrag, live evaluaties en overdracht aan een mens in de chat.

Verantwoordelijkheid Keuze Waarom deze keuze
Websitepagina’s Astro 7 Een framework waarmee ik meer content en minder JavaScript schrijf, vooral geschikt voor artikelen en persoonlijke sites.
Backend-API’s Cloudflare Workers De bijna gratis serverless hosting van Cloudflare, vergelijkbaar met AWS Lambda op een wereldwijd edge-netwerk.
Agentmodel deepseek-v4-flash Het brein van de Agent. Drie maanden kostten ongeveer $1,50: zo goedkoop dat het ongebruikt lijkt, zonder goedkope antwoorden.
Operationele data Cloudflare D1 Door Cloudflare beheerde SQLite. Geen database zelf uitrollen, bij weinig data bijna gratis en precies goed voor chats, berichten en Agentinstellingen.
Continuïteit in de browser localStorage Een klein laatje in de browser. Het bewaart het huidige gesprek op het apparaat van de bezoeker, zodat verversen geen geheugenverlies veroorzaakt.
Bescherming tegen misbruik Turnstile + D1-rate-limits De ene controleert of een bezoeker op een bot lijkt; de andere voorkomt dat iemand de Agent de financiële afgrond in vraagt.
Berichtmeldingen Resend Een e-maildienst die via een API werkt, zonder SMTP te configureren.
Releasepad GitHub → Cloudflare Worker Hier valt weinig over te zeggen; dit is inmiddels de standaardroute.

De “RAG” is bewust eenvoudig

Ik gebruik momenteel geen Vectorize of vectordatabase. Bij ieder verzoek wordt stabiele kennis in de systeemprompt samengesteld: profielfeiten, geselecteerde casesamenvattingen, datum, tags, titel en beschrijving van ieder artikel, canonieke offers, actuele instellingen en een kleine FAQ. De volledige artikeltekst wordt niet geïnjecteerd.

De statische prompt was bij meting ongeveer 27.000 tekens, 4.068 woorden of circa 6.000–8.000 tokens. De chat bewaart maximaal 20 berichten van elk maximaal 4.000 tekens. Zelfs een extreem gesprek blijft rond 25.000–30.000 inputtokens, terwijl DeepSeek een contextvenster van 1M tokens publiceert.

Deterministische contextassemblage is een afweging: kritieke feiten zijn altijd aanwezig, er is geen retrieval-miss en er is geen lifecycle voor embeddings, indexsync, chunking of reranking. Het gedrag is ook beter reproduceerbaar.

Ik heroverweeg vector retrieval wanneer statische kennis ongeveer 50.000 tokens overschrijdt, totale input regelmatig boven 100.000 tokens komt, latency of kosten stijgen, of evaluaties relevantieverlies aantonen. Een volgende stap zou hybride zijn: identiteit, veiligheid, offers en actuele instellingen blijven vast; lange artikelen en cases worden opgehaald.

De lengte van de prompt is niet het enige signaal. Ik bouwde een systeem voor promptkwaliteit dat voortdurend twee vragen beantwoordt: hoe de Agent nu presteert, en of een fout komt door gedragsregels, ontbrekende kennis of context die groot genoeg is geworden om retrieval te rechtvaardigen.

De eerste laag draait na ieder echt antwoord. De bezoeker krijgt het antwoord normaal; zodra het is opgeslagen, maakt de Worker op de achtergrond een shadow evaluation. Een aparte evaluator ziet de laatste acht berichten, de actuele gespreksstatus, de verwachte taal en het antwoord. Hij scoort van 0 tot 100 op begrip van de behoefte, onderbouwde feiten, een natuurlijke volgende stap, taal, vertrouwen en geduld, het vermijden van voortijdige of formulierachtige intake en een bewerkbare handoff in de chat wanneer die nuttig is. Slagen vereist minstens 80 punten zonder materiële fouten in routing, feiten, taal of druk. Score, conclusie en redenen worden per exact antwoord in D1 opgeslagen.

echt antwoord → shadow evaluation op de achtergrond → score + pass/fail + redenen → D1

De tweede laag is voor promptwijzigingen. Codex simuleert adviesklanten, projectklanten, recruiters en informatieve bezoekers met verborgen waarden voor vertrouwen en geduld. DeepSeek antwoordt; vaste checks vinden verkeerde taal, verkeerde routing, verzonnen feiten, prompt leakage en te vroege contactdruk; een onafhankelijke AI judge scoort routing, behoefteanalyse, vertrouwen en efficiëntie. Daarna krijgt een kandidaatprompt vaste gesprekken van twee beurten tegen de echte website. Alleen een volledig geslaagde suite kan worden geactiveerd; een slechte versie kan worden teruggedraaid.

Eén lage score betekent niet automatisch “RAG toevoegen”. Als de feiten al in de volledige prompt staan en de fout over toon, routing of vraagstelling gaat, pas ik het gedrag aan. Retrieval wordt gerechtvaardigd wanneer groeiende context herhaaldelijk relevance- of groundingproblemen veroorzaakt en ook tokengebruik, latency of kosten de drempels passeren. RAG is zo een door evaluatie gedreven architectuurwijziging, geen vooraf geïnstalleerd onderdeel om het systeem geavanceerder te laten lijken.

Niet iedere kenniswijziging vereist een nieuwe release

Alle informatie in de prompt stoppen roept een praktische vraag op. Moet ik de code aanpassen en de site opnieuw uitrollen wanneer mijn voorkeuren voor werk, mijn diensten of de gespreksstijl van de Agent veranderen?

Nee.

Feiten die relatief vaak veranderen—of ik een vaste baan overweeg, bijvoorbeeld—staan in een FAQ in het beheerscherm. Na een wijziging gebruikt de Agent het nieuwe antwoord in het volgende gesprek.

Ook het gespreksgedrag kan ik afzonderlijk aanpassen. In een echte test vroeg de Agent een recruiter in één keer om zeven gegevens. Het voelde als een formulier. Ik wijzigde de regel in: “begin met één open vraag en stel in het hele gesprek maximaal één actieve vervolgvraag.” Daarna testte ik de wijziging tegen de echte website. Een geslaagde versie kan ik activeren; een slechte versie kan ik terugdraaien.

Chats verwijderen, berichten opslaan en rechten controleren blijven in code. Een prompt is geschikt om te beïnvloeden wat de Agent zegt. Hij hoort niet te beslissen of data daadwerkelijk is verwijderd.

Hoe de Agent gesprek voor gesprek werd bijgesteld

Voor de lancering gaf ik de Agent één doel: bezoekers helpen om Dewei’s ervaring, sterke punten en manier van werken te begrijpen. De eerste kennisbank schreef ik niet als een complete handleiding. Ik liet een AI mij interviewen over wat ik had gebouwd, waar ik goed in was, waar ik niet paste en welke opdrachten ik wilde aannemen. Daarna liet ik de antwoorden destilleren tot een profiel, cases en regels. Ik voegde datum, tags, titel en beschrijving van mijn bestaande artikelen aan de prompt toe en zette de site online.

Het werkte, maar de Agent kon nog niet bijzonder goed praten.

Soms negeerde hij de taal van de bezoeker. Hij wist niet of ik een vaste baan zou overwegen. Een recruiter met een eenvoudige vraag kreeg een lijst van zeven velden. Een interessante functie werd meteen een harde “MATCH”. Ook bracht de Agent een afgeschafte gratis call terug of verklaarde hij zonder genoeg informatie dat tien weken haalbaar was.

Het probleem was niet te weinig informatie. De Agent wist niet goed hoe hij de bestaande informatie moest gebruiken.

Na een tijdje analyseerde ik echte gesprekken en groepeerde ik bezoekers als consultkopers, projectklanten, recruiters en mensen die alleen een antwoord zochten. Hun doelen verschilden en hun geduld was beperkt.

Iedere gesimuleerde bezoeker kreeg twee onzichtbare waarden: vertrouwen en geduld. Een direct antwoord verhoogt vertrouwen; ontwijken, verzinnen en te vroege contactdruk verlagen het. Iedere extra beurt en overbodige alinea kost geduld. De test controleert ook of de bezoeker antwoord kreeg of bij de juiste volgende stap uitkwam.

De lus is eenvoudig:

Codex simuleert de bezoeker → DeepSeek antwoordt → AI geeft een score → ik wijzig één of twee dingen → opnieuw testen.

Zo werd een recruiterformulier met zeven velden één open vraag, werd een automatische “MATCH” vervangen door “serieus het overwegen waard”, bleven uitvoerende projecten weg van consultproducten en mocht de Agent niet langer beweren dat een klantcase “vergelijkbaar” was om overtuigender te klinken.

Daarna beoordeelt een onafhankelijke AI alle regels. Lokaal slagen is nog niet genoeg: ik test drie representatieve gesprekken van twee beurten op de echte website—een consult, projectuitvoering en werving voor een vaste functie. Tot slot lees ik de gesprekken zelf en stel ik een eenvoudige vraag:

Wil ik dat deze Agent mij op deze manier vertegenwoordigt?

Bevestigde feiten en grenzen komen in de FAQ, prompt of code. De manier waarop de Agent praat blijft via dezelfde lus evolueren. Hij is niet in één keer ontworpen, maar uit echte gesprekken bijgesteld.

Uiteindelijk zorgt AI alleen dat het gesprek duidelijk is

De Agent kan vragen beantwoorden en een eerste fit beoordelen, maar kan geen werk voor mij aannemen of toezeggingen doen. Wanneer een beslissing mij nodig heeft, maakt hij in de chat een bewerkbare samenvatting. Pas na bevestiging door de bezoeker komt het bericht in mijn inbox—zonder dat die naar een ander formulier wordt gestuurd.

Chatgesprekken worden maximaal 90 dagen bewaard en kunnen eerder door de bezoeker worden verwijderd. Een bericht dat afzonderlijk is gecontroleerd en bevestigd blijft bewaard. Die grens wordt door code afgedwongen, niet ter plekke door de prompt bedacht.


Gedachten hierover? Praat erover met mijn agent, of stuur me een bericht.