Startseite / Artikel / Vom Prompt zum Token: Wie ein LLM Text in Zahlen verwandelt und zurück

Vom Prompt zum Token: Wie ein LLM Text in Zahlen verwandelt und zurück

Wir verfolgen einen kurzen Prompt durch Tokenisierung, Embeddings, Attention, Feed-Forward-Schichten, Softmax und Sampling, um zu sehen, wie ein Modell jedes nächste Wort wirklich auswählt.

1615 Wörter

Im Modell gibt es kein Englisch

Drücken Sie bei einem Prompt Enter, und eine GPU arbeitet sich durch Milliarden Gleitkommaoperationen, bevor das erste Token erscheint. Keine einzige dieser Operationen berührt ein englisches Wort.

Nehmen wir ein vertrautes Fragment:

"The cat sat on the "

Bis "mat" auf dem Bildschirm erscheint, wurde dieses Fragment zerlegt, in Geometrie mit Tausenden Dimensionen verwandelt und durch Dutzende identische mathematische Schichten geschoben.

Wir reden darüber recht salopp. Das Modell habe den Prompt „gelesen“, den Kontext „verstanden“ und eine sinnvolle Fortsetzung „gewählt“. Nichts davon passiert wörtlich. Das laufende Programm enthält kein Englisch, keine Grammatikregeln, die Subjekt und Prädikat trennen, und keine gespeicherten Wörterbuchdefinitionen. Stattdessen läuft ein Fließband von Tensoroperationen: Ein String wird zu ganzen Zahlen, die Zahlen werden zu Koordinaten im Raum, die Koordinaten werden über Dutzende Schichten vermischt, und am Ende wird einmal ein gezinkter Würfel geworfen.

Wer Sprachmodelle wirklich verstehen will, lässt die Metaphern weg und folgt den Daten. Das ist der Weg, den Ihr Text nimmt.

Schritt 1: der Tokenizer

Neuronale Netze können nicht mit rohen Zeichen arbeiten, denn mit dem Buchstaben „c“ lässt sich keine Algebra betreiben. Sie brauchen Zahlen. Deshalb verarbeitet ein separates Programm, der Tokenizer, den Prompt, bevor er dem Modell überhaupt nahekommt.

Der Tokenizer zerschneidet den String in Stücke, die Tokens heißen. Ein Token kann ein ganzes Wort, eine Silbe, ein Präfix oder ein einzelnes Satzzeichen sein. Unsere Phrase zerfällt sauber in fünf:

  • "The"
  • " cat"
  • " sat"
  • " on"
  • " the"

Achten Sie auf die führenden Leerzeichen. Das sind keine Tippfehler. Moderne Tokenizer kleben das Leerzeichen vor einem Wort an das Token, wodurch "cat" und " cat" zwei verschiedene Tokens sind.

Jedes Token entspricht einer ganzen Zahl in einer festen Vokabulartabelle. Bei einem Vokabular von beispielsweise 50257 Tokens wird die Phrase zu fünf Zahlen:

[464, 3797, 3372, 319, 262]

Noch keine Schicht des Sprachmodells ist gelaufen, und der String ist bereits verschwunden. Übrig sind nur fünf ganze Zahlen.

Schritt 2: die Embedding-Tabelle

Jetzt übernimmt das eigentliche Netz, und seine erste Aufgabe ist ein grundlegendes Problem. Ganze Zahlen taugen nicht für Analysis. Die Zahl 3797, die für „ cat“ steht, ist „dog“ nicht näher als „airplane“. Es sind willkürliche Etiketten, und mit Etiketten kann man keine Geometrie betreiben.

Die Lösung: Jede Zahl wird in eine dichte Liste von Gleitkommazahlen verwandelt, einen Embedding-Vektor. Stellen Sie sich eine riesige Nachschlagetabelle im GPU-Speicher vor. Angenommen, das Vokabular umfasst 32.000 Tokens und die versteckte Dimension beträgt 4.096. Dann ist die Tabelle eine Matrix mit 32.000 Zeilen und 4.096 Spalten, und das Modell schlägt einfach nach:

  • Token 464 holt Zeile 464.
  • Token 3797 holt Zeile 3797.
  • Token 3372 holt Zeile 3372.
  • Token 319 holt Zeile 319.
  • Token 262 holt Zeile 262.

