AI-chatbot met je eigen data

Je wilt een chatbot die jouw handleidingen, contracten of kennisbank kent. De korte versie: je traint daar geen model voor bij, je haalt bij elke vraag de juiste passage uit je eigen documenten op en stuurt die mee. Dat heet ophalen bij de bron, in het Engels retrieval augmented generation of RAG. Hieronder lees je wat er precies gebeurt, waarom antwoorden alsnog misgaan en wat je vooraf moet regelen.

Terug naar OneDayBuild
01 / 06

Ophalen in plaats van bijtrainen

Het wezenlijke onderscheid: pas je het model aan, of laat je het model ongemoeid en voer je het per vraag de juiste tekst?

Er zijn twee routes naar een chatbot die jouw stukken kent. Bij de eerste pas je het model zelf aan, bijtrainen of finetunen. Bij de tweede blijft het model zoals het is en zoek je bij elke vraag de relevante passages uit je eigen documenten op, om die als context met de vraag mee te sturen. Die tweede route is wat wij ophalen bij de bron noemen, in het Engels retrieval augmented generation, afgekort RAG.

Bijtrainen is bijna nooit het antwoord, en dat komt niet doordat het duur is maar doordat het het verkeerde probleem oplost. Bijtrainen verschuift vooral stijl, toon en vaardigheden. Het is geen betrouwbare manier om feiten in een model te krijgen. Een bijgetraind model kan bovendien niet aanwijzen waar iets staat, kan niet vergeten wat jij uit je archief hebt gehaald, en moet opnieuw de trainingsmolen door zodra er een contract wijzigt. Ophalen bij de bron doet precies het omgekeerde: je documenten blijven een aparte, beheersbare verzameling, je kunt bij elk antwoord de bron tonen, en een nieuwe versie is een kwestie van opnieuw indexeren.

Volledige openheid: wij bouwen dit soort chatbots en we verkopen prototype-dagen. Dit stuk is geschreven vanuit dat werk, niet als onafhankelijke testbank. We hebben geen commerciële band met Google, OpenAI, Qdrant, Weaviate of een van de andere partijen die hieronder ter sprake komen.

02 / 06

Voor wie het wel en niet werkt

De grens loopt bijna precies langs een vraag: staat het antwoord letterlijk in een document, of moet het worden uitgerekend?

Werkt goed voor
  • Vragen waarvan het antwoord ergens letterlijk staat: een clausule, een procedure, een garantietermijn.
  • Verzamelingen die te groot zijn om in hun geheel aan het model mee te geven.
  • Situaties waarin je bij elk antwoord de bron wilt kunnen aanwijzen.
  • Kennis die regelmatig verandert en dus los van het model moet blijven.
  • Interne vragen van medewerkers die nu een collega of een map moeten zoeken.
Loopt vast voor
  • Vragen die een berekening of een totaal vragen in plaats van een citaat.
  • Vragen die het hele bestand moeten overzien, zoals hoeveel contracten er dit jaar aflopen.
  • Documentbergen waarin niemand weet welke versie de geldende is.
  • Antwoorden die zonder menselijke controle rechtstreeks naar een klant gaan.
  • Kennis die alleen in de hoofden van mensen zit en nergens is opgeschreven.
03 / 06

Wat er technisch gebeurt

Drie stappen. Geen ervan is magisch, en dat is precies waarom je ze moet kennen.

Knippen en omzetten

Je documenten worden in stukken geknipt van een paar alinea’s. Elk stuk gaat door een model dat er een lange reeks getallen van maakt. Teksten die inhoudelijk op elkaar lijken, krijgen reeksen die dicht bij elkaar liggen. Waar je knipt, bepaalt of een clausule heel blijft of halveert.

Opslaan in een vectordatabase

Die getallenreeksen gaan in een vectordatabase: opslag die niet op woorden zoekt maar op nabijheid. Gangbaar zijn Pinecone, Qdrant, Weaviate, Milvus en Chroma, plus pgvector als uitbreiding op een gewone PostgreSQL-database.

Erbij zoeken en meesturen

Bij een vraag wordt ook die vraag omgezet naar getallen. De database geeft de dichtstbijzijnde stukken terug en die gaan als context mee naar het model, dat het antwoord formuleert uit wat het meekrijgt. Meer krijgt het niet te zien.

