Dieser Artikel basiert auf der Rede „Kitex Thrift Streaming Implemented in AI Scenarios“ von Du Shaofeng, ByteDance-Flow R&D Engineer, auf der Veranstaltung „Cloud Native✖️Microservice Architecture and Technical Practice in the AI Era“ des CloudWeGo Technology Salon Beijing in Peking am 30. März 2024. Zusammengestellt aus „Practice“.
Überblick
Ziel der ByteDance Prompt-Plattform ist es, Benutzern umfassende Prompt-Entwicklungs-, Optimierungs-, Evaluierungs- und Anwendungsfunktionen für den gesamten Lebenszyklus bereitzustellen. Unter diesen Funktionen ist das Streamen großer Modellergebnisse für Schreibmaschineneffekte eine entscheidende Funktion. Obwohl eine Implementierung auf Basis von SSE (Server-Sent Events) möglich ist, erfordert sie das zusätzliche Schreiben von HTTP-Diensten, was die Komplexität der Entwicklung erhöht. Obwohl die Umfragemethode einfach ist, ist die Benutzererfahrung nicht ideal und wirkt zu umständlich. Obwohl die Leistung von gRPC hervorragend ist, kann es zu Kompatibilitätsproblemen kommen, die die Bereitstellung und Wartung erschweren. Aus diesem Grund haben wir die Streaming-Schnittstelle mithilfe der Thrift-Streaming-Funktion von Kitex erfolgreich implementiert und den Benutzern so ein reibungsloses und effizientes Ausgabeerlebnis mit Schreibmaschineneffekten für große Modellergebnisse geboten.
1. Betriebswirtschaftlicher Hintergrund
Mit der kontinuierlichen Weiterentwicklung der KI-Technologie unterliegt das Leben der Menschen tiefgreifenden Veränderungen. Nehmen Sie als Beispiel das KI-Produkt Doubao von Byte. Die darin enthaltenen Agenten haben den Menschen viele neuartige Erfahrungen beschert. Unter ihnen sind interessante intelligente Roboter wie AI Boyfriend und AI Girlfriend besonders beliebt. Sie können nicht nur auf humorvolle Weise mit Benutzern interagieren, sondern zeigen auch eine sanfte und rücksichtsvolle Seite.
All dies ist untrennbar mit einem Konzept verbunden, das eng mit großen Modellen verbunden ist – den Eingabeaufforderungen. Einfach ausgedrückt ist Prompt die Texteingabe in das vorab trainierte Modell, um das Modell bei der Generierung einer Textausgabe zu unterstützen, die bestimmte Anforderungen erfüllt. Im übertragenen Sinne ist Prompt so, als würde man einen exklusiven Traum für das große Modell schaffen. Dadurch können wir das große Modell dazu anleiten, in bestimmten Szenarien angemessenere und gezieltere Antworten zu geben.
Am Beispiel der KI-Freundin werden wir dem großen Model durch sorgfältig gestaltete Aufforderungen mitteilen, dass seine Rolle eine sanfte und rücksichtsvolle virtuelle Freundin ist. Gleichzeitig werden wir auch einige Einschränkungen festlegen, z. B. die Anforderung, sanft und rücksichtsvoll mit den Benutzern zu kommunizieren und über Fähigkeiten wie Zuhören, Verstehen, Ermutigen und Vorschläge zu verfügen. Darüber hinaus werden wir auch den Arbeitsablauf im Detail beschreiben, z. B. die Anleitung der Benutzer, bei der Begrüßung ihren Namen zu sagen, die Zuweisung eines passenden Spitznamens an die Benutzer und die anschließende ausführliche Kommunikation mit den Benutzern sowie die Bereitstellung nützlicher Vorschläge.
Durch solche Eingabeaufforderungen erstellen wir einen vollständigen „Traum“ für das große Modell, damit es verstehen kann, dass es sich um eine KI-Freundin handelt und wie es mit Benutzern interagieren soll. Wenn diese Eingabeaufforderung aktiviert ist und wir eine Frage-und-Antwort-Sitzung mit dem großen Modell haben, werden auf der Grundlage unserer Eingabeaufforderungen entsprechende Antworten gegeben. Wenn wir zum Beispiel „Hallo“ sagen, führt es uns dazu, unseren Namen auszusprechen, gibt uns einen niedlichen Spitznamen und gibt uns dann Ermutigung und Erleichterung.
Wie aus diesem Beispiel hervorgeht, spielt Prompt eine entscheidende Rolle bei der Ausgabe großer Modelle in bestimmten Szenarien. Darüber hinaus wirkt es sich auch auf den Tokenverbrauch und die Reaktionszeit großer Modelle während des Ausgabeprozesses aus. Daher ist ein ausgezeichneter Prompt für die Verbesserung der Modellausgabe von entscheidender Bedeutung.
2. Nachfrageszenarien
Das ByteDance Flow-Team arbeitet an der Entwicklung einer umfassenden und ausgereiften Plattform/Methode, die Prompt-Entwicklern dabei helfen soll, ihre Prompts zu entwerfen, zu iterieren, zu bewerten und zu optimieren und so die Ausdruckskraft von LLM (Large Language Model) zu verbessern. Während der Entwicklungsphase planen wir die Bereitstellung einer strukturierten und geführten Generierung, um Benutzer beim Schreiben effizienter und genauer Eingabeaufforderungen und beim entsprechenden Debuggen zu unterstützen.
Mit fortschreitender Entwicklung werden wir weitere automatische Optimierungstechnologien wie COT (Chain of Thought) und Few Shots sowie die APO-Methode (Auto Prompt Optimization) einführen, um Prompt dabei zu helfen, die Genauigkeit seiner Antworten zu verbessern. Gleichzeitig bieten wir auch die Möglichkeit, Eingabeaufforderungen zu erweitern, um die Effizienz großer Modelle beim Token-Verbrauch zu optimieren.
Um die Wirksamkeit von Prompt umfassend zu bewerten, bewerten wir Prompt außerdem anhand verschiedener Datensätze und führen eine eingehende Analyse seiner Leistungsengpässe durch, um gezielte Verbesserungen vorzunehmen. Schließlich werden wir Ein-Klick-Bereitstellungsfunktionen bereitstellen, die es Entwicklern ermöglichen, Prompt-Funktionen und die großen Modelle dahinter einfach in ihre Anwendungen zu integrieren.
Natürlich ist die Realisierung dieser Funktionen untrennbar mit der Unterstützung der
Echtzeit-Streaming-
Technologie verbunden. Genau wie die KI-Funktionen, die Sie kennengelernt haben, wie GPT, Doubao und Baidu AI Search, verwenden sie alle Antworten im Schreibmaschinenstil, nachdem Benutzer Fragen gestellt haben, sodass Benutzer das Gefühl haben, dass Daten ständig auf den Bildschirm fließen, was die Sprachverständlichkeit verbessert des Chats und der Reaktionsgeschwindigkeit. Diese
Echtzeit-Streaming-
Technologie ist die grundlegendste Fähigkeit, die unsere Prompt-Plattform bieten muss. Durch die Aufteilung der Daten in mehrere Datenströme zur Netzwerkübertragung können wir die Netzwerklatenz effektiv reduzieren, die Leistung verbessern und sicherstellen, dass Benutzer ein besseres Erlebnis bei der Interaktion mit großen Sprachmodellen haben.
3. Lösung
Um die Streaming-Ausgabefunktion zu implementieren, haben wir eingehende Untersuchungen durchgeführt und verschiedene Optionen in Betracht gezogen:
-
Umfrage
-
HTTP -SSE
-
Kitex gRPC-Streaming (protobuf)
-
Kitex Thrift-Streaming
Erstens wurde das Umfragesystem aufgrund seiner Unflexibilität ausgeschlossen und entsprach nicht unseren Bedürfnissen. Zweitens: Obwohl HTTP-basiertes SSE eine praktikable Lösung ist, müssen wir angesichts der strengen Anforderungen an RPC (Remote Procedure Call) auch eine geeignetere Lösung finden. Darüber hinaus stellten wir fest, dass die Streaming-Unterstützung des Protobuf-Protokolls unsere Anforderungen nicht vollständig erfüllte, insbesondere im Hinblick auf die Thrift-Schnittstelle. Schließlich ist uns die Unterstützung von Kitex für Thrift Streaming aufgefallen. Zu diesem Zeitpunkt befand sich Kitex Thrift Streaming in der Entwicklungsphase und wir entschieden uns entschieden, seine ersten Benutzer zu werden und darauf basierend das Grundgerüst der gesamten Prompt-Plattform aufzubauen.
Im Hinblick auf das Architekturdesign haben wir zunächst LangChain einem Benchmarking unterzogen und LLM-Ingenieurdienstleistungen etabliert. Auf dieser Grundlage bauen wir den Prompt-Dienst weiter aus, um die grundlegendsten Prompt-Verwaltungs- und Anwendungsfunktionen bereitzustellen. Für die Interaktion mit dem Frontend stellen wir über API Gateway eine HTTP-Schnittstelle bereit. Im Hinblick auf die Kommunikation zwischen Microservices nutzen wir das Kitex-Framework, um Streaming-Schnittstellen und Nicht-Streaming-Schnittstellen zu unterstützen und so eine effiziente Übertragung und Verarbeitung von Daten sicherzustellen.
Mit dieser Lösung haben wir die Streaming-Ausgabefunktion erfolgreich implementiert und den Benutzern ein reibungsloseres und effizienteres KI-Interaktionserlebnis geboten. Gleichzeitig haben wir eine solide Grundlage für zukünftige Erweiterungen und Optimierungen gelegt.
4. Übung und Fallstricke
-
Streaming-Anrufprozess
Der Streaming-Anrufprozess beginnt, wenn der Benutzer eine Frage stellt. Diese Anfrage wird zunächst an das Gateway gesendet, das dann eine Verbindung mit der nachgeschalteten Prompt-RPC-Schnittstelle aufbaut. Die Prompt-RPC-Schnittstelle stellt außerdem die Kommunikation mit dem LLM-Engineering-Service her, der für die kontinuierliche Interaktion mit dem Modell und den Erhalt der Ausgabeergebnisse des Modells verantwortlich ist. Diese Ergebnisse werden Schicht für Schicht im Streaming-Verfahren nach oben übertragen, bis sie die Gateway-Schicht erreichen, und schließlich im Streaming-Verfahren dem Benutzer angezeigt.
Während dieses Prozesses haben wir im Prompt-Dienst eine Streaming-Schnittstelle geschrieben, um Streaming-Aufrufe abzuwickeln. Die Schnittstelle stellt zunächst eine Verbindung mit dem Downstream her, indem sie die Downstream-Schnittstelle aufruft, und empfängt dann kontinuierlich das Ergebnis des Streaming-Pakets, das vom Downstream an uns ausgespuckt wird, über eine for-Schleife. Sobald das Datenpaket empfangen wurde, übertragen wir es transparent über die Sendemethode an die obere Schicht, bis ein Fehler auftritt oder der Stream geschlossen wird und der Zyklus endet.
Während des Implementierungsprozesses haben wir die Einfachheit von Kitex Thrift Streaming erlebt. Allerdings sind wir auch auf einige Probleme gestoßen. Insbesondere im Hinblick auf die Fehlerbehandlung stellten wir fest, dass der Code beim Ausführen nicht die erwarteten Ergebnisse erzielen konnte und sogar zu einer zu hohen CPU-Auslastung führte.
Nach einer weiteren Analyse der Fehlerprotokolle stellten wir fest, dass es in einzelnen Anfragen Fehlermeldungen gab, insbesondere bezüglich des QPM-Limits (Query Per Second) für das erste Paket. Gemäß unserer Codelogik sollten wir die for-Schleife schnell verlassen, wenn solche Fehler auftreten, aber das ist nicht die tatsächliche Situation. Daher begannen wir, die von Kitex bereitgestellten Fehlerbehebungsmethoden zu nutzen, um das Problem zu lokalisieren. Kitex bietet Vergrabungspunkte für RPCStart und RPCEnd sowie detailliertere Vergrabungspunkte für Paketempfangs- und -sendeereignisse. Durch die Analyse dieser vergrabenen Punkte stellten wir fest, dass Kitex die gesamte Anfrage als normale Antwort erkannte und eine große Anzahl von Datenpaketen über die aufrufende Verbindung gesendet wurde. Eine weitere Überprüfung der Verwaltungsinformationen eines einzelnen Pakets zeigt auch, dass es von Kitex als normale Antwort erkannt wird.
Nach vorläufiger Beurteilung gehen wir davon aus, dass bei der Streaming-Verarbeitung von Kitex möglicherweise geschäftliche Fehler ignoriert wurden, was dazu führte, dass Fehler nicht korrekt identifiziert wurden. Nach der Kommunikation mit dem Kitex-Team nahmen sie entsprechende Anpassungen vor, wie z. B. die Hinzufügung der Erkennung von Geschäftsstatusfehlern (Geschäftsstatusfehlern) zum Code.
Basierend auf dieser Fehlerbehandlungserfahrung haben wir weitere ungewöhnliche Szenarien analysiert, die bei Streaming-Aufrufen auftreten können, wie z. B. Berechtigungsfehler in der Verbindungsaufbauphase, TPM/QPM-Überschreitungen in der ersten Paketphase, Stream-Timeout und Inhalte in der Zwischenpaketphase Überprüfungsfehler usw. Wir haben uns in diesen Szenarien auf die Fehlerbehandlungsleistung von Kitex Thrift Streaming konzentriert, z. B. darauf, ob beim Verbindungsaufbau schnell Fehlerinformationen zurückgegeben werden können und ob das Warten auf Streams schnell beendet werden kann, wenn das erste Paket und Zwischenpakete Fehler zurückgeben. Nach gemeinsamen Anpassungen und Tests mit dem Kitex-Team entsprach die Fehlerbehandlung in diesen Szenarien schließlich den Erwartungen.
-
In Bezug auf die Service-Governance
Bei der Service Governance legen wir besonderen Wert auf die beiden Schlüsselaspekte Timeout und Strombegrenzung.
Erstens ist das Timeout-Management von entscheidender Bedeutung. Da unsere Module mit großen Modellen interagieren, kann diese Interaktion Reaktionszeiten in der Größenordnung von Sekunden oder sogar Minuten erfordern. Daher legen wir Zeitlimits auf Minutenebene für die Stream-Verarbeitung sowohl auf der HTTP-Ebene als auch auf der RPC-Ebene fest. Dadurch kann eine Dienstblockierung vermieden werden, die dadurch verursacht wird, dass die for-Schleife nicht verlassen werden kann, und die Stabilität und Verfügbarkeit des Dienstes sichergestellt werden.
In Bezug auf die Strombegrenzung unterstützt Kitex zwar die Strombegrenzung beim Erstellen eines Streams, für das LLM-Szenario liegt unser Fokus jedoch nicht nur auf der QPM-Strombegrenzung beim Verbindungsaufbau, sondern auch auf der Strombegrenzung des großen Modell-Token-Verbrauchs. Der Inferenzprozess großer Modelle führt zu einem hohen Token-Verbrauch, der zu Ressourcenerschöpfung und Dienstabstürzen führen kann, wenn er nicht eingeschränkt wird. Daher verwenden wir Kitex, um das aktuelle Limit von Jianlian zu implementieren, und verwenden gleichzeitig unsere eigenen verteilten Komponenten, um den Token-Verbrauch unter verschiedenen Modellen zu berechnen und das aktuelle Limit auf Token-Ebene entsprechend zu implementieren. Dadurch kann die Ressourcennutzung effektiv kontrolliert und eine Überlastung der Dienste vermieden werden.
Allerdings haben wir auch Erwartungen an Kitex. Wir hoffen, dass Kitex in Zukunft maßgeschneiderte Strombegrenzungsfunktionen mit Paketgranularität bereitstellen kann. Auf diese Weise können wir aktuelle Begrenzungsregeln flexibler definieren und die Ressourcennutzung genauer steuern, wodurch wir die Stabilität und Leistung des Dienstes weiter verbessern.
5. Zukunftserwartungen
Mit der kontinuierlichen Weiterentwicklung und Anwendung der KI-Technologie haben wir höhere Erwartungen an die Fähigkeiten von Microservice-Frameworks in KI-Szenarien. Insbesondere im Hinblick auf Komfort, Fähigkeiten in KI-Szenarien und die Anpassung traditioneller Framework-Funktionen hoffen wir auf weitere Innovationen und Fortschritte.
-
Bequemlichkeit
Erstens
erwarten wir im Hinblick auf die Benutzerfreundlichkeit, dass das Microservice-Framework den Zugriff auf mehr Testtools unterstützt
, insbesondere zum Testen von Streaming-Schnittstellen. Derzeit gibt es noch gewisse Einschränkungen beim Testen der Kitex Thrift-Streaming-Schnittstelle, die hauptsächlich auf dem Schreiben von Nicht-Streaming-Schnittstellen zum Packen von Aufrufen beruht. Wir hoffen, die Streaming-Schnittstelle in Zukunft komfortabler zu gestalten, um verschiedene Testtools zu unterstützen und die Entwicklungseffizienz durch allgemeine Aufrufe und andere Methoden zu verbessern.
-
Fähigkeit in KI-Szenarien
Mit der rasanten Entwicklung der KI-Technologie beginnen immer mehr Produkte, KI-Funktionen zu integrieren, um Benutzererfahrung und Funktionen zu optimieren. Im KI-Szenario haben wir höhere Erwartungen an Microservice-Frameworks wie Kitex und hoffen, dass es die Integration und Orchestrierung von KI-Komponenten besser unterstützen und sich an traditionelle Framework-Funktionen anpassen kann.
-
Sofort einsatzbereite Orchestrierungsfunktionen für KI-Komponenten
Wenn in aktuellen Entwicklungspraktiken KI-Funktionen integriert werden müssen, müssen sich Entwickler in der Regel selbst mit komplexer Logik befassen, z. B. mit dem Aufrufen von Eingabeaufforderungen, dem Parsen großer Modellausgaben und dem Konvertieren von Ergebnissen in Maschinensprache. Dies erhöht nicht nur die Schwierigkeit der Entwicklung, sondern verringert auch die Entwicklungseffizienz. Daher erwarten wir, dass das Kitex-Framework sofort einsatzbereite Orchestrierungsfunktionen für KI-Komponenten bietet.
Insbesondere erwarten wir, dass das Framework eine Reihe gekapselter KI-Komponenten vorinstalliert, z. B. Eingabeaufforderungskomponenten, große Modellkomponenten, Ergebnisanalysekomponenten und RPC-Aufrufkomponenten. Diese Komponenten sollten hochgradig konfigurierbar und erweiterbar sein, damit sie an unterschiedliche Geschäftsanforderungen angepasst werden können. Entwickler müssen nur die Geschäftslogik an diese Komponenten übergeben, ohne sich um die Implementierungsdetails innerhalb der Komponenten zu kümmern, sodass sie sich mehr auf die Implementierung der Geschäftslogik konzentrieren können.
-
Flexible Orchestrierungsfunktionen für KI-Komponenten
Neben der Bereitstellung voreingestellter KI-Komponenten erwarten wir auch, dass das Kitex-Framework flexible Orchestrierungsfunktionen für KI-Komponenten unterstützt. Das bedeutet, dass das Framework eine Ausdruckssprache oder ein Visualisierungstool bereitstellen sollte, mit dem Entwickler diese KI-Komponenten einfach entsprechend den Geschäftsanforderungen orchestrieren können. Auf diese Weise können Entwickler die Ausführungsreihenfolge, Kommunikationsmethoden, Parallelverarbeitungsstrategien usw. zwischen Komponenten definieren, ohne auf die Details der Interaktionen zwischen Komponenten einzugehen. Dies wird die Entwicklungseffizienz und Wartbarkeit von KI-Anwendungen erheblich verbessern.
-
Herkömmliche Framework-Funktionen werden an LLM-Links angepasst
In KI-Szenarien sind traditionelle Framework-Funktionen wie Service Governance, transparente Übertragung von Metadaten und Beobachtbarkeit immer noch von großer Bedeutung
. Daher freuen wir uns darauf, dass sich das Kitex-Framework in diesen Aspekten anpassen und optimieren lässt.
Erstens muss das Framework im Hinblick auf die Service-Governance Timeout- und Strombegrenzungsstrategien für Antwortzeiten in der Größenordnung von Sekunden oder sogar Minuten bereitstellen, da KI-Anwendungen möglicherweise langfristige Inferenzprozesse beinhalten. Gleichzeitig müssen Sie auch überlegen, wie mit Ausnahmen im Zusammenhang mit KI-Komponenten umgegangen wird.
Zweitens erwarten wir im Hinblick auf die transparente Übertragung von Metadaten, dass das Framework die Übertragung von Metadaten zwischen KI-Komponenten für eine verfeinerte Überwachung und Fehlerbehebung unterstützt. Dies wird uns helfen, den Betriebsstatus von KI-Anwendungen besser zu verstehen und Probleme schnell zu lokalisieren.
Schließlich erwarten wir im Hinblick auf die Beobachtbarkeit, dass das Kitex-Framework umfassende Protokollierungs-, Nachverfolgungs- und Indikatorenerfassungsfunktionen für eine umfassende Überwachung und Analyse von KI-Links bereitstellt. Dies wird uns helfen, potenzielle Leistungsengpässe und Optimierungspunkte rechtzeitig zu erkennen und so die Leistung und Stabilität von KI-Anwendungen zu verbessern.
Zusammenfassend konzentrieren sich unsere zukünftigen Erwartungen an das Kitex-Framework in KI-Szenarien hauptsächlich auf
sofort einsatzbereite KI-Komponenten-Orchestrierungsfunktionen
,
flexible KI-Komponenten-Orchestrierungsfunktionen
und die Anpassung
traditioneller Framework-Funktionen an
LLM
-Links
. Wir glauben, dass diese Erwartungen mit der kontinuierlichen Weiterentwicklung der Technologie und der intensiven Zusammenarbeit im Team nach und nach Wirklichkeit werden und die Entwicklung von KI-Anwendungen komfortabler und effizienter gestalten werden.
Tatsächlich hat unser Team intensiv mit dem Kitex-Team zusammengearbeitet, um zu diskutieren, wie KI-Szenarien im Microservices-Framework besser unterstützt werden können. Wir glauben, dass wir in naher Zukunft eine MVP-Version der Lösung auf den Markt bringen können, um Geschäftsentwicklern ein Framework bereitzustellen, das einfach und nahtlos in KI-Funktionen integriert werden kann. Es wird eine aufregende Zeit und wir freuen uns darauf.
{{o.name}}
{{m.name}}