Fijn om te horen dat de AI-serie in de smaak viel. En terecht kreeg ik de vraag: "Ja, fijn dat je in deel drie over ML, LLM's en transformers spreekt. Maar je ging er technisch niet dieper op in."
Dat klopt. En dat is denk ik ook een beetje het punt waar ik elke keer op balanceer. Ik probeer niet té technisch te worden, maar ik wil ook voldoende vertellen. Ik heb daar soms best moeite mee, om die balans te vinden.
Laten we dan maar een vierde deel doen. Zodat we even kunnen inzoomen op die laatste generatie AI met een technische bril op. Maar pas op, dan gaan we ook technisch worden.
Achteraf is dus gebleken dat dit een vierdelige serie werd. Je leest nu deel vier. Als je wilt, tref je hier de andere delen:
- Hoe media zoals NOS en anderen een overdreven beeld van AI neerzetten
- Hoe AI werkt in de praktijk: van mensentaal naar softwarelogica
- Hoe de nieuwste AI werkt, van NLP naar ML en LLM
De technische binnenkant van de black box
Eerst moeten we begrijpen waarom we bij AI van de huidige generatie spreken over "training data" en "trained model". Het eerste is de invoer, het tweede de uitvoer. Maar wat is het echt? Nou, dat zal ik je vertellen. De invoer is idealiter een grote dataset met labelled data.
Dat zit zo: er zijn grofweg twee manieren om een AI iets te leren. De eerste methode is om gewoon heel veel tekst aan te voeren. De tweede manier is om wederom heel veel tekst te voeren, maar dit keer labelled. En wat is dat? Nou, je geeft niet alleen een zin zoals: "Mijn naam is Jan en ik heb een fijne stoel." Bij labelled data benoem je elk onderdeel van die zin. Jan is een naam, stoel is een object. De rest zijn signalen. "Mijn naam is" is bijvoorbeeld een signaal dat er een naam volgt. En "fijne" is een signaal dat het opvolgende object positief beoordeeld wordt.
Van NLP naar transformers
Het grote verschil is dat een klassieke NLP-pipeline vrij rudimentair is vergeleken met moderne transformer-modellen. Dit komt doordat een model enorm veel data heeft. En de software die het model draait, kan complexe patronen berekenen uit enorme hoeveelheden data. Hierbij worden zelfs speciale chips gebruikt, zoals een GPU of gespecialiseerde AI-chip. Die worden gebruikt omdat matrixberekeningen in transformer-modellen extreem compute-intensief zijn.
En doordat het op zoveel data is getraind, zijn de gevonden overeenkomsten vaak veel nauwkeuriger dan bij kleinere datasets. Naast het zoeken van overeenkomstige zinnen kun je met modellen ook beter zoeken naar entiteiten. Wederom vanwege de schaal.
Zelfs traditionele NLP-systemen van rond 2019 maakten minder gebruik van rule-based methoden zoals reguliere expressies (regex) en gebruikten in plaats daarvan tokenisatie als basis voor verdere verwerking. Daarna volgt vaak een tweede ronde die de eerste labels omzet in entiteiten. Zo is het label "munteenheidsteken" voor € iets. En het label "getal" voor 50 erna ook iets. Dat was een eerste vorm van labeling, later vaak aangevuld met of vervangen door learned models.
Maar in eerdere systemen kwam er bijvoorbeeld nog een stap die zegt: hé, € en 50 staan naast elkaar, samen vormen ze een geldbedrag. Niet alleen een munteenheidsteken en een nummer, maar één betekenisvol concept.
Een klassieke NER had als taak om namen, organisaties en plaatsen te herkennen. Maar moderne labelling en extractie gaat veel verder. Denk aan tijden, datums en bedragen. Maar ook objecten zoals een tuinstoel of vrachtauto, eenheden zoals meter en inch, en ga zo maar door.
Garbage in is garbage out
Maar hoe doe je dat dan? Hoe kan een computer dat? Het antwoord is flauwer dan je wellicht denkt. Namelijk: bakken met data.
En daar moeten we het misschien eerst even hebben over het gezegde "garbage in is garbage out". Dat is een term die al heel lang bestaat. Het komt erop neer dat als je een computer onzin voert, die computer ook onzin zal uitkramen. Dus de kwaliteit van je data is belangrijk. Daarom is labelled data ook beter dan unlabelled data. Maar wie labelled dat dan? Nou, een mens. Hopelijk.
En waarom is er zoveel data nodig? Zie het als ons universum: een enorme ruimte met hier en daar een ster of planeet. Met zoveel leegte draait het om één vraag, hoe krijg je een model zover dat het betekenisvolle verbanden leert? Zo’n model werkt in een enorme vectorruimte waarin woorden, zinnen en concepten als punten liggen. Die ruimte moet gevuld worden, en niet een beetje maar extreem dicht. Alleen dan liggen gerelateerde concepten ook echt dicht bij elkaar en kun je betrouwbare patronen vinden.
Daarom heb je zoveel data nodig. Niet omdat meer altijd beter klinkt, maar omdat je anders simpelweg gaten krijgt in die ruimte. En gaten betekenen onvoorspelbaar gedrag. Het model moet kunnen “zien” dat kat dichter bij hond ligt dan bij brandweerauto, en dat lukt alleen als het die verbanden vaak genoeg in verschillende contexten tegenkomt.
Die data komt grotendeels uit bestaande teksten zoals boeken, websites, forums en documentatie, omdat die rijk zijn aan variatie en context. Soms wordt er ook synthetische data gebruikt, bijvoorbeeld om specifieke patronen te versterken of zeldzame gevallen aan te vullen. Maar dat is ondersteunend, niet leidend. De kwaliteit van het model hangt uiteindelijk af van hoe goed die vectorruimte de werkelijkheid benadert, en dat bereik je alleen met veel, diverse en consistente voorbeelden.
AI begrijpt geen taal, maar wiskunde
Waarom al die data, vraag je jezelf nu af? Dat komt door wiskunde. AI snapt niet echt grammatica, Nederlands, Engels of wat dan ook. Zo zou je het willen begrijpen, maar dat is niet hoe het werkt. AI doet uiteindelijk maar één ding: wiskunde.
Stel, ik tik: "Ik hou van spaghetti". Wat AI eerst doet is die zin opbreken in tokens. Dat zijn stukjes. Bijvoorbeeld:
['ik', 'hou', 'van', 'spag', '##het', '##ti'] Zoals je ziet maakt AI van dat laatste woord drie tokens. De ## voor elk deel vertelt de AI dat het onderdeel was van de vorige token. Waarom het dit doet is simpel: als je woorden opbreekt, kom je vaker overeenkomsten tegen met andere woorden. Dat scheelt data.
Dit was een specifiek voorbeeld van BERT-model notatie, maar het idee is hetzelfde voor elk model. Dit noemen we Byte Pair Encoding in het algemeen.
Zo is de token "het" in "spaghetti" technisch niet anders dan "het" in de zin "het waait". Door dit soort trucs wordt de data in het model later veel kleiner. Het leert om data efficiënter op te slaan. Elke overeenkomst met andere delen is niet langer een uniek onderdeel, maar een generiek onderdeel.
Van tokens naar vectoren
En dan komen we bij vectorisatie. Want elke token, zoals "het", krijgt een eigen nummer. Een zogenaamd ID, oftewel identificatienummer. En dat verschilt per model. De makers van een model kiezen die nummers. Daarom komt elk model met een eigen lijst van token-ID's. Je moet elke token dus omzetten in een nummer. Laten we zeggen dat "het" nummer 10 krijgt.
De vector van de zin "Ik hou van spaghetti" kan dan uitkomen op:
[16, 33, 48, 99, 10, 14] En die vector is alleen geldig voor het model dat je getraind hebt, of gebruikt. Bij een ander model kunnen die nummers totaal anders zijn.
De reden dat je de string vectoriseert is omdat je later een wiskundige vergelijking gaat doen. Dus je moet van tekst naar getallen. Dat zit zo: stel ik tik deze zinnen:
"Ik hou van spaghetti"
"Spaghetti is mijn favoriete maaltijd" Dan heb je het in computertaal over twee heel verschillende strings. Maar in vectoren zijn er ineens overeenkomsten. Spaghetti was namelijk [99, 10, 14]. En dus is er een overlap tussen deze twee strings die je niet eenvoudig met regex of if-else kunt herkennen, maar wel met vectoren.
De truc van vectoren is om verschillende vectoren met elkaar te vergelijken aan de hand van gewichten. Dat gewicht is eigenlijk een soort mathematische afstand tussen vectoren. Zinnen met vergelijkbare vectordelen liggen dichter bij elkaar dan zinnen met totaal afwijkende delen.
En dat is waarom je bijvoorbeeld geen hash kunt gebruiken. Een hash verandert al als je één karakter aanpast. Terwijl een vector een reeks getallen is waarbij overeenkomsten juist behouden blijven.
Inference en intent-detectie
Voor wie nog niet afgehaakt is: nadat een zin van de gebruiker omgezet is in een vector, volgt een vergelijking met vectors uit het model. Het model bevat duizenden of tienduizenden voorbeelden. Je gaat nu zoeken naar vectors die het dichtst in de buurt liggen.
Voor programmeurs, zie het zo. Ik pak even een willekeurige taal. Laat ik PHP doen:
$user_input = "Ik hou van spaghetti";
$user_tokens = $my_model->tokenize($user_input);
$user_vector = $my_model->vectorize($user_tokens);
$my_model->add_intent([
intent: 'favorite_food',
examples: [
'Ik hou van spaghetti',
'Spaghetti is mijn favoriet',
'Voor mij is spaghetti het helemaal',
'Als je het mij vraagt, dan spaghetti'
]
]);
$scores = $my_model->infer($user_vector);
print_r($scores);
Wat er dus gebeurt is het volgende: je model is al getraind. Wat jij doet zijn twee dingen. Eerst voer je voorbeeldzinnen in die gekoppeld zijn aan een intent die jij wilt herkennen. Daarna voer je de user input in, als een vector. Op basis van die user input en je voorbeeldzinnen krijg je een score terug voor al je intents.
$scores = Array(
'favorite_food' => 0.98,
'favorite_restaurant' => 0.03,
'favorite_color' => 0.02,
);
De hoogste score wint. Maar uiteindelijk is dat aan jou. Het model geeft alleen waarschijnlijkheden terug. Dus het is jouw business logic die bepaalt wat er verder mee gebeurt. Maar de topscore is waarschijnlijk de intent waarop je wilt voortborduren.
Waarom AI meerdere taken gebruikt
In de praktijk gebruik je meestal een voorgetraind model. Dat model bevat enorme hoeveelheden statistische relaties tussen woorden, concepten en patronen.
Vervolgens kun je datzelfde model inzetten voor verschillende taken. Denk aan Sentence Similarity, entiteiten herkennen (NER) of classificatie. En daar bovenop wil je misschien ook nog sentimentanalyse doen. Is dit bericht vrolijk? Zijn ze boos? Was het sarcasme? Ga zo maar door.
Die taken gebruiken vaak dezelfde onderliggende transformerarchitectuur, maar met andere classificatielagen of andere manieren om de vectorrepresentaties te gebruiken. Daardoor kan hetzelfde model gebruikt worden voor bijvoorbeeld semantische overeenkomst, maar ook voor het herkennen van personen, locaties, bedragen of emoties in tekst.
Elke taak gebruikt het model op een andere manier. Sentimentanalyse kijkt bijvoorbeeld naar andere statistische patronen dan Named Entity Recognition. Om gewoon even in PHP-syntax te blijven:
class Pipeline {
function __construct($my_model, $user_input) {
$this->tokens = $my_model->tokenize($user_input);
$this->vector = $my_model->vectorize($this->tokens);
$this->entities = $my_model->entities($this->tokens);
$this->mood = $my_model->mood($this->vector);
$this->intent = $my_model->intent($this->vector);
}
}
Daardoor worden voor verschillende taken vaak aparte classificatielagen, of zelfs gespecialiseerde modellen gebruikt. In moderne AI-systemen worden namelijk vaak meerdere gespecialiseerde pipelines gecombineerd, zelfs wanneer ze op dezelfde transformerarchitectuur gebaseerd zijn.
Laat ik het concreet maken.
Een taak die de toon van tekst probeert vast te stellen kijkt naar heel andere patronen in het model. Denk aan woorden zoals: "hé bah", "erg boos", "dit valt mij tegen". Of juist: "wauw", "gaaf", "fantastisch", "zo blij". Dat zijn patronen die voor sentimentanalyse sterk met elkaar samenhangen.
Dat zijn compleet andere vectorrelaties dan die van een taak dat plaatsnamen moet herkennen.
Heuristieken en early exits
Maar ook gebruik je heuristische detectie op de user input om die eerst door een soort sorteermachine te duwen. Je wilt zo snel en energiezuinig mogelijk uitvogelen wat de gebruiker wil.
Zat er een numerieke entiteit in de input? En twee eenheden? Samen met een token zoals "naar"? Dan willen ze waarschijnlijk een conversie zoals "1 meter naar feet". Dat kan meteen door naar een gespecialiseerde conversietool. Je hoeft dan niet eens de volledige NLP-pipeline te draaien. Dat noem je een early exit.
Is de user input complexer dan dat? Gooi het dan door de NLP-laag en kijk of die er iets mee kan. Nee? Dan vectoriseer je de input en stuur je die door het model om intentdetectie te doen.
Die eerste stappen besparen enorm veel energie en kosten, zowel qua hardwarebelasting als letterlijk in geld. Grote partijen zoals Google en OpenAI weten dit uiteraard. Maar kleinere AI-systemen die op voorgetrainde modellen leunen verrassend vaak niet. Die gooien simpelweg alle user input rechtstreeks door het model. Zonde.
AI is geen mystiek orakel
En dan tot slot misschien wel het meest “onvatbare” onderdeel van AI: systemen die zelf antwoorden schrijven.
Tot nu toe hadden we het vooral over AI als hulpmiddel om menselijke taal te begrijpen. De uiteindelijke keuzes werden daarbij gemaakt door beheersbare logica. Maar er bestaat ook een vorm van AI die zelf tekst genereert, zoals ChatGPT. Daarbij wordt geen antwoord opgezocht in een database; het model voorspelt op basis van wiskunde simpelweg welk antwoord het meest waarschijnlijk is.
En daar kan het misgaan. Zo’n systeem kan namelijk een antwoord geven dat overtuigend klinkt, maar feitelijk onjuist is. Dat maakt generatieve AI ontzettend indrukwekkend als gezellige gesprekspartner, maar niet erg geschikt voor situaties waar correcte antwoorden cruciaal zijn, zoals medische toepassingen.
Dat betekent niet dat AI als geheel onbruikbaar is. Integendeel. AI wordt juist veel ingezet voor serieuze taken. Maar in zulke systemen blijft de controle over feiten, regels en beslissingen buiten het model zelf liggen. Meer direct in mensenhanden. Dáár zit het belangrijke verschil.
AI is dus niet één "magische technologie" die zomaar zelfstandig beslissingen neemt. Het is een verzameling technieken, gebouwd door mensen, met verschillende toepassingen en verschillende risico’s.
Onwenselijke AI-antwoorden ontstaan meestal door:
- Minder goede trainingsdata
- Minder dan ideale keuzes in de software eromheen
- Of te veel vrijheid om zelf antwoorden te genereren
AI is geen mystiek orakel. Het is uiteindelijk een grote rekenmachine die patronen herkent. En wanneer mensen de juiste vorm van AI op de juiste manier inzetten, blijft de controle gewoon in menselijke handen. Zo levert het voordelen op en heeft het nut.
PS: En dan hebben we het nog niet eens gehad over AI die bijvoorbeeld beelden analyseert in plaats van taal. Want ook dát is weer een compleet andere vorm van AI. Wellicht een andere keer!