In meinen neuesten Beiträgenviel darüber geredet immediate Caching sowie Caching im Allgemeinenund wie es Ihre KI-App im Hinblick auf Kosten und Latenz verbessern kann. Doch selbst bei einer vollständig optimierten KI-App dauert es manchmal einfach einige Zeit, bis die Antworten generiert werden, und wir können einfach nichts dagegen tun. Wenn wir große Ausgaben vom Modell verlangen oder Argumentation oder tiefes Denken erfordern, wird das Modell natürlich länger brauchen, um zu reagieren. So sinnvoll dies auch ist, kann es für den Benutzer frustrierend sein, länger auf eine Antwort zu warten und sein gesamtes Benutzererlebnis mit einer KI-App zu beeinträchtigen. Glücklicherweise gibt es eine einfache und unkomplizierte Möglichkeit, dieses Downside zu beheben Antwort-Streaming.

Streaming bedeutet, die Antwort des Modells inkrementell und nach und nach so zu erhalten, wie sie generiert wurde, anstatt darauf zu warten, dass die gesamte Antwort generiert wird, und sie dann dem Benutzer anzuzeigen. Normalerweise (ohne Streaming) senden wir eine Anfrage an die API des Modells, warten darauf, dass das Modell die Antwort generiert, und sobald die Antwort abgeschlossen ist, erhalten wir sie in einem Schritt von der API zurück. Beim Streaming sendet die API jedoch Teilausgaben zurück während die Antwort generiert wird. Dies ist ein ziemlich vertrautes Konzept, da die meisten benutzerorientierten KI-Apps wie ChatGPT vom ersten Second an Streaming nutzten, um ihren Benutzern ihre Antworten anzuzeigen. Aber über ChatGPT und LLMs hinaus wird Streaming grundsätzlich überall im Net und in modernen Anwendungen eingesetzt, beispielsweise in Stay-Benachrichtigungen, Multiplayer-Spielen oder Stay-Newsfeeds. In diesem Beitrag werden wir weiter untersuchen, wie wir Streaming in unsere eigenen Anfragen zur Modellierung von APIs integrieren und einen ähnlichen Effekt auf benutzerdefinierte KI-Apps erzielen können.

Es gibt verschiedene Mechanismen, um das Konzept des Streamings in einer Anwendung zu implementieren. Dennoch gibt es für KI-Anwendungen zwei weit verbreitete Streaming-Arten. Im Einzelnen sind dies:

  • HTTP-Streaming über vom Server gesendete Ereignisse (SSE): Dabei handelt es sich um eine relativ einfache, einseitige Artwork des Streamings, die nur Stay-Kommunikation vom Server zum Consumer ermöglicht.
  • Streaming mit WebSockets: Hierbei handelt es sich um eine fortgeschrittenere und komplexere Artwork des Streamings, die eine bidirektionale Stay-Kommunikation zwischen Server und Consumer ermöglicht.

Im Kontext von KI-Anwendungen kann HTTP-Streaming über SSE einfache KI-Anwendungen unterstützen, bei denen wir aus Latenz- und UX-Gründen lediglich die Antwort des Modells streamen müssen. Wenn wir jedoch über einfache Anforderungs-Antwort-Muster hinaus zu komplexeren Konfigurationen übergehen, werden WebSockets besonders nützlich, da sie eine bidirektionale Stay-Kommunikation zwischen unserer Anwendung und der API des Modells ermöglichen. Beispielsweise muss der Consumer in Code-Assistenten, Multi-Agent-Systemen oder Instrument-Aufruf-Workflows möglicherweise Zwischenaktualisierungen, Benutzerinteraktionen oder Suggestions an den Server zurücksenden, während das Modell noch eine Antwort generiert. Für die meisten einfachen KI-Apps, bei denen wir lediglich das Modell benötigen, um eine Antwort bereitzustellen, sind WebSockets jedoch normalerweise übertrieben und SSE reicht aus.

Im Relaxation dieses Beitrags werden wir uns das Streaming für einfache KI-Apps mit HTTP-Streaming über SSE genauer ansehen.

. . .

Was ist mit HTTP-Streaming über SSE?

HTTP-Streaming beendet Vom Server gesendete Ereignisse (SSE) basiert auf HTTP-Streaming.

. . .

