Ein Token ist die kleinste Einheit die ein LLM verarbeitet. Nicht ein Wort — oft ein Wort + Whitespace oder sogar Subwort-Teile. Die richtige Tokenisierung ist kritisch für Cost, Performance und Qualität.


Die Token-Realität

Englisch vs. Deutsch

Text: "The dog jumped over the fence"
English Tokenizer: ["The", " dog", " jumped", " over", " the", " fence"]
Tokens: 6

Text: "Der Hund sprang über den Zaun"
German Tokenizer: ["Der", " Hund", " sprung", " über", " den", " Zaun"]
Tokens: 6

Aber bei längeren deutschen Sätzen:

Text: "Die unglaubliche Geschwindigkeit"
English Tokenizer (GPT): ["Die", " un", "glau", "ber", "liche", " G", "e", "sch", "wind", "igkeit"]
Tokens: 10 (ineffizient! Viele Sub-tokens)

German Tokenizer (BERT): ["Die", "unglaubliche", "Geschwindigkeit"]
Tokens: 3 (effizient)

→ German ist 3-4× teurer in English Tokenizer!

Warum? Der English Tokenizer wurde auf English Texte trainiert. Deutsche Wörter sind oft länger → brauchen mehr Tokens.


Token-Zählung Praktisch

Offline-Zählung

import tiktoken

# OpenAI Models
enc = tiktoken.encoding_for_model("gpt-4")
text = "Der Hund springt schnell über den Zaun"
tokens = enc.encode(text)
print(len(tokens))  # Beispiel: 11 Tokens

# Alternative: cl100k für GPT-4
enc = tiktoken.get_encoding("cl100k_base")
tokens = enc.encode(text)

Online-Zählung (für nicht-OpenAI Models)

from transformers import AutoTokenizer

# Llama 3
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b")
tokens = tokenizer.encode("Der Hund springt schnell")
print(len(tokens))

# Count for German vs English
en_text = "The dog jumps fast over the fence"
de_text = "Der Hund springt schnell über den Zaun"

en_tokens = len(tokenizer.encode(en_text))  # Beispiel: 7
de_tokens = len(tokenizer.encode(de_text))  # Beispiel: 8

print(f"English efficiency: {len(en_text) / en_tokens} chars/token")
print(f"German efficiency: {len(de_text) / de_tokens} chars/token")

Tokenizer-Technologien

BPE (Byte Pair Encoding)

Idee: Iterativ merge häufige Token-Paare.

Start mit Characters:
"hugging" = ['h', 'u', 'g', 'g', 'i', 'n', 'g']

Step 1: Zähle Paare
  ('h', 'u'): 100 times
  ('u', 'g'): 200 times  ← Häufigste
  ('g', 'g'): 150 times
  ...

Merge häufigsten:
"hugging" = ['h', 'ug', 'g', 'i', 'n', 'g']

Repeat:
Step 2: Neuer häufigste Pair?
  ('ug', 'g'): 180 times
  ...

Until: Vocabulary Größe erreicht (z.B. 50K Tokens)

Algorithmus:

vocab = set of all characters (256 Bytes)
freqs = count of all pairs

while vocab_size < target_vocab_size:
    most_frequent_pair = max(freqs)
    merge most_frequent_pair in texts
    update freqs
    add merged_token to vocab

Resultat: Englisch-optimiert, aber funktioniert auch für andere Sprachen.

Verwendet: GPT-4 (mit cl100k Variante)


WordPiece

Idee (Google, für BERT): Probabilistisch, basierend auf Likelihood des Vocabs.

Merges nicht nach Häufigkeit, sondern nach:

score(A, B) = freq(AB) / (freq(A) × freq(B))

Beispiel:
freq(h) = 10000
freq(u) = 5000
freq(hu) = 4000

score = 4000 / (10000 × 5000) = 0.00008

