Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Kernconcepten

Tokenizer

Een tokenizer is het onderdeel van een AI-systeem dat tekst in tokens knipt, de stukjes waarmee een taalmodel werkt, en die omzet in nummers en weer terug.

Ook bekend als: tokenization, tokenisatie, BPE tokenizer, byte pair encoding, subword tokenization

Een tokenizer is het onderdeel van een AI-systeem dat tekst in tokens knipt, de stukjes waarmee een taalmodel werkt, en elk stukje een nummer geeft. Als het model antwoordt, zet de tokenizer die nummers weer om in tekst. Elke modelfamilie heeft een eigen tokenizer, dus dezelfde tekst kan per model op een ander aantal tokens en een andere prijs uitkomen.

Hoe werkt een tokenizer?

Een tokenizer leert eerst een vocabulaire uit een grote verzameling tekst en knipt daarna nieuwe tekst op met dat vocabulaire. De gangbare methode in huidige grote taalmodellen is byte pair encoding (BPE) of een variant daarvan (Singh en Strouse, 2024). Sennrich e.a. (2015) pasten dit compressiealgoritme uit 1994 aan om woorden op te splitsen: begin met losse tekens, zoek het paar naast elkaar staande symbolen dat het vaakst voorkomt, voeg dat samen tot een nieuw symbool en herhaal dat tot het vocabulaire de gekozen grootte heeft.

Hugging Face laat de stappen zien op de woorden "hug", "pug", "pun", "bun" en "hugs": eerst worden "u" en "g" samengevoegd tot "ug", daarna "u" en "n" tot "un". Veelvoorkomende woorden worden zo één token; zeldzame woorden blijven in stukken. GPT-2 gebruikt byte-level BPE, dat begint bij de 256 mogelijke bytewaarden in plaats van bij tekens, en daardoor elke tekst kan coderen.

Er zijn varianten. WordPiece, dat Googles BERT gebruikt met een vocabulaire van 30.000 tokens, kiest de samenvoeging die de waarschijnlijkheid van de trainingsdata het meest verhoogt, in plaats van het vaakst voorkomende paar. Unigram werkt andersom: het begint met veel kandidaten en schrapt de minst nuttige tokens. Googles bibliotheek SentencePiece (Kudo en Richardson, 2018) past BPE of Unigram toe op ruwe tekst en behandelt de spatie als een gewoon symbool, geschreven als "▁". Zo werkt het ook voor talen zonder spaties tussen woorden, zoals Japans. Meta's Llama 2 gebruikte de BPE daarvan met 32.000 tokens (Touvron e.a., 2023).

Hoe groot is het vocabulaire?

GPT-2 had 50.257 tokens. In de bibliotheek tiktoken van OpenAI heeft cl100k_base, de encoding van GPT-4, er ongeveer 100.000, en o200k_base, die GPT-4o en GPT-5 gebruiken, ongeveer 200.000. Meta's Llama 3 gebruikt er 128.000: 100.000 overgenomen uit tiktoken plus 28.000 voor andere talen dan Engels. Op Engelse tekst steeg het gemiddelde daardoor van 3,17 tekens per token met de tokenizer van Llama 2 naar 3,94, zodat het model voor dezelfde trainingsrekenkracht meer tekst leest (Llama 3-paper). Een groter vocabulaire knipt tekst in minder tokens, maar de kans groeit dat zeldzame tokens te weinig training krijgen (Tao e.a., 2024).

Waar gaat het mis?

  • Andere talen hebben meer stukken nodig. In o200k_base is " fascinating" één token en het Nederlandse " fascinerend" drie (" fasc", "iner", "end"). Het oudere cl100k_base knipt "klantenservicemedewerker" in negen stukken, o200k_base in zes.
  • Getallen worden op vreemde plekken geknipt. De tokenizer van GPT-4 heeft een token voor elk getal van één tot drie cijfers en knipt langere getallen van links af, dus "1234567" wordt "123", "456" en "7"; Llama en PaLM knippen getallen in losse cijfers. Toen Singh en Strouse om de drie cijfers van rechts een komma zetten, loste GPT-3.5 (maart 2023) 97,8% van de optellingen van getallen van 7 tot 9 cijfers op, tegen 75,6% zonder komma's, beide met acht uitgewerkte voorbeelden in de prompt.
  • Sommige tokens staan in het vocabulaire maar komen in de trainingsdata bijna niet voor. Zulke ondergetrainde tokens, zoals "SolidGoldMagikarp", kunnen een model vreemd laten reageren; Land en Bartolo (Cohere, 2024) vonden ze in veel modellen.
  • Niet elke tokenizer is openbaar. Het tokenizerpakket van Anthropic meldt dat het vanaf Claude 3 niet meer klopt; voor Claude telt de API de tokens.

Voorbeeld

Dit stukje code knipt twee zinnen op met o200k_base uit tiktoken; het commentaar toont de uitvoer:

Python
1import tiktoken
2
3enc = tiktoken.get_encoding("o200k_base") # de encoding van GPT-4o en GPT-5
4for text in ["Tokenization is important", "De klantenservicemedewerker belt je morgen."]:
5 ids = enc.encode(text)
6 print(len(ids), [enc.decode([i]) for i in ids])
7# 4 ['Token', 'ization', ' is', ' important']
8# 10 ['De', ' klanten', 'serv', 'ic', 'emed', 'ewerker', ' belt', ' je', ' morgen', '.']

Wie de nummers weer decodeert, krijgt precies de oorspronkelijke zin terug: de documentatie van tiktoken noemt BPE omkeerbaar en verliesvrij.