Een AI-chatbot toevoegen aan een Drupal-site is niet hetzelfde als een widget inbouwen. Een widget staat boven op je site en weet er niets van. Een chatbot die de moeite waard is, leest je content via Drupal zelf, en dat is het verschil tussen iets dat vragen beantwoordt en iets dat gokt.
Waarom Drupal dit makkelijker maakt dan de meeste CMS'en
Drupal bevat al gestructureerde informatie die een chatbot nodig heeft en anders zelf zou moeten verzinnen. Contenttypes zeggen wat voor soort ding elke pagina is. Taxonomie zegt hoe jouw organisatie kennis groepeert. Revisiedata zeggen wat actueel is. Het node access-systeem zegt precies wie wat mag lezen. Op een site die uit gecrawlde HTML opgebouwd is, bestaat niets daarvan.
Daarom is je eigen site crawlen ook de verkeerde aanpak, zelfs als het technisch kan. Een crawler ziet gerenderde pagina's en gooit alles weg wat Drupal erover wist.
Hoe content geïndexeerd wordt
De chatbot leest content via de entity API van Drupal, ofwel via een eigen module ofwel via JSON:API. Jij kiest welke contenttypes in de kennisbank horen, welke velden het eigenlijke antwoord bevatten, en welke secties eruit blijven.
Elk artikel wordt daarna in stukken geknipt. Daar wordt de kwaliteit gewonnen of verloren. Blind knippen om de duizend tekens snijdt zinnen doormidden en scheidt een regel van zijn uitzondering. Knippen op je koppenstructuur houdt elk stuk op zichzelf begrijpelijk, en de artikeltitel en taxonomietermen meenemen in elk stuk zorgt dat een passage nog steekhoudt wanneer ze alleen opgehaald wordt.
Elk stuk wordt bewaard met metadata: node-ID, URL, titel, taal, datum van de laatste revisie, en de toegangsinformatie die eraan hangt. Die metadata maakt later bronlinks, ranking op actualiteit en filtering op rechten mogelijk.
Hoe rechten toegepast worden
Als een ingelogde gebruiker een vraag stelt, leest de module zijn rollen en toegangsrechten uit de huidige sessie, bouwt daar een filter mee, en past dat filter toe op de vectorzoekopdracht. Enkel passages die door het filter raken, worden aan het taalmodel gegeven.
Die volgorde is de hele kern. Het model krijgt nooit content die de gebruiker niet in een browser kon openen, dus het kan ze ook niet prijsgeven als iemand slim vraagt. Elk ontwerp waarin je het model vertelt welke content het moet negeren, is een ontwerp dat vroeg of laat lekt.
Gelijk blijven lopen
Content verandert constant, en een index die achterop raakt wordt actief schadelijk. Drupal maakt dat eenvoudig: entity hooks vuren wanneer een node opgeslagen, gedepubliceerd of verwijderd wordt, zodat de index op datzelfde moment bijgewerkt kan worden in plaats van bij een nachtelijke crawl.
Het detail waar mensen op vastlopen is verwijderen. Indexeer je een gewijzigd artikel zonder eerst de oude stukken weg te halen, dan blijven beide versies in de index staan en citeert de chatbot vrolijk de verouderde. Eerst wissen, dan invoegen is geen optionele stap.
Meertalige sites
Veel Belgische en Europese Drupal-sites publiceren in twee of drie talen, en de vertaaldekking is zelden volledig. Een meertalig embeddingmodel kan een Frans artikel ophalen bij een Nederlandse vraag, wat echt nuttig is wanneer de Nederlandse vertaling nooit gemaakt is. Het antwoord hoort in de taal van de vraag geschreven te worden, met de bron in zijn oorspronkelijke taal, zodat niemand zich vergist over wat hij citeert.
Wat werkelijk bepaalt of het lukt
Volgens onze ervaring is de technische opzet zelden het probleem. Drie dingen aan je site wegen zwaarder:
- Contenthygiëne. Achterhaalde artikels die nooit gedepubliceerd zijn, zijn de belangrijkste oorzaak van foute antwoorden. Archiveer ze voor je indexeert.
- Contentdiepte. Een paar honderd korte pagina's leveren geen betere antwoorden op dan goede navigatie. Dit begint pas te renderen vanaf duizenden.
- Hoe je met gaten omgaat. De chatbot moet zeggen wanneer je content iets niet behandelt. Een systeem dat altijd een antwoord produceert, is een systeem dat er soms een verzint.
Voor de diepere veiligheidsvraag rond afgeschermde content specifiek, zie AI-chatbots voor content achter een login.