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.
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.
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.
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.
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.
encode(...).ids sie liefert