AI & AutomationAI-generated

Hoe een taalmodel het volgende woord kiest

Een taalmodel weet niet wat het volgende woord is. Het rekent voor elk token uit zijn woordenlijst uit hoe goed het zou passen, en daarna moet er nog gekozen worden. Die keuze maakt niet het model zelf, maar een klein stukje code erachter. Daar zit ook het schuifje temperature.

Dit is het tweede deel van de reeks Hoe AI echt werkt. In deel 1 werd tekst een rij token-id's. Nu kijken we naar de andere kant: hoe er weer een token uit komt. De kansen in de visual zijn voorbeeldkansen: ik heb ze zelf gekozen, er draait hier geen echt model. De rekenregels erop zijn wel echt, en elk getal in deze tekst is daarmee nagerekend.

Samplinglogits · voorbeeldwaarden

De kat zat op de▍

·mat
3,0
·bank
2,6
·vloer
2,1
·stoel
1,7
·tafel
1,4
·trap
0,9
·muur
0,4
·maan
−1,0

één score per token in de woordenlijst · hier 8 van de ±200.000

Een score voor elk token

We geven het model "De kat zat op de". Na al het rekenwerk komt er een rij getallen uit: één score voor elk token in de woordenlijst. Bij een tokenizer als o200k_base zijn dat er ruim 200.000. Die ruwe scores heten logits.

Een logit is geen kans. Het kan elk getal zijn, ook negatief. Hoger betekent alleen: past beter. In ons voorbeeld scoort mat 3,0 en maan −1,0. We tonen acht kandidaten; elk ervan is in o200k_base precies één token.

Van scores naar kansen

Om er kansen van te maken gebruikt het model softmax. Neem van elke logit e tot de macht die logit, en deel door de som van al die getallen. Alles wordt positief en telt op tot 100 procent.

Voor mat is e³ ongeveer 20,1. De som over alle acht kandidaten is 55,6. Dat geeft 36,1 procent. bank krijgt 24,2 procent, maan 0,7 procent. Een verschil in logits wordt zo een verhouding: mat scoort 0,4 hoger dan bank en is daardoor e^0,4, ongeveer 1,5 keer, zo waarschijnlijk.

Greedy: altijd de hoogste

De simpelste keuze is steeds het token met de hoogste kans nemen. Dat heet greedy decoding. De kat zit dan altijd op de mat, elke keer.

Dat klinkt veilig, maar Holtzman en collega's lieten in 2019 zien dat tekst die steeds het waarschijnlijkste vervolg kiest saai wordt en makkelijk in herhalingen blijft hangen.

Samplen: trekken uit de verdeling

Het alternatief is samplen: trek een token, waarbij elke kandidaat kans maakt naar verhouding van zijn kans. Zie het als een rad met vakjes zo breed als de kansen.

Hier zie je honderd trekkingen met een vaste startwaarde voor de toevalsgenerator. mat komt 36 keer uit, bank 21 keer, maan geen enkele keer. Het patroon volgt de kansen, maar niet precies: stoel kwam deze keer vaker uit dan vloer. Daarom geeft dezelfde vraag aan een chatbot steeds een iets ander antwoord.

Temperature omlaag

Vóór de softmax kun je alle logits delen door een getal: de temperature T. Bij T = 1 verandert er niets. Bij T = 0,5 worden alle verschillen twee keer zo groot.

Het effect zie je meteen. mat gaat van 36,1 naar 57,1 procent, maan zakt naar 0,02 procent. De verhouding tussen mat en bank gaat van 1,5 naar 2,2. Het model wordt zekerder van zijn eerste keus. Bij T = 0 houd je alleen de hoogste over, en dat is weer greedy.

Temperature omhoog

Bij T = 2 worden de verschillen gehalveerd en de verdeling platter. mat zakt naar 23,9 procent en maan stijgt van 0,7 naar 3,2 procent, bijna vijf keer zo veel.

Daar zit het risico van een hoge temperature. Het model wordt er niet slimmer van, alleen minder kieskeurig. Een op de dertig keer zit de kat op de maan, en de rest van de zin moet daarop verder.

Top-k: alleen de beste k

Een manier om die staart af te knippen is top-k. Je houdt alleen de k tokens met de hoogste kans over en schaalt die weer op tot 100 procent. Angela Fan en collega's gebruikten het in 2018 in een veelgeciteerde paper over het genereren van verhalen.

Met k = 3 doen alleen mat, bank en vloer mee, met 48,1, 32,3 en 19,6 procent. Het nadeel: k staat vast. Soms zijn er twee goede vervolgen, soms twintig, en k weet dat niet.

