Dieses Diagramm veranschaulicht die Interaktionen beim Chat eines Benutzers mit einem Large Language Model (LLM).
Komponenten
- Benutzer: Die Person, die mit der Chat-Oberfläche interagiert
- Browser: Die Anwendung, die im Webbrowser des Benutzers läuft
- Middleware-Server: Der Backend-Server, der Web-Anwendung bereitstellt und die Kommunikation mit dem LLM übernimmt.
- LLM: Das Large Language Model, das Anfragen verarbeitet und Antworten generiert.
Ablauf
-
Initialisierung: Der Benutzer öffnet die Chat-Oberfläche, und der Browser stellt eine Verbindung zum Middleware-Server her.
-
Chat-Interaktion: Der Benutzer gibt einen Prompt ein, der über eine HTTP-POST-Anfrage an den Middleware-Server gesendet wird. Der Server leitet diesen Prompt zur Verarbeitung an das LLM weiter.
-
Inkrementelle Antwort mit SSE (Server-Sent Events): Mit dem ersten Token startet der Server eine SSE-Antwort zum Browser. Während das LLM Tokens generiert, werden diese in Echtzeit an den Browser gestreamt. Der Browser zeigt diese Tokens inkrementell an und erzeugt den Effekt, dass das LLM seine Antwort “tippt”
-
Nachfrage: Der Benutzer kann das Gespräch mit Folgefragen fortsetzen. Diese beinhalten immer den bisherigen Gesprächsverlauf. Das LLM ist zwischen zwei Chat-Interaktionen “stateless”.
-
Was das LLM macht, um die Antwort zu generieren
Ist bei der ersten Anfrage das Modell noch nicht geladen (“Kaltstart”) wird das LLM-Modell geladen und initialisiert. Dies kann sehr lange dauern. Deswegen wird man dafür zumeist dafür sorgen, dass das Laden vor dem ersten Prompt stattfindet und ein Warmstart möglich ist.
In jedem Fall beginnt mit der Prompt-Verarbeitung die Prefill-Phase, in der der Eingabetext in einzelne Token aufgeteilt wird. Für jedes Token im Prompt wird sein Embedding bestimmt und der sogenannte QKV-Cache wird befüllt. Hierdurch kann das Modell semantische Beziehungen im Prompt herstellen (“Attention”).
In der Dekodierungsphase wird der so aufbereitete Input durch Transformer-Blöcke verarbeitet. Für jedes Token ergibt sich am Ende eine Wahrscheinlichkeit, wie gut es als Folgetoken passt. Das LLM wählt daraus das nächste Token aus und wandelt es in Text um.
Um nun ein weiteres Token zu generieren, muss zuerst das voherige Token der QKV-Datenstrukur hinzugefügt werden. Diese beiden Schritte wiederholen sich kontinuierlich und die Ausgabe verlängert sich jeweils um ein Token.
Das Ende der Ausgabe ist dann erreicht, wenn ein besonderes Token, meist das “End-of-Sequence”-Token vom LLM ausgewählt wird. Die Antort ist jetzt vollständig generiert. Alle Datenstrukturen werden vom LLM freigegeben für die nächste Prompt-Anfrage.