freq(##ing) = 8000  (note ## = suffix)
freq(g) = 8000

score = 8000 / (8000 × 8000) = 0.000125 ← Higher score! Merge.

Intuition: Mergen wenn das Paar "gesetzmäßig" ist (nicht zufällig häufig).

Spezial: ## Prefix für Nicht-Start-Tokens.

"hugging" = ["hu", "##g", "##ging"]
        nicht ["hu", "gg", "ing"] (WP würde `##gging` lernen wenn häufig)

Verwendet: BERT, Llama (modifiziert)


SentencePiece

Idee (Google, für mTok etc): Language-agnostic, behandle Whitespace als Token.

Input: "Hallo Welt"

Standard BPE:
"Hallo" = ['H', 'al', 'lo']
"Welt" = ['W', 'el', 't']
Result: ['H', 'al', 'lo', ' ', 'W', 'el', 't']

SentencePiece:
"Hallo Welt" = ['▁Hallo', '▁Welt']
             (▁ = underscore, represented whitespace)

Key: Reverse-able
['▁Hallo', '▁Welt'] → "Hallo Welt" (exakt)

auch Über Languages:
['▁Der', '▁Hund'] + ['▁The', '▁dog']
→ Identisches Tokenization-Scheme!

Eigenschaften:

  • Truly multilingual (shared vocabulary)
  • Reversible (Token → Text)
  • Behandelt Edge-Cases besser (Punctuation)

Verwendet: T5, mBART, Llama 3 (mit modifications)


Token-Counting Formulas

Rough Estimates (schnell)

English:
1 Token ≈ 4 Characters
1 Token ≈ 0.75 Words

Deutsch:
1 Token ≈ 3 Characters (wegen längerer Wörter)
1 Token ≈ 0.6 Words

Code:
1 Token ≈ 2 Characters (viel Whitespace)

JSON:
1 Token ≈ 3 Characters (Struktur-Overhead)

Beispiel:

Text: "The quick brown fox" (19 Zeichen)
Tokens: 19 / 4 = 4.75 ≈ 5 Tokens
Real: 5 Tokens ✓

Text: "Der schnelle braune Fuchs" (26 Zeichen)
Tokens: 26 / 3 = 8.67 ≈ 9 Tokens
Real: 8 Tokens ✓

Tokenizer-Vergleiche (2026)

Modell Tokenizer Vocab Size Efficiency (EN) Efficiency (DE)
GPT-4 BPE (cl100k) 100K 4.5 chars/token 2.5 chars/token
Claude 3.5 Proprietary ~100K 4.0 chars/token 2.8 chars/token
Llama 3 8B SentencePiece 128K 4.2 chars/token 3.2 chars/token
Llama 3 70B SentencePiece 128K 4.2 chars/token 3.2 chars/token
Mistral 7B SentencePiece 32K 3.8 chars/token 2.8 chars/token
BERT WordPiece 30K 3.5 chars/token 3.0 chars/token

Token-Kosten sparen

Strategie 1: Prompt Compression

Original Prompt:
"Analysiere den folgenden Text gründlich und
 gib mir detailliert eine Zusammenfassung
 mit allen Hauptpunkten und Details."

Tokens: ~25

Compressed:
"Analyze text. Summary with key points."

Tokens: ~8 (68% sparen!)

Aber: Qualität kann sinken!
Best: Kurz sein, aber präzise.

Strategie 2: Context-Reuse

Wenn du 10 Fragen stellst:

Falsch (ineffizient):
Prompt 1: "System: Du bist Assistent. Frage: Was ist X?" (80 tokens)
Prompt 2: "System: Du bist Assistent. Frage: Was ist Y?" (80 tokens)
Prompt 3: ... (80 tokens)
Total: 800 Tokens für 10 Fragen

Richtig (mit Chat History):
Message 1: "System: Du bist Assistent." (10 tokens)
Message 2: "User: Was ist X?" (5 tokens) → Re-use System
Message 3: "User: Was ist Y?" (5 tokens) → Alles cached
Total: ~30 Tokens (97% sparen!)

Mit prompt caching (Claude, GPT-4) ist old context kostenlos!

Strategie 3: Effiziente RAG

Falsch:
1. Retrieve 20 Documents (5000 Tokens)
2. Put all in Prompt
Total pro Query: 5000 Tokens

Richtig:
1. Retrieve top-100 (vector search, fast)
2. Rerank zu top-5 (with cross-encoder)
3. Put nur top-3 in Prompt
Total pro Query: 1500 Tokens (70% sparen!)

Zeit: +50ms für Reranking
Kosten: -70% Tokens
Net: Win!

Special Cases

Code-Tokenisierung

Code ist teuer! Whitespace, Brackets werden Tokens.

Python Code:
def hello_world():
    print("Hello")

Tokens: ~12

Grund:
['def', ' hello', '_', 'world', '(', ')', ':',
 '\n', '    ', 'print', '(', '"Hello"', ')']

Warum viele? Tokenizer wurde auf Natural Language trainiert.
Code-optimierte Tokenizer könnten besser sein, aber nicht standard.

Multilingual-Kosten

Häufig: Englisch < Spanish < German < Chinese < Korean < Turkish

Rough Multiplier:
English: 1.0× (baseline)
Spanish: 1.2×
German: 1.3×
Japanese: 1.5× (viel mehr sub-tokens)
Chinese: 1.8× (Character-based, viel Redundanz)
Korean: 1.9×

Warum? Tokenizer trained hauptsächlich auf English.

Emoji

Emoji kosten viel!

"😀" = 2-3 Tokens (BPE zerlegt es)
"Hello 😀 world" = 6-7 Tokens
vs "Hello world" = 3 Tokens

→ Emoji vermeiden wenn Cost-sensitiv

Context-Window Implications

Ein Modell mit 8K Context hat:

8192 Tokens total

System Prompt: 200 Tokens (üblich)
User Input: 500 Tokens
Available for Response: 8192 - 200 - 500 = 7492 Tokens

Mit German:
System: 150 Tokens (weniger efficient)
Input: 750 Tokens
Available: 8192 - 150 - 750 = 7292 Tokens

→ German braucht mehr Tokens, weniger Platz für Antwort!

Praktische Token-Optimierungen

1. Batch Requests

# Falsch (serial)
for query in queries:
    tokens_used += count_tokens(system_prompt + query)

# Richtig (batch mit shared system prompt)
tokens_used = count_tokens(system_prompt)  # Once
for query in queries:
    tokens_used += count_tokens(query)

Saving: system_prompt × (N-1) Tokens!

2. Summarize Before Store

Raw Document: 5000 Tokens
Summary: 200 Tokens

RAG mit Raw: 5000 T + Query + Output
RAG mit Summary: 200 T + Query + Output

→ 96% Einsparung wenn Qualität gut bleibt

3. Use Right Model

GPT-4 (Powerful aber teuer):
Kosten: €0.03 pro 1K Tokens input

Claude 3.5 Sonnet (Often besser, ähnlicher Preis):
Kosten: €0.003 pro 1K Tokens input

Llama 3 70B (Deployed lokal):
Kosten: ~€0.0001 pro 1K Tokens input (wenn self-hosted)

100K Tokens:
- GPT-4: €3
- Claude 3.5: €0.30
- Llama (local): €0.01

Tokenisierung ist nicht sexy, aber kostet real Geld. Mit 10% Token-Optimierung sparest du auf lange Sicht über 1000€ pro Jahr.