04 / 06

Waarom antwoorden alsnog misgaan

Vrijwel elk verkeerd antwoord komt uit de ophaalstap, niet uit het model. Dit zijn de vier oorzaken die wij het vaakst zien.

  • Slecht geknipte documenten. Een tabel die middenin wordt afgekapt of een clausule die over twee stukken verdeeld raakt, levert tekst op die los gelezen niets betekent. Het model krijgt een half antwoord mee en maakt daar een heel antwoord van. Bij documenten met veel opmaak of scans zit hier het meeste werk; zie ook bestanden en foto’s in je app.
  • Tegenstrijdige bronnen. Staan er twee procedures in je verzameling die elkaar tegenspreken, dan haalt de zoekstap er gewoon één van de twee op. Welke, dat hangt af van hoe de vraag is geformuleerd. De chatbot merkt de tegenspraak niet op en meldt hem dus ook niet.
  • Verouderde versies. Een oude handleiding die nog in de index staat, is voor de zoekstap net zo geldig als de nieuwe. Er zit geen enkel begrip van vervanging in. Wie zijn documenten niet opruimt, krijgt een chatbot die met gezag uit gearchiveerd beleid citeert.
  • Vragen die rekenen vragen. Ophalen levert citaten, geen berekeningen. Wat is de opzegtermijn gaat goed. Hoeveel contracten lopen dit kwartaal af gaat mis, want dat antwoord staat in geen enkel stuk tekst. Zulke vragen horen bij een zoekopdracht op gestructureerde gegevens, niet bij een zoekactie op tekst. Waarom het model dan alsnog een vloeiend en verkeerd antwoord geeft, staat in waarom je AI-chatbot dingen verzint.
05 / 06

Hoe het zich verhoudt tot de alternatieven

Alles meesturen, een ingebouwde documentzoekfunctie gebruiken, of het ophalen zelf bouwen.

Het eenvoudigste alternatief is helemaal geen ophaalmechanisme. Past je hele verzameling in één keer bij het model, dan stuur je hem gewoon integraal mee. Contextvensters zijn de laatste jaren flink gegroeid, dus voor een handvol handleidingen is dat een reëel vertrekpunt en verdwijnt de hele knipvraag. Het wordt traag en verbruikt veel zodra je bij elke vraag alles opnieuw meestuurt, en wat de AI-functies in je app kosten hangt vooral aan die hoeveelheid tekst per vraag.

Bij de grote aanbieders hoef je het ophalen vaak niet meer zelf te bouwen. Google heeft in de Gemini API een ingebouwde documentzoekfunctie die File Search heet: die regelt opslag, knippen, getallenreeksen en het meesturen van de gevonden stukken, verwerkt sinds 2026 ook beeld naast tekst, en kan filteren op metadata en naar paginanummers verwijzen (bron: ai.google.dev en blog.google). OpenAI heeft een vergelijkbare file search-tool met vector stores, eerst alleen in de Assistants API en nu ingebouwd in de Responses API; die oudere Assistants API wordt uitgefaseerd (bron: developers.openai.com). Bij Anthropic bestaat zo’n beheerde variant niet: de ingebouwde tools zijn daar zoeken op het web, pagina’s ophalen en code uitvoeren, dus stuur je bestanden mee of bouw je het ophalen zelf (bron: platform.claude.com).

Wil je de opslag in Europa houden, dan is er echte keuze. Qdrant is een Berlijns bedrijf en Weaviate een Amsterdams, beide open source, dus zelf hosten of hun beheerde variant. Wil je geen extra systeem, dan zet je pgvector op een Europese beheerde PostgreSQL; OVHcloud noemt pgvector expliciet als ondersteunde uitbreiding. Wat het wordt hangt vooral af van waar de rest van je gegevens al staat: zie database kiezen voor je MVP. Zelf bouwen loont als je de knipstrategie, de rechten of de opslaglocatie in eigen hand wilt houden. Moet het model niet bij een kopie kijken maar bij het systeem waar de documenten in staan, dan komt MCP in beeld. En of je een chatbot wilt of iets dat zelf handelt, staat in het verschil tussen een chatbot en een AI-agent.

06 / 06

Ons oordeel

Geen cijfer. Wel twee dingen die op papier moeten staan voordat er iemand begint te bouwen.