HTTP-Streaming bedeutet, dass der Server alles, was er senden muss, in Teilen und nicht auf einmal senden kann. Dies wird dadurch erreicht, dass der Server die Verbindung zum Consumer nach dem Senden einer Antwort nicht beendet, sondern diese offen lässt und dem Consumer jedes zusätzliche Ereignis sofort sendet.

Anstatt beispielsweise die Antwort in einem Block zu erhalten:

Whats up world!

wir könnten es in Teilen mit rohem HTTP-Streaming erhalten:

Whats up

World

!

Wenn wir HTTP-Streaming von Grund auf implementieren würden, müssten wir uns um alles selbst kümmern, einschließlich der Analyse des gestreamten Texts, der Verwaltung etwaiger Fehler und der erneuten Verbindung mit dem Server. In unserem Beispiel, das rohes HTTP-Streaming verwendet, müssten wir dem Consumer irgendwie erklären, dass „Hallo Welt!“ ist konzeptionell ein Ereignis, und alles danach wäre ein separates Ereignis. Glücklicherweise gibt es mehrere Frameworks und Wrapper, die das HTTP-Streaming vereinfachen. Eines davon ist HTTP-Streaming über vom Server gesendete Ereignisse (SSE).

. . .

Additionally, Vom Server gesendete Ereignisse (SSE) Bieten Sie eine standardisierte Möglichkeit zur Implementierung von HTTP-Streaming, indem Sie Serverausgaben in klar definierte Ereignisse strukturieren. Diese Struktur erleichtert das Analysieren und Verarbeiten gestreamter Antworten auf der Clientseite erheblich.

Zu jeder Veranstaltung gehören in der Regel:

  • ein id
  • ein occasion Typ
  • A information Nutzlast

oder besser gesagt..

id: <unique-event-id>
occasion: <event-type>
information: <payload>

Unser Beispiel mit SSE könnte etwa so aussehen:

id: 1
occasion: message
information: Whats up world!

Aber was ist ein Ereignis? Alles kann als Ereignis gelten – ein einzelnes Wort, ein Satz oder Tausende von Wörtern. Was in unserer speziellen Implementierung tatsächlich als Ereignis gilt, wird durch die Einrichtung der API oder des Servers, mit dem wir verbunden sind, definiert.

Darüber hinaus bietet SSE zahlreiche weitere Annehmlichkeiten, wie z. B. die automatische Wiederherstellung der Verbindung zum Server, wenn die Verbindung unterbrochen wird. Eine weitere Sache ist, dass eingehende Stream-Nachrichten eindeutig mit gekennzeichnet sind textual content/event-streamsodass der Kunde angemessen damit umgehen und Fehler vermeiden kann.

. . .

Krempeln Sie die Ärmel hoch

Frontier LLM APIs mögen OpenAIs API oder Claude API unterstützen nativ HTTP-Streaming über SSE. Auf diese Weise wird die Integration von Streaming in Ihre Anfragen relativ einfach, da dies durch Ändern eines Parameters in der Anfrage (z. B. Aktivieren eines) erreicht werden kann stream=true Parameter).

Sobald das Streaming aktiviert ist, wartet die API nicht mehr auf die vollständige Antwort, bevor sie antwortet. Stattdessen sendet es kleine Teile der Modellausgabe zurück, sobald diese generiert werden. Auf der Clientseite können wir diese Blöcke durchlaufen und sie dem Benutzer nach und nach anzeigen, wodurch der bekannte ChatGPT-Eingabeeffekt entsteht.

Aber lassen Sie uns ein minimales Beispiel dafür machen, indem wir wie üblich die OpenAI-API verwenden:

import time
from openai import OpenAI

consumer = OpenAI(api_key="your_api_key")

stream = consumer.responses.create(
    mannequin="gpt-4.1-mini",
    enter="Clarify response streaming in 3 brief paragraphs.",
    stream=True,
)

full_text = ""

for occasion in stream:
    # solely print textual content delta as textual content elements arrive
    if occasion.sort == "response.output_text.delta":
        print(occasion.delta, finish="", flush=True)
        full_text += occasion.delta

print("nnFinal collected response:")
print(full_text)

Anstatt in diesem Beispiel eine einzelne vollständige Antwort zu erhalten, durchlaufen wir einen Ereignisstrom und drucken jedes Textfragment aus, sobald es eintrifft. Gleichzeitig speichern wir die Chunks auch in einer vollständigen Antwort full_text um es später zu verwenden, wenn wir wollen.

