Ce projet imite la mise en œuvre de l'API OpneAI Chat Completion (API GPT3.5) et fournit une API HTTP de streaming pour ChatGLM-6B.
Ce référentiel fournit des exemples de services sous Flask et FastAPI et une interface utilisateur Web statique prête à l'emploi sans Node.js, npm ou webpack.
La version actuelle est soumise au ChatGLM-6B officiel. Mais voici un rappel :
stream_chat
, le package transformers de 4.25.1 ne peut plus être utilisé, donc transformers==4.26.1.Voici la configuration de mon environnement de développement :
protobuf>=3.18,<3.20.1
transformers==4.26.1
torch==1.12.1+cu113
torchvision==0.13.1
icetk
cpm_kernels
interface sans streaming
URL de l'interface : http://{host_name}/chat
Méthode de requête : POST (corps JSON)
Paramètres de la requête :
Nom du champ | taper | illustrer |
---|---|---|
requête | chaîne | Problèmes d'utilisateur |
histoire | tableau[chaîne] | historique des sessions |
Résultats de retour :
Nom du champ | taper | illustrer |
---|---|---|
requête | chaîne | Problèmes d'utilisateur |
réponse | chaîne | réponse complète |
histoire | tableau[chaîne] | historique des sessions |
Interface de streaming , utilisant la technologie des événements envoyés par le serveur.
URL de l'interface : http://{host_name}/stream
Méthode de requête : POST (corps JSON)
Méthode de retour :
delta
Résultats de retour :
Nom du champ | taper | illustrer |
---|---|---|
delta | chaîne | personnages générés |
requête | chaîne | Problème utilisateur, pour enregistrer le flux, renvoyé une fois terminé est true |
réponse | chaîne | La réponse jusqu'à présent, une fois terminée est true , est une réponse complète |
histoire | tableau[chaîne] | L'historique de la session, pour enregistrer le flux, renvoyé une fois terminé est true |
fini | booléen | true indique la fin, false indique qu'il y a toujours un flux de données. |
Nettoyer l'interface mémoire
http://{host_name}/clear
Pour implémenter les événements envoyés par le serveur sous Flask, vous auriez pu utiliser Flask-SSE
. Cependant, comme ce package repose sur Redis, ce n'est pas nécessaire dans ce scénario. Par conséquent, j'ai fait référence à ce document et implémenté les événements envoyés par le serveur de la manière la plus simple. chemin. .
Flask
Flask-Cors
gevent
python3 -u chatglm_service_flask.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Parmi les paramètres, -1 pour --device représente le processeur, et les autres nombres i
représentent la i
-ème carte.
FastAPI peut utiliser sse-starlette
pour créer et envoyer des événements envoyés par le serveur.
Notez que le flux d'événements généré par sse-starlette peut contenir des symboles redondants, auxquels il faut prêter attention lors du traitement par le front-end .
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Ce référentiel fournit une page de démonstration pour appeler l'API de streaming, qui peut être utilisée directement dans l'environnement intranet sans avoir besoin de Nodejs, npm ou webpack.
Sur la base des contraintes limitées de mon environnement de développement et de mes faibles réserves techniques, la démo HTML a été développée à l'aide de bootstrap.js 3.x + Vue.js 2.x et rendue à l'aide de Marked.js+highlight.js. Pour la version spécifique, veuillez vous référer à . le lien CDN en HTML .
Étant donné que l'implémentation EventSource du navigateur ne prend pas en charge la méthode POST, la définition de l'en-tête de requête et d'autres fonctionnalités nécessite à la place une implémentation tierce.
Si vous utilisez NPM dans un développement sérieux, vous pouvez utiliser @microsoft/fetch-event-source ;
Cependant, en raison de mes conditions limitées, j'étais trop paresseux pour compiler TypeScript, j'ai donc utilisé @rangermauve/fetch-event-source. Cependant, ce projet ne possède que les fonctions les plus basiques d'EventSource, des modifications magiques ont donc été apportées sur cette base.
Cependant, après avoir utilisé cette méthode, EventStream ne peut pas s'afficher correctement dans les DevTools de Chrome.
Modifiez le port correspondant à la ligne 1 dans static/js/chatglm.js
:
var baseUrl = "http://localhost:8800/"
Des caractères tronqués peuvent apparaître lors de la génération de questions et réponses en streaming
Ceci est principalement dû au fait que certains jetons ne sont pas des caractères complets, donc l'interface renvoie finalement le résultat complet de la génération. S'il s'agit d'un caractère Unicode différent de zéro, il peut être traité par jugement de codage ; cependant, il existe encore d'autres caractères tronqués, et je vais enquêter plus en détail.
Outre les référentiels cités ci-dessus, les projets suivants doivent également être remerciés :
ikechan8370/SimpleChatGLM6BAPI fait référence à la logique des paramètres