In diesem Schritt wird nicht gerechnet. Es ist ein schlichter Speicherzugriff. Heraus kommt eine Matrix der Form [5, 4096], fünf Zeilen mit je 4.096 kontinuierlichen Werten.

Jedes Token ist jetzt ein Punkt in einem 4.096-dimensionalen Raum, in dem Richtung Bedeutung trägt und Positionen Beziehungen kodieren, die aus Milliarden Trainingsbeispielen gelernt wurden.

Bevor die Vektoren weiter nach unten wandern, kommt noch eine Zutat hinzu: Positionsinformation. Matrixoperationen allein können die Wortreihenfolge durcheinanderbringen, also mischt das Modell Positionssignale in die Koordinaten. Ohne sie sähen „The cat sat on the“ und „The on sat cat the“ für das Netz identisch aus.

Schritt 3: der Transformer-Stack

Die [5, 4096]-Matrix betritt jetzt den Transformer. In einem typischen Design mit 7 Mrd. Parametern besteht der Stack aus 32 identischen Blöcken. Die Matrix behält ihre Form in jedem davon, geht in Schicht 1 hinein und kommt aus Schicht 32 als [5, 4096] heraus. Was sich ändert, ist die Information in diesen Zahlen.

Direkt aus der Embedding-Tabelle steht jeder Vektor für sich. Der Vektor für " sat" weiß, dass er „saß“ bedeutet, kann aber nicht sagen, wer saß, wo oder warum. Zwei Mechanismen in jedem Block beheben das.

Attention

Hier kommunizieren die Vektoren. Attention lässt jede Position auf frühere Positionen zurückblicken und herausziehen, was relevant ist.

Nehmen wir das fünfte Token, " the". Es misst seine Ähnlichkeit zu "The", " cat", " sat" und " on". Da es helfen muss vorherzusagen, welches Substantiv auf eine Präposition folgt, stützt sich sein Vektor stark auf die Handlung und auf das Subjekt. Über Skalarprodukte zwischen diesen Positionen frischt die Attention-Schicht jeden Vektor mit Kontext aus seiner Nachbarschaft auf.

Das Feed-Forward-Netz

Nachdem die Tokens Informationen ausgetauscht haben, läuft jede Zeile einzeln durch ein Feed-Forward-Netz (ein MLP). Wenn Attention bedeutet, dass Tokens miteinander reden, rechnet in dieser Schicht jedes Token für sich. Sie projiziert den frisch gesammelten Kontext durch Tausende gelernter Gewichte, wodurch das Modell in seinen Parametern gespeicherte Faktenassoziationen aktivieren kann.

Das alles wiederholt sich 32-mal. In Schicht 32 ist der fünfte Vektor kein generischer Platzhalter mehr für das Wort " the", denn er hat die Geschichte des ganzen Satzes aufgenommen. Er steht jetzt für einen bestimmten Artikel, der auf eine sitzende Katze folgt.

Unembedding

Für das nächste Wort spielen die ersten vier Zeilen keine Rolle mehr, also nimmt das Modell nur die letzte: einen Vektor aus 4.096 Gleitkommazahlen. Jetzt läuft das Embedding-Problem rückwärts. Das Modell hat einen Punkt im 4.096-dimensionalen Raum und braucht ein Wort.

Eine zweite Matrix, die Unembedding-Matrix (häufig einfach die transponierte Embedding-Tabelle), wird mit diesem Vektor multipliziert und verteilt seine 4.096 Werte wieder auf das gesamte Vokabular. Das Ergebnis ist ein nicht normierter Wert für jedes Token im Vokabular, zum Beispiel:

Ganz oben stünden " mat" mit 16,2 und " rug" mit 13,8, gefolgt von " floor" mit 12,1 und " couch" mit 10,4. Weit unten in der Liste steht "LeBron James" mit -12,5.

Diese Rohwerte heißen Logits. Ein höheres Logit bedeutet, dass die gelernten Parameter des Netzes eine stärkere geometrische Übereinstimmung zwischen dem Endzustand des Prompts und diesem Kandidaten gefunden haben.

