actu-image
Artificial Intelligence PL - 25 sie 2025

Jak LLM czyta zdanie: tokenizacja od podszewki

Tokenizacja LLM to podstawowy proces, który decyduje o tym, jak AI czyta zdanie. Dzięki podziałowi tekstu na mniejsze jednostki modele mogą wydajnie przetwarzać złożone dane językowe.

Modele językowe, takie jak GPT, BERT czy Llama, nie przetwarzają tekstu tak jak ludzie. Zanim aktywuje się choćby jeden neuron, muszą zamienić tekst na zrozumiałe dla siebie jednostki liczbowe: tokeny.

Za tym pozornie prostym krokiem kryje się poważne wyzwanie dla wydajności, zdolności generalizacji i obsługi wielu języków. Ten artykuł to techniczne omówienie działania nowoczesnych tokenizerów, od Byte-Pair Encoding po SentencePiece.

Kluczowa rola tokenizacji w LLM

Modele językowe nie operują bezpośrednio na surowym tekście, tylko na tokenach – elementarnych jednostkach tekstu zamienianych na liczby całkowite. Tokeny mogą reprezentować:

  • całe słowa („cat”)
  • fragmenty słów („ation” w „ration”)
  • pojedyncze znaki („x”, „@”)
  • pary bajtów („ĠThe”, „##ing”)
Najważniejszy wniosek: token nie musi być słowem. Może to być całe słowo, fragment słowa, pojedynczy znak, a nawet kombinacja bajtów.

Przykład:

„internationalization” → [„international”, „##ization”] (WordPiece)
„internationalization” → [„inter”, „national”, „ization”] (BPE)

Tekst jest dzielony na tokeny, a każdy token jest następnie przypisywany do identyfikatora liczbowego (ID) na podstawie wyuczonego słownika.

Tokenizacja: po co dzielić tekst na tokeny?

  • Aby ograniczyć rozmiar słownika do kilkudziesięciu tysięcy pozycji
  • Aby skutecznie obsługiwać słowa spoza słownika (OOV, out-of-vocabulary)
  • Aby zapewnić przetwarzanie odporne lingwistycznie i wielojęzyczne
  • Aby utrzymać długość sekwencji w rozsądnych granicach (ze względu na kwadratowy koszt mechanizmu uwagi)
Weźmy następujące zdanie: „I’m testing tokenization algorithms.”
Model/tokenizer Wynik
GPT-2 (BPE) [’I’, '’’, 'm’, ’ testing’, ’ token’, 'ization’, ’ algorithms’, ’.’]
BERT (WordPiece) ['[CLS]’, 'i’, ”’, 'm’, 'testing’, 'token’, '##ization’, 'algorithms’, ’.’, '[SEP]’]
Llama (SentencePiece) [’▁I’, '’’, 'm’, '▁testing’, '▁token’, 'ization’, '▁algorithms’, ’.’]
Podkreślenia (▁) w SentencePiece oznaczają granice słów.
Prefiksy „##” w WordPiece oznaczają fragment słowa.
GPT-2 stosuje zakodowane spacje (’ testing’), aby zachować segmentację.

Przegląd głównych metod tokenizacji

✅ BPE (Byte-Pair Encoding)

Stosowany w: GPT-2, GPT-3, GPT-J, CLIP…
Zasada: punktem wyjścia jest minimalny słownik (często znaki lub tokeny na poziomie bajtów), a algorytm uczy się scalać najczęstsze pary symboli występujące w korpusie.

Przebieg:

  • Rozłóż każde słowo na znaki (lub bajty)
  • Policz najczęściej występujące sąsiednie pary
  • Scal te pary w jeden token
  • Powtarzaj, aż słownik osiągnie docelowy rozmiar (zwykle od 30 tys. do 50 tys. pozycji)
Uproszczony przykład ze słowem „lower”:
Na początku: [’l’, 'o’, 'w’, 'e’, 'r’]
Scalenie: [’l’, 'ow’, 'e’, 'r’]
Ostatnie scalenie: [’l’, 'ow’, 'er’]
Zalety
  • Doskonały kompromis między szczegółowością a zwięzłością
  • Odporność na neologizmy, literówki i nazwy własne
  • Stabilny słownik po zakończeniu treningu
Wady
  • Zależność od korpusu treningowego
  • Brak intuicji językowej
  • Segmentacja bywa nieintuicyjna

✅ WordPiece (BERT)

Stosowany w: BERT, RoBERTa, DistilBERT, Albert…
Zasada: algorytm inspirowany BPE, ale probabilistyczny, oparty na wiarygodności (likelihood) korpusu.

W przeciwieństwie do BPE, WordPiece dąży do maksymalizacji globalnego prawdopodobieństwa korpusu według modelu językowego.

Przykład porównawczy:

Słowo Tokeny WordPiece
Playing [’play’, '##ing’]
Football [’foot’, '##ball’]
Again [’again’]

Implementacja w praktyce z Hugging Face

Przykład w Pythonie:
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("Unbelievable results!")
print(tokens)
# ['un', '##bel', '##iev', '##able', 'results', '!']

Specyfika BERT

  • [CLS]: token specjalny dodawany na początku sekwencji (używany do klasyfikacji)
  • [SEP]: token separatora między dwoma zdaniami (używany w zadaniu Next Sentence Prediction)
  • Wielkość liter: modele uncased zamieniają tekst na małe litery i usuwają znaki diakrytyczne, modele cased je zachowują

SentencePiece

Stosowany w: Llama, T5, mT5, XLNet, ByT5, ALBERT (warianty), MarianMT itd.
Zasada: SentencePiece to samodzielny tokenizer trenowany bezpośrednio na surowym tekście. Nie zakłada, że słowa są oddzielone spacjami.

Jak to działa

  • Nie przyjmuje żadnych założeń co do rozdzielania słów spacjami (co ma kluczowe znaczenie w językach aglutynacyjnych lub logograficznych)
  • Może działać na poziomie znaków, bajtów lub punktów kodowych Unicode
  • Implementuje dwa algorytmy:
    • Unigram Language Model (domyślny w T5)
    • Zmodyfikowany BPE (opcjonalnie)
  • Trening opiera się na łącznym prawdopodobieństwie podtokenów: maksymalizuje prawdopodobieństwo, minimalizując jednocześnie złożoność słownika
Przykład ze zdaniem „The cat sat.”:
['▁The', '▁cat', '▁sat', '.']

Znak ▁ oznacza spację wbudowaną w token, co pozwala dokładnie odtworzyć oryginalny tekst.

Przykład wielojęzyczny

Zdanie po japońsku: „私はAIが好きです”
→ ['▁私', 'は', 'AI', 'が', '好', 'き', 'です']
Zalety
  • Niezależność od języka, bez względu na konwencje zapisu
  • Doskonała obsługa języków bez spacji
  • Wierne odwzorowanie surowego tekstu (pełna odwracalność)
Wady
  • Tokeny są mniej czytelne dla człowieka
  • Segmentacja bywa nieintuicyjna
  • Trening Unigram LM jest bardziej kosztowny obliczeniowo

Implementacja w praktyce z SentencePiece

import sentencepiece as spm

sp = spm.SentencePieceProcessor()
sp.load("m.model")

tokens = sp.encode("The cat sat.", out_type=str)
print(tokens)
# ['▁The', '▁cat', '▁sat', '.']

Typowe przypadki użycia

Model Zastosowana metoda Cechy
T5 Unigram LM Pełne podejście text-to-text, niezależne od pozycji
Llama BPE w SentencePiece Długi kontekst, wielojęzyczność
mT5 Unigram 101 języków, zrównoważona wydajność
ByT5 Poziom bajtów Bezpośrednio na UTF-8 (maksymalna odporność)

Przypadki brzegowe w tokenizacji

Weźmy identyfikator zmiennej lub rzadką nazwę:

input = "z3r0C00l@#"

GPT-2:

['z', '3', 'r', '0', 'C', '00', 'l', '@', '#']

BERT:

['z', '##3', '##r', '##0', '##c', '##00', '##l', '@', '#']

Im mniej znane słowo, tym bardziej zostaje rozdrobnione, co wpływa na:

  • Długość sekwencji (a w konsekwencji kwadratowy koszt mechanizmu uwagi)
  • Zdolności rozumowania semantycznego modelu
  • Mechanizm cross-attention w architekturach koder–dekoder

Wpływ na wydajność

  • Zbyt szczegółowa tokenizacja: prowadzi do dłuższych sekwencji i większego zużycia pamięci
  • Zbyt zgrubna tokenizacja: oznacza utratę zdolności generalizacji i więcej przypadków OOV (Out-Of-Vocabulary)
Nowsze tokenizery, takie jak tiktoken (OpenAI), optymalizują ten kompromis, łącząc BPE z heurystykami Unicode.

Tokenizacja: przykład w Pythonie

from transformers import GPT2TokenizerFast

tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
tokens = tokenizer.tokenize("The cat sat.")
print(tokens)  
# ['The', 'Ġcat', 'Ġsat', '.']

Znak Ġ koduje spację. Słownik jest trenowany tak, aby rozpoznawał częste wzorce w oryginalnym korpusie.

Podsumowanie

Tokenizacja to znacznie więcej niż wstępne przetwarzanie tekstu: to podstawowa brama do modelu językowego. Wybór algorytmu (BPE, WordPiece, SentencePiece) bezpośrednio wpływa na to, jak model postrzega i koduje informacje. Jej zrozumienie pozwala:

  • Lepiej interpretować wyniki LLM
  • Optymalizować trening i inferencję
  • Dostosować pipeline przetwarzania do ograniczeń konkretnej dziedziny

To także kluczowy etap każdego projektu fine-tuningu lub wstępnego trenowania własnego LLM.

Dalsza lektura