LLM-Antworten mit SSE und Usage-Chunks streamen
Automatische Übersetzung
Dieser Artikel wurde automatisch aus der englischen Originalversion übersetzt.
Um eine LLM-Antwort zu streamen, parsen Sie das Event-Protokoll des Servers, setzen Inhaltsdeltas zusammen und aktualisieren die Anzeige, sobald nutzbarer Text eintrifft. Viele APIs verwenden Server-Sent Events, kurz SSE. Ein HTTP-Lesevorgang kann einen Teil eines Events oder mehrere Events enthalten. Ein Event kann mehrere Tokens des Models enthalten.
Client-Implementierungen brauchen neben einer schnellen ersten Aktualisierung auch Pufferung und eine Behandlung des Abschlusses.
Events vor den Model-Daten parsen
Das SSE-Format verwendet Zeilen wie data: und beendet ein Event mit einer Leerzeile. Netzwerk-Lesevorgänge können diese Zeilen aufteilen oder mehrere Events zusammenfassen. Puffern Sie unvollständigen Text, erkennen Sie vollständige Events und parsen Sie dann die API-spezifischen Nutzdaten. Mehrere data:-Zeilen gehören zu einem Event.
Bei OpenAI Chat Completions kommen Inhalte als Deltas an, die der Client zu einer Nachricht zusammensetzt. Behandeln Sie Deltas für Tool Calls oder strukturierte Deltas anhand ihrer Felder, statt jedes Event als Fließtext zu behandeln. Der Marker [DONE] ist eine API-Konvention und keine allgemeine SSE-Anforderung.
Eine sinnvolle Verarbeitungsreihenfolge im Client ist:
- Eingehende Bytes dekodieren, ohne ein aufgeteiltes UTF-8-Zeichen zu verlieren.
- Puffern, bis ein vollständiges SSE-Event vorliegt.
- Das Event anhand des Schemas der gewählten API interpretieren.
- Inhalte oder strukturierte Felder an die zusammengesetzte Antwort anhängen.
- Die Anzeige an einer geeigneten Puffergrenze aktualisieren.
Rendering, Abschluss und Verbrauch trennen
Rendern Sie Fließtext möglichst zeitnah. Puffern Sie unvollständige Markdown-Konstrukte oder Codezeilen, wenn sofortige Formatierung wiederholte Layoutänderungen verursacht. Erfassen Sie den Beginn der Anfrage und den ersten generierten Inhalt getrennt vom Öffnen der Verbindung oder einem Event, das nur Metadaten enthält.
In OpenAIs Chat API fordert stream_options: {"include_usage": true} einen abschließenden Usage-Chunk vor [DONE] an. Dieser Usage-Chunk enthält ein leeres Choices-Array. Unterbrochene oder abgebrochene Streams liefern ihn möglicherweise nie. Fehlende Verbrauchsdaten dürfen daher nicht als null Tokens interpretiert werden.
OpenAI-kompatible Server können andere Nutzdaten oder ein anderes Abschlussverhalten implementieren. Testen Sie fragmentierte Events, mehrere Events pro Lesevorgang, leere Deltas, Abbrüche, Serverfehler und fehlende abschließende Verbrauchsdaten mit der Implementierung in der festgelegten Version. Behalten Sie bereits empfangenen Text und unterscheiden Sie eine unvollständige Antwort von einem erfolgreichen Abschluss.
Engineering-Leitfaden: Streaming in der Praxis verbindet das Client-Verhalten mit TTFT, TPOT und Prefill-Scheduling.