Vraag één: welke documenten zijn de waarheid. Niet alles uit de gedeelde map, maar per onderwerp één aangewezen bron met een eigenaar die hem bijhoudt. Zolang die keuze niet is gemaakt, bouw je een chatbot die de tegenspraak in je archief netjes verwoordt, en dat valt pas op als iemand ernaar handelt. Ruim dus eerst op en indexeer daarna. Dit is bijna altijd het echte werk, en het is bewust geen technische taak.

Vraag twee: wie mag wat zien. Rechten horen in de ophaalstap, niet in de instructie aan het model. Filter de stukken op de rechten van de vragensteller voordat ze naar het model gaan, want een regel in de systeemprompt om bepaalde gegevens niet te tonen is geen toegangscontrole. Wat er met persoonsgegevens in zo’n keten gebeurt en wanneer je leverancier verwerker wordt, staat in klantdata in AI-tools en de AVG.

Wat je hiervan in één werkdag kunt vaststellen: neem twintig tot dertig echte vragen van je eigen mensen of klanten, indexeer een afgebakende set documenten en kijk per vraag of het juiste stuk boven komt. Dat is de test die telt, want levert de ophaalstap het verkeerde stuk, dan maakt geen enkel model dat goed. Hoe je zo’n reeks vragen herhaalbaar opzet, staat in AI-functies testen. Voor het bredere beeld is je eigen AI maken het startpunt, en twijfel je of jouw geval in één dag past, loop dan de kan-dit-in-1-dag-check na.

07 / 07

Veelgestelde vragen

Wat is ophalen bij de bron, of RAG?

Ophalen bij de bron is de Nederlandse term voor retrieval augmented generation, afgekort RAG. Je laat het taalmodel ongemoeid en zoekt bij elke vraag de relevante stukken uit je eigen documenten op. Die stukken gaan als context met de vraag naar het model, dat zijn antwoord formuleert uit wat het meekrijgt.

Wat doet een vectordatabase precies?

Een vectordatabase slaat de getallenreeksen op die van je tekststukken zijn gemaakt, en zoekt niet op woorden maar op nabijheid: welke stukken liggen inhoudelijk het dichtst bij de vraag. Gangbare namen zijn Pinecone, Qdrant, Weaviate, Milvus en Chroma, en pgvector als uitbreiding op een gewone PostgreSQL-database.

Moet ik een model bijtrainen op mijn eigen documenten?

Bijna nooit. Bijtrainen verandert vooral stijl en vaardigheden, niet de feitenkennis, en een bijgetraind model kan niet aanwijzen waar iets staat en niet vergeten wat je hebt verwijderd. Verandert een document, dan moet je opnieuw trainen. Ophalen bij de bron houdt je documenten los van het model, dus een nieuwe versie indexeer je simpelweg opnieuw.

Waarom geeft de chatbot een antwoord uit een oude versie?

Omdat de zoekstap niet begrijpt dat een document is vervangen. Een oude handleiding die nog in de index staat, is voor die stap net zo geldig als de nieuwe. Dit los je op in het beheer: wijs per onderwerp één geldende bron aan, haal verouderde versies uit de index en indexeer opnieuw bij elke wijziging.

Kan de chatbot rekenen met de cijfers uit mijn documenten?

Niet betrouwbaar. Ophalen levert citaten, geen berekeningen. Een vraag naar een totaal, zoals hoeveel contracten er dit kwartaal aflopen, heeft een antwoord dat in geen enkel stuk tekst staat. Daarvoor heb je een zoekopdracht op gestructureerde gegevens nodig, dus een database of een rekenstap naast de chatbot.

Hoe regel ik wie welke documenten mag zien?

In de ophaalstap, niet in de instructie aan het model. Filter de stukken op de rechten van de vragensteller voordat ze naar het model gaan. Een instructie in de systeemprompt om bepaalde gegevens niet te tonen is geen toegangscontrole: zodra een stuk in de context zit, kan het in het antwoord belanden.

Liever een chatbot die jouw documenten kent?

Stuur ons je twintig meestgestelde vragen en een paar documenten. Wij kijken in een intake mee welke bron de waarheid is en leveren in één werkdag een klikbaar prototype dat antwoordt uit jouw eigen stukken.