Dieses Projekt imitiert die Implementierung der OpneAI Chat Completion API (GPT3.5 API) und stellt eine Streaming-HTTP-API für ChatGLM-6B bereit.
Dieses Repository bietet Beispieldienste unter Flask und FastAPI sowie eine sofort einsatzbereite statische Web-Benutzeroberfläche ohne Node.js, npm oder Webpack.
Die aktuelle Version unterliegt dem offiziellen ChatGLM-6B. Aber hier ist eine Erinnerung:
stream_chat
kann das Transformers-Paket von 4.25.1 nicht mehr verwendet werden, also Transformers==4.26.1.Das Folgende ist die Konfiguration meiner Entwicklungsumgebung:
protobuf>=3.18,<3.20.1
transformers==4.26.1
torch==1.12.1+cu113
torchvision==0.13.1
icetk
cpm_kernels
Nicht-Streaming-Schnittstelle
Schnittstellen-URL: http://{host_name}/chat
Anforderungsmethode: POST(JSON-Body)
Anforderungsparameter:
Feldname | Typ | veranschaulichen |
---|---|---|
Abfrage | Zeichenfolge | Benutzerprobleme |
Geschichte | Array[Zeichenfolge] | Sitzungsverlauf |
Rückgabeergebnisse:
Feldname | Typ | veranschaulichen |
---|---|---|
Abfrage | Zeichenfolge | Benutzerprobleme |
Antwort | Zeichenfolge | vollständige Antwort |
Geschichte | Array[Zeichenfolge] | Sitzungsverlauf |
Streaming-Schnittstelle , die vom Server gesendete Ereignistechnologie nutzt.
Schnittstellen-URL: http://{host_name}/stream
Anforderungsmethode: POST(JSON-Body)
Rückgabemethode:
delta
Rückgabeergebnisse:
Feldname | Typ | veranschaulichen |
---|---|---|
Delta | Zeichenfolge | generierte Zeichen |
Abfrage | Zeichenfolge | Benutzerproblem, um den Ablauf zu speichern, wird zurückgegeben, wenn der Vorgang true ist |
Antwort | Zeichenfolge | Die bisherige Antwort ist, wenn sie true ist, eine vollständige Antwort |
Geschichte | Array[Zeichenfolge] | Der Sitzungsverlauf wird zum Speichern des Ablaufs zurückgegeben und ist true , wenn er beendet ist |
fertig | Boolescher Wert | true gibt das Ende an, false gibt an, dass noch ein Datenfluss vorhanden ist. |
Bereinigen Sie die Speicherschnittstelle
http://{host_name}/clear
Um vom Server gesendete Ereignisse unter Flask zu implementieren, hätten Sie Flask-SSE
verwenden können. Da dieses Paket jedoch auf Redis basiert, ist dies in diesem Szenario nicht erforderlich. Daher habe ich auf dieses Dokument verwiesen und im einfachsten Fall vom Server gesendete Ereignisse implementiert Weg. .
Flask
Flask-Cors
gevent
python3 -u chatglm_service_flask.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Unter den Parametern repräsentiert -1 für --device die CPU und andere Zahlen i
repräsentieren die i
te Karte.
FastAPI kann sse-starlette
verwenden, um vom Server gesendete Ereignisse zu erstellen und zu senden.
Beachten Sie, dass der von sse-starlette ausgegebene Ereignisstrom möglicherweise redundante Symbole enthält, worauf bei der Front-End-Verarbeitung geachtet werden muss .
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Dieses Repository stellt eine Demoseite zum Aufrufen der Streaming-API bereit, die sofort in der Intranetumgebung verwendet werden kann, ohne dass Nodejs, npm oder Webpack erforderlich sind.
Aufgrund meiner begrenzten Entwicklungsumgebungseinschränkungen und geringen technischen Reserven wurde die HTML-Demo mit bootstrap.js 3.x + Vue.js 2.x entwickelt und mit markiert.js+highlight.js gerendert. Die spezifische Version finden Sie unter der CDN-Link in HTML.
Da die browsereigene EventSource-Implementierung die POST-Methode nicht unterstützt, muss die Möglichkeit zum Festlegen von Anforderungsheadern durch eine Drittanbieterimplementierung ersetzt werden.
Wenn Sie NPM in einer ernsthaften Entwicklung verwenden, können Sie @microsoft/fetch-event-source;
Aufgrund meiner begrenzten Möglichkeiten war ich jedoch zu faul, TypeScript zu kompilieren, also habe ich @rangermauve/fetch-event-source verwendet. Allerdings verfügt dieses Projekt nur über die grundlegendsten Funktionen von EventSource, sodass auf dieser Basis magische Modifikationen vorgenommen wurden.
Nach Verwendung dieser Methode kann EventStream jedoch in den DevTools von Chrome nicht korrekt angezeigt werden.
Ändern Sie den Port entsprechend Zeile 1 in static/js/chatglm.js
:
var baseUrl = "http://localhost:8800/"
Während der Streaming-Fragen- und Antwortgenerierung können verstümmelte Zeichen erscheinen
Dies liegt hauptsächlich daran, dass einige Token keine vollständigen Zeichen sind, sodass die Schnittstelle schließlich das vollständige Generierungsergebnis zurückgibt. Wenn es sich um ein Unicode-Zeichen ungleich Null handelt, kann es durch eine Kodierungsbeurteilung verarbeitet werden. Es gibt jedoch noch einige andere verstümmelte Zeichen, die ich weiter untersuchen werde.
Neben den oben genannten Repositorien gebührt auch folgenden Projekten Dank:
ikechan8370/SimpleChatGLM6BAPI bezieht sich auf die Parameterlogik