Top-p: tel op tot p

Top-p, of nucleus sampling, lost dat op. Sorteer de tokens van hoog naar laag, tel de kansen op, en stop zodra je p hebt bereikt. Alleen die groep doet mee. Holtzman en collega's stelden het voor in dezelfde paper uit 2019.

Met p = 0,9 kom je na tafel op 92,2 procent. Vijf tokens doen mee, de laatste drie vallen af. Is het model zeker, dan is de groep klein. Twijfelt het, dan wordt de groep vanzelf groter.

Token voor token

Na de keuze is het werk niet klaar. Het gekozen token komt achter de invoer, en het model rekent opnieuw, nu met één token meer. Dat heet autoregressief. Een antwoord van vijfhonderd tokens betekent vijfhonderd keer kiezen.

Hier trok het model bank (24 procent), daarna te (16 procent), daarna slapen (50 procent). De kansen voor het derde woord hangen af van het tweede: na te zijn het werkwoorden, na een punt een nieuw zinsbegin. Eén ongelukkige trekking vroeg in het antwoord bepaalt zo alles wat erna komt. Dat is ook een van de manieren waarop een model dingen gaat verzinnen.

Speel zelf

Klik op trek en het model kiest drie tokens na "De kat zat op de", met dezelfde voorbeeldkansen. Elke klik heeft een eigen startwaarde, dus opnieuw trekken geeft een andere zin.

Zet temperature op 0 en je krijgt elke keer "mat. Ze". Schuif hem naar 2 en kijk hoe vaak de maan langskomt. Zet daarna top-p op 0,5 en zie hoeveel kandidaten er nog overblijven.

Wat niet in het plaatje past

Temperature 0 is niet altijd hetzelfde antwoord. In theorie is T = 0 volledig voorspelbaar. In de praktijk niet: de API-documentatie van Anthropic zegt letterlijk dat de resultaten ook bij temperature 0,0 "niet volledig deterministisch" zijn. Thinking Machines Lab liet in september 2025 een open model 1000 keer hetzelfde antwoord geven bij temperature 0. Dat leverde 80 verschillende teksten op, die pas bij het 103e token uit elkaar liepen. De oorzaak was volgens hen dat een server je vraag samen met wisselende aantallen andere vragen verwerkt. Afrondingen vallen dan net anders uit, en bij twee bijna gelijke kandidaten is dat genoeg voor een ander token.

Niet elke API laat je kiezen. Bij OpenAI loopt temperature van 0 tot 2, en de documentatie raadt aan óf temperature óf top-p aan te passen, niet allebei. Bij Anthropic liep hij van 0 tot 1. Volgens de huidige API-documentatie accepteren Claude-modellen die na Opus 4.6 zijn uitgebracht geen andere temperature dan 1 meer, en top-p en top-k kun je daar evenmin aanpassen.

Er zijn meer knoppen, zoals straffen voor herhaling en min-p. Het principe blijft: het model levert scores, de code eromheen kiest.

Zelf proberen

Softmax met temperature is een paar regels Python, zonder model:

import math
logits = {"mat": 3.0, "bank": 2.6, "vloer": 2.1, "stoel": 1.7,
          "tafel": 1.4, "trap": 0.9, "muur": 0.4, "maan": -1.0}
for T in (0.5, 1, 2):
    e = {t: math.exp(l / T) for t, l in logits.items()}
    s = sum(e.values())
    print(T, {t: round(100 * x / s, 1) for t, x in e.items()})

Bij T = 1 geeft dat 36,1 procent voor mat, dezelfde getallen als in de visual. Bij een echt model zie je het effect door in een API die het nog toestaat dezelfde vraag een paar keer met temperature 1 en met 0 te stellen.

Tot slot

Ik dacht altijd dat temperature iets was wat diep in het model zat, een soort stemming. Het is één deling, vlak voor het kiezen. Het model rekent precies hetzelfde uit; alleen de dobbelsteen erachter verandert.

Wat me het meest verraste is dat temperature 0 niet betekent dat je elke keer hetzelfde krijgt. Ik verwachtte dat het zou liggen aan GPU's die in willekeurige volgorde optellen. Volgens Thinking Machines ligt het eraan hoe druk de server op dat moment is. Dat nieuwe Claude-modellen helemaal geen temperatureknop meer hebben, vind ik daarom minder erg dan het klinkt. Volledige voorspelbaarheid kreeg je toch al niet.