Byte-Level BPE · Hugging Face tokenizers

Tokenizer-Werkbank

Hier läuft derselbe Algorithmus wie im Python-Code, Schritt für Schritt im Browser. Du lädst einen Datensatz, siehst, wie der Text zerlegt wird, schaust dem BPE-Training bei jedem einzelnen Merge zu und wendest den fertigen Tokenizer auf eigene Sätze an.

Station 1 von 4

Den Trainingstext bereitstellen

train_from_iterator erwartet eine Folge von Strings, zum Beispiel eine Liste. Jeder String ist ein Trainingstext. Im Python-Code steckt diese Liste in texte["train"]; sie wurde vorher aus einer Datei gelesen.

Hier übernimmt die App das Einlesen. Sie erkennt JSON und JSONL. Bei Objekten wählst du das Feld, in dem der Text steht, bei deinen Chat-Daten ist das text.

Zum Start ist ein Beispiel geladen: die ersten 300 Zeilen aus eval.jsonl. Die Datei bleibt in deinem Browser; nichts wird hochgeladen.

JSON- oder JSONL-Datei hierher ziehen oder
höchstens 500 KB
Beispiel geladen.
Die ersten drei Texte
Station 2 von 4

Vorzerlegen: Bytes und Wortstücke

Zeile 3 legt das Modell fest: Byte Pair Encoding, noch ohne Vokabular. Zeile 4 bestimmt, wie Text vor dem Modell aufbereitet wird. Der ByteLevel-Pre-Tokenizer erledigt zwei Dinge:

a) Zerlegen mit einem regulären Ausdruck. Der Text wird in Wörter, Zahlen, Satzzeichen und Leerraum getrennt. Ein Leerzeichen bleibt am folgenden Wort hängen. Später entstehen Tokens nur innerhalb dieser Stücke, nie über ihre Grenzen hinweg.

b) Bytes in Zeichen übersetzen. Jedes Stück wird als UTF-8-Bytefolge betrachtet. Jedes der 256 möglichen Bytes bekommt ein druckbares Ersatzzeichen. So kann der Tokenizer jeden Text darstellen. Unsichtbare Bytes bekommen sichtbare Stellvertreter: Ġ steht für das Leerzeichen, Ċ für den Zeilenumbruch. Ein Umlaut wie „ü“ besteht aus zwei Bytes und wird deshalb zu zwei Zeichen.

add_prefix_space=False heißt: Am Textanfang wird kein Leerzeichen ergänzt. Probiere den Schalter rechts aus und achte auf das erste Wort.

Klicke auf ein Stück in Zeile 3, um seine Bytes einzeln zu sehen.

1 · Originaltext (· = Leerzeichen, ↵ = Zeilenumbruch)
↓ Regex zerlegt
2 · Stücke nach dem Regex
↓ Bytes werden zu Ersatzzeichen
3 · Byte-Level-Darstellung, so sieht das Training die Wörter

Was beim Training ankommt für den ganzen Datensatz

Das Training arbeitet nicht mit ganzen Texten, sondern mit einer Liste aller verschiedenen Stücke und ihrer Häufigkeit.

Station 3 von 4

Training: Paare zählen, das häufigste verschmelzen, wiederholen

Startpunkt. Das Vokabular besteht zuerst aus den drei Special Tokens (IDs 0 bis 2) und allen einzelnen Zeichen, die in den Stücken vorkommen. Jedes Stück ist eine Folge solcher Einzelzeichen.

Ein Schritt. Der Trainer zählt alle benachbarten Paare, gewichtet mit der Häufigkeit der Stücke. Das häufigste Paar wird zu einem neuen Token verschmolzen und überall ersetzt. Danach wird neu gezählt.

Abbruch. Das Training endet, sobald vocab_size erreicht ist oder das häufigste Paar seltener als min_frequency vorkommt.

Die Special Tokens sind reserviert, werden im Training aber nicht gesondert behandelt. Deshalb tauchen Bruchstücke wie <|, im oder |> als normale Tokens auf.

Bei Gleichstand gewinnt wie in der Bibliothek das Paar mit den kleineren IDs. Mit eval.jsonl geprüft: Vokabular und Merge-Reihenfolge stimmen exakt mit der Python-Bibliothek überein.

Nächste Kandidaten häufigste Paare im aktuellen Zustand

Die häufigsten Stücke Tokengrenzen im aktuellen Zustand

Gelernte Merges neueste oben

Speichern und Ausgabe

Die Datei tokenizer.json enthält die ganze Pipeline. Kern des Modells sind zwei Listen: das Vokabular (Token → ID) und die Merges in ihrer Lernreihenfolge.


          
Station 4 von 4

Anwenden: Text rein, IDs raus und wieder zurück

Beim encode() laufen dieselben Stufen wie beim Training, nur ohne Zählen:

a) Special Tokens werden zuerst herausgetrennt und bekommen direkt ihre ID. b) Der Rest geht durch den Pre-Tokenizer aus Station 2. c) In jedem Stück werden die gelernten Merges angewendet, immer der früheste zuerst. Ein Merge, der im Training früh gelernt wurde, hat Vorrang.

Zeile 14, Post-Processor: Er setzt die Offsets, also wo im Originaltext ein Token steht. Mit trim_offsets=False gehört das führende Leerzeichen eines Tokens wie Ġbig zum Offset dazu. Es werden keine zusätzlichen Start- oder Endtokens angehängt.

Zeile 5, Decoder: Er setzt die Tokens zusammen und übersetzt die Ersatzzeichen zurück in Bytes und damit in Text. In Python lässt decode() Special Tokens standardmäßig weg.

Die Anwendung nutzt den aktuellen Trainingsstand aus Station 3. Trainierst du nur wenige Merges, zerfällt der Text in viel mehr Tokens.

a · Special Tokens abtrennen
b + c · Tokens (klicke ein Token, um zu sehen, wie sein Stück entstanden ist)
IDs, wie encode(...).ids sie liefert

Offsets Position jedes Tokens im Originaltext

Zurück zum Text Decoder