Zum Inhalt springen
EN DE

Challenge 2.1: Tokens

Liest ein LLM Woerter wie Du — oder sieht es etwas ganz anderes?

Text wird tokenisiert zu IDs, LLM verarbeitet sie, Detokenizer erzeugt Output-Text

Ein LLM liest keinen Text. Es arbeitet mit Token IDs — Zahlen, die für Textfragmente (Subword Units) stehen. Der Tokenizer zerlegt Deinen Input in diese Fragmente, das LLM verarbeitet die IDs und der Detokenizer setzt die Ausgabe-IDs wieder zu lesbarem Text zusammen.

Ohne Token-Verständnis: Deine Kosten sind unvorhersehbar. Du wunderst Dich, warum ein deutscher Prompt 40% mehr kostet als ein englischer. Du ueberschreitest das Context Window und bekommst kryptische Fehler. Du kannst nicht einschaetzen, ob Dein Prompt noch ins Budget passt.

Mit Token-Verständnis: Du kannst Kosten vorhersagen, bevor Du den API-Call machst. Du verstehst, warum Sprachen unterschiedlich viele Tokens brauchen. Du kannst Deine Prompts optimieren und weisst genau, wie viel Platz im Context Window noch frei ist.

Tokens sind keine Woerter und keine Buchstaben — sie sind Subword Units. Der Tokenizer zerlegt Text in die häufigsten Zeichenkombinationen seiner Trainingsdaten:

Eingabe: "JavaScript ist fantastisch"
Tokens: ["Java", "Script", " ist", " fant", "astisch"]
Anzahl: 5 Tokens

Haeufige Woerter wie “the” oder “ist” sind oft ein einzelner Token. Seltene Woerter werden in mehrere Teile zerlegt. Das ist der Grund, warum ein LLM kein Woerterbuch hat, sondern einen Tokenizer.

Für schnelle Schaetzungen:

SpracheFaustregelBeispiel
Englisch1 Token ≈ 4 Zeichen”Hello World” ≈ 3 Tokens
Deutsch1 Token ≈ 3 Zeichen”Hallo Welt” ≈ 4 Tokens
CodevariabelKlammern, Operatoren oft eigene Tokens

Warum braucht Deutsch mehr Tokens? Deutsche Woerter sind im Durchschnitt laenger (Zusammensetzungen wie “Datenbankverbindung”) und kommen seltener in den englisch-lastigen Trainingsdaten vor. Der Tokenizer muss sie in mehr Subword Units zerlegen.

Das AI SDK gibt Dir Token-Zahlen über result.usage zurück — automatisch bei jedem Call:

import { generateText } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
const result = await generateText({
model: anthropic('claude-sonnet-4-5-20250514'),
prompt: 'Erklaere was Tokens sind — in einem Satz.',
});
console.log(result.usage);
// → {
// promptTokens: 18, ← Tokens im Input (system + prompt)
// completionTokens: 42, ← Tokens im Output (generierter Text)
// totalTokens: 60 ← Summe
// }

promptTokens sind die Tokens, die Du zum LLM schickst. completionTokens sind die Tokens, die das LLM generiert. Beide zusammen ergeben totalTokens — und beide kosten Geld, aber zu unterschiedlichen Preisen.

Pre-Request Token Counting: Du kannst Tokens auch vor einem API-Call zaehlen — z.B. mit client.messages.countTokens() im Anthropic SDK. Das hilft, Kosten vorherzusagen und Context-Window-Limits einzuhalten, bevor du Geld ausgibst.

import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const tokenCount = await client.messages.countTokens({
model: 'claude-sonnet-4-5-20250514',
messages: [{ role: 'user', content: 'Dein Prompt hier...' }],
});
console.log('Input tokens:', tokenCount.input_tokens);

Schicht 4: Input- vs. Output-Tokens — unterschiedliche Preise

Abschnitt betitelt „Schicht 4: Input- vs. Output-Tokens — unterschiedliche Preise“

Die meisten Provider berechnen Input und Output unterschiedlich:

Preise Stand: Maerz 2026. Aktuelle Preise auf den Anbieterseiten pruefen.

ModellInput (pro 1M Tokens)Output (pro 1M Tokens)
Claude Sonnet 4.5$3.00$15.00
GPT-4o$2.50$10.00
Gemini 2.5 Flash$0.15$0.60

Output-Tokens sind 3-5x teurer als Input-Tokens. Das bedeutet: Ein Prompt, der das LLM zu langen Antworten animiert, kostet ueberproportional mehr. Kurze, praezise Anweisungen (“Antworte in maximal 3 Saetzen”) sparen echtes Geld.

Aufgabe: Zaehle Tokens für verschiedene Texte und vergleiche Deutsch vs. Englisch.

Erstelle eine Datei challenge-2-1.ts:

import { generateText } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
// TODO 1: Generiere eine kurze Antwort auf einen deutschen Prompt
// const resultDE = await generateText({
// model: anthropic('claude-sonnet-4-5-20250514'),
// prompt: 'Erklaere in 2 Saetzen, was eine Datenbank ist.',
// });
// TODO 2: Generiere eine kurze Antwort auf denselben Prompt auf Englisch
// const resultEN = await generateText({
// model: anthropic('claude-sonnet-4-5-20250514'),
// prompt: 'Explain in 2 sentences what a database is.',
// });
// TODO 3: Vergleiche die Token-Zahlen
// console.log('--- Deutsch ---');
// console.log('Prompt Tokens:', resultDE.usage.promptTokens);
// console.log('Completion Tokens:', resultDE.usage.completionTokens);
// console.log('Total Tokens:', resultDE.usage.totalTokens);
// console.log('--- English ---');
// console.log('Prompt Tokens:', resultEN.usage.promptTokens);
// console.log('Completion Tokens:', resultEN.usage.completionTokens);
// console.log('Total Tokens:', resultEN.usage.totalTokens);
// TODO 4: Berechne den Unterschied in Prozent
// const diff = ((resultDE.usage.totalTokens - resultEN.usage.totalTokens) / resultEN.usage.totalTokens * 100).toFixed(1);
// console.log(`\nDeutsch braucht ${diff}% mehr/weniger Tokens als Englisch`);

Checkliste:

  • Deutscher und englischer Prompt mit gleichem Inhalt
  • result.usage für beide geloggt
  • Token-Zahlen verglichen (promptTokens und completionTokens)
  • Prozentualer Unterschied berechnet
Lösung anzeigen
import { generateText } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
const resultDE = await generateText({
model: anthropic('claude-sonnet-4-5-20250514'),
prompt: 'Erklaere in 2 Saetzen, was eine Datenbank ist.',
});
const resultEN = await generateText({
model: anthropic('claude-sonnet-4-5-20250514'),
prompt: 'Explain in 2 sentences what a database is.',
});
console.log('--- Deutsch ---');
console.log('Prompt Tokens:', resultDE.usage.promptTokens);
console.log('Completion Tokens:', resultDE.usage.completionTokens);
console.log('Total Tokens:', resultDE.usage.totalTokens);
console.log('\n--- English ---');
console.log('Prompt Tokens:', resultEN.usage.promptTokens);
console.log('Completion Tokens:', resultEN.usage.completionTokens);
console.log('Total Tokens:', resultEN.usage.totalTokens);
const diff = ((resultDE.usage.totalTokens - resultEN.usage.totalTokens) / resultEN.usage.totalTokens * 100).toFixed(1);
console.log(`\nDeutsch braucht ${diff}% mehr Tokens als Englisch`);

Ausfuehren mit:

Terminal-Fenster
npx tsx challenge-2-1.ts

Erwarteter Output (ungefaehr):

--- Deutsch ---
Prompt Tokens: 22
Completion Tokens: 55
Total Tokens: 77
--- English ---
Prompt Tokens: 18
Completion Tokens: 42
Total Tokens: 60
Deutsch braucht 28.3% mehr Tokens als Englisch

Die genauen Zahlen variieren bei jedem Aufruf (LLM-Output ist nicht deterministisch), aber der deutsche Prompt sollte konsistent 20-40% mehr Tokens verbrauchen.

Erklärung: Das liegt an der Tokenizer-Verteilung — englische Woerter kommen haeufiger in den Trainingsdaten vor und werden effizienter kodiert.

Aufgabe fliesst in selectModel zum Modell, generateText gibt result.usage zurück, Token-Vergleich

Uebung: Kombiniere Token-Counting mit der Modell-Auswahl aus Level 1. Stelle denselben Prompt an zwei verschiedene Modelle und vergleiche den Token-Verbrauch.

  1. Nutze selectModel('zusammenfassen') für ein Flash-Modell (z.B. Gemini Flash)
  2. Nutze selectModel('analysieren') für ein Pro-Modell (z.B. Claude Sonnet)
  3. Stelle denselben Prompt an beide Modelle
  4. Vergleiche promptTokens und completionTokens — unterschiedliche Tokenizer ergeben unterschiedliche Zahlen

Optional Stretch Goal: Berechne die geschaetzten Kosten für beide Modelle basierend auf der Preistabelle aus Schicht 4. Welches Modell ist guenstiger — und um wie viel?

Part of AI Learning — free courses from prompt to production. Jan on LinkedIn