Softmax

Logits lassen sich nicht direkt verwenden. Einige sind groß und positiv, andere negativ, und ihre Summe ist beliebig. Deshalb schickt das Modell den ganzen Vektor durch Softmax: Für jeden Eintrag wird e hoch seinen Wert genommen und durch die Summe dieser Exponentialwerte über alle Einträge geteilt.

Softmax erledigt zwei Dinge. Die Exponentialfunktion macht jeden Wert strikt positiv. Die Division durch die Summe sorgt dafür, dass alles zusammen 1,0 ergibt. Heraus kommt eine echte Wahrscheinlichkeitsverteilung über alle 32.000 Tokens, ungefähr so:

Der Spitzenreiter " mat" erhält 68,4 %. " rug" bekommt 17,1 %, " floor" 9,2 % und " couch" 4,1 %. Am äußersten Ende bleiben " LeBron James" 0,000001 %.

Sampling

Bis hierhin ist alles deterministisch. Bei identischen Gewichten und identischer Eingabe weichen die Wahrscheinlichkeiten nicht einmal in einer Nachkommastelle ab. Die Unvorhersehbarkeit von LLMs kommt erst im letzten Schritt ins Spiel, beim Sampling.

Würde das System immer das wahrscheinlichste Token nehmen, hier " mat" mit 68,4 %, wäre das Greedy Decoding. Es ist deterministisch, verfällt bei längeren Ausgaben aber gern in repetitive, unnatürliche Schleifen. Also wirft die Software stattdessen einen gewichteten Würfel. In etwa 68 % der Fälle landet er auf " mat", in etwa 17 % auf " rug".

Die Temperature-Einstellung in einem API-Aufruf formt diese Kurve um, bevor gewürfelt wird. Eine niedrige Temperatur verstärkt die Abstände und kann " mat" in Richtung 95 % treiben. Eine hohe Temperatur flacht die Kurve ab, sodass weiter unten platzierte Tokens deutlich bessere Chancen bekommen, gewählt zu werden.

Der Würfel fällt, und es gewinnt die Token-ID 2603.

Detokenisierung und die Schleife

Das Programm sucht die ID 2603 in einer umgekehrten Vokabulartabelle, findet den String " mat" und schickt ihn an Ihr Terminal oder Ihren Browser.

Hier zeigt sich die zentrale Tatsache der Inferenz: Zu keinem Zeitpunkt weiß das Modell, was nach " mat" kommt. Es kann nicht drei Wörter vorausplanen und hält keine Gliederung des Absatzes fest, den es schreibt. Um weiterzukommen, hängt es das neue Wort an die Eingabe an und bildet einen völlig neuen Prompt:

"The cat sat on the mat"

Es tokenisiert alle sechs Wörter, holt die Embeddings für alle sechs Zeilen, schickt alle sechs Positionen durch alle 32 Schichten, berechnet die Logits für Position sechs, wendet Softmax an, würfelt und wählt das siebte Token. Dieser komplette Zyklus vom String über den Tensor bis zum Würfelwurf wiederholt sich für jedes Token, das auf Ihrem Bildschirm erscheint.

Fragen, die diese Pipeline aufwirft

Mit Ingenieursblick betrachtet, wirft die Mechanik unbequeme Fragen auf. Jedes generierte Wort scheint zu verlangen, das gesamte bisherige Gespräch durch Milliarden Operationen zu schicken, also müssten lange Chats die Hardware fast zum Stillstand bringen. (Warum das nicht passiert, liegt am Caching im Speicher, ein Thema für ein andermal.)

Noch rätselhafter ist der erste Schritt: der Sprung von menschlicher Sprache zu Zahlen. Bevor Attention feuerte oder irgendeine Schicht lief, war der Prompt schon in willkürliche Zahlenstücke zerhackt. Warum Subwörter und nicht Zeichen, ganze Wörter oder rohe Bytes? Warum verhalten sich Token-Zahlen bei ungewöhnlichen Strings oder Python-Zeilen unvorhersehbar? Die Tokenisierung ist die erste Station der Kette, und sie sollte man als Nächstes öffnen.