. . .

Soll ich additionally bei jeder Anfrage einfach „streaming = True“ angeben?

Die kurze Antwort ist nein. So nützlich es auch ist und ein großes Potenzial für eine deutliche Verbesserung des Benutzererlebnisses bietet, ist Streaming keine Einheitslösung für KI-Apps, und wir sollten nach eigenem Ermessen beurteilen, wo es implementiert werden sollte und wo nicht.

Genauer gesagt ist das Hinzufügen von Streaming in einer KI-App sehr effektiv in Setups, in denen wir lange Antworten erwarten und wir vor allem das Benutzererlebnis und die Reaktionsfähigkeit der App schätzen. Ein solcher Fall wären verbraucherorientierte Chatbots.

Auf der anderen Seite dürfte das Hinzufügen von Streaming bei einfachen Apps, bei denen wir erwarten, dass die bereitgestellten Antworten kurz sind, keine nennenswerten Verbesserungen für das Benutzererlebnis bringen und macht auch wenig Sinn. Darüber hinaus macht Streaming nur dann Sinn, wenn die Ausgabe des Modells Freitext und keine strukturierte Ausgabe ist (z. B. JSON-Dateien).

Der größte Nachteil des Streamings besteht vor allem darin, dass wir nicht in der Lage sind, die vollständige Antwort zu überprüfen, bevor wir sie dem Benutzer anzeigen. Denken Sie daran, dass LLMs die Token einzeln generieren und die Bedeutung der Antwort beim Generieren der Antwort und nicht im Voraus gebildet wird. Wenn wir 100 Anfragen an ein LLM mit genau derselben Eingabe stellen, erhalten wir 100 verschiedene Antworten. Das heißt, bevor die Antworten vollständig sind, weiß niemand, was es sagen wird. Daher ist es bei aktiviertem Streaming viel schwieriger, die Ausgabe des Modells zu überprüfen, bevor sie dem Benutzer angezeigt wird, und Garantien für den produzierten Inhalt anzuwenden. Wir können immer versuchen, Teilabschlüsse zu bewerten, aber auch hier sind Teilabschlüsse schwieriger zu bewerten, da wir raten müssen, wohin das Modell damit geht. Wenn man hinzufügt, dass diese Auswertung in Echtzeit und nicht nur einmal, sondern rekursiv für verschiedene Teilantworten des Modells durchgeführt werden muss, wird dieser Prozess noch anspruchsvoller. In der Praxis wird in solchen Fällen die Validierung der gesamten Ausgabe durchgeführt, nachdem die Antwort abgeschlossen ist. Das Downside dabei ist jedoch, dass es zu diesem Zeitpunkt möglicherweise bereits zu spät ist, da wir dem Benutzer möglicherweise bereits unangemessene Inhalte angezeigt haben, die unsere Validierungen nicht bestehen.

. . .

In meinen Gedanken

Streaming ist eine Funktion, die keinen tatsächlichen Einfluss auf die Fähigkeiten der KI-App oder die damit verbundenen Kosten und Latenz hat. Dennoch kann es einen großen Einfluss auf die Artwork und Weise haben, wie der Benutzer eine KI-App wahrnimmt und erlebt. Durch Streaming fühlen sich KI-Systeme schneller, reaktionsfähiger und interaktiver an, selbst wenn die Zeit für die Generierung der vollständigen Antwort genau gleich bleibt. Allerdings ist Streaming kein Allheilmittel. Verschiedene Anwendungen und Kontexte können mehr oder weniger von der Einführung von Streaming profitieren. Wie bei vielen Entscheidungen in der KI-Technik geht es weniger darum, was möglich ist, sondern vielmehr darum, was für Ihren spezifischen Anwendungsfall sinnvoll ist.

. . .

Wenn du es bis hierher geschafft hast, Vielleicht finden Sie Pialgorithmen nützlich – eine von uns entwickelte Plattform, die Groups dabei hilft, organisatorisches Wissen sicher an einem Ort zu verwalten.

. . .

Hat Ihnen dieser Beitrag gefallen? Begleiten Sie mich 💌Unterstapel und 💼LinkedIn

. . .

Alle Bilder vom Autor, sofern nicht anders angegeben.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert