Este proyecto imita la implementación de OpneAI Chat Completion API (API GPT3.5) y proporciona API HTTP de transmisión para ChatGLM-6B.
Este repositorio proporciona servicios de muestra en Flask y FastAPI y una interfaz de usuario web estática lista para usar sin Node.js, npm o webpack.
La versión real está sujeta al ChatGLM-6B oficial. Pero aquí hay un recordatorio:
stream_chat
, el paquete de transformadores 4.25.1 ya no se puede utilizar, por lo que transformadores == 4.26.1.La siguiente es la configuración de mi entorno de desarrollo:
protobuf>=3.18,<3.20.1
transformers==4.26.1
torch==1.12.1+cu113
torchvision==0.13.1
icetk
cpm_kernels
interfaz sin transmisión
URL de la interfaz: http://{host_name}/chat
Método de solicitud: POST (cuerpo JSON)
Parámetros de solicitud:
Nombre del campo | tipo | ilustrar |
---|---|---|
consulta | cadena | Problemas de usuario |
historia | matriz [cadena] | historial de sesiones |
Resultados de devolución:
Nombre del campo | tipo | ilustrar |
---|---|---|
consulta | cadena | Problemas de usuario |
respuesta | cadena | respuesta completa |
historia | matriz [cadena] | historial de sesiones |
Interfaz de streaming , utilizando tecnología de eventos enviados por el servidor.
URL de la interfaz: http://{host_name}/stream
Método de solicitud: POST (cuerpo JSON)
Método de devolución:
delta
Resultados de devolución:
Nombre del campo | tipo | ilustrar |
---|---|---|
delta | cadena | personajes generados |
consulta | cadena | Problema del usuario, para guardar el flujo, devuelto cuando finaliza es true |
respuesta | cadena | La respuesta hasta ahora, cuando termine es true , es una respuesta completa. |
historia | matriz [cadena] | El historial de sesiones, para guardar el flujo, devuelto cuando finaliza es true |
finalizado | booleano | true indica el final, false indica que todavía hay flujo de datos. |
Limpiar la interfaz de memoria.
http://{host_name}/clear
Para implementar eventos enviados por el servidor en Flask, podría haber usado Flask-SSE
. Sin embargo, dado que este paquete se basa en Redis, no es necesario en este escenario. Por lo tanto, consulté este documento e implementé los eventos enviados por el servidor de la manera más simple. forma. .
Flask
Flask-Cors
gevent
python3 -u chatglm_service_flask.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Entre los parámetros, -1 para --device representa la CPU y otros números i
representan la i
ésima tarjeta.
FastAPI puede usar sse-starlette
para crear y enviar eventos enviados por el servidor.
Tenga en cuenta que la salida del flujo de eventos de sse-starlette puede contener símbolos redundantes, a los que se debe prestar atención durante el procesamiento frontal .
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Este repositorio proporciona una página de demostración para llamar a la API de transmisión, que se puede usar de forma inmediata en el entorno de intranet sin necesidad de Nodejs, npm o webpack.
Debido a las limitaciones de mi entorno de desarrollo y mis escasas reservas técnicas, la demostración HTML se desarrolló usando bootstrap.js 3.x + Vue.js 2.x y se representó usando marcado.js+highlight.js. Para ver la versión específica, consulte. el enlace CDN en HTML.
Dado que la implementación EventSource del navegador no admite el método POST, la capacidad de configurar encabezados de solicitud debe ser reemplazada por una implementación de terceros.
Si usa NPM en un desarrollo serio, puede usar @microsoft/fetch-event-source;
Sin embargo, debido a mis condiciones limitadas, era demasiado vago para compilar TypeScript, así que usé @rangermauve/fetch-event-source. Sin embargo, este proyecto solo tiene las funciones más básicas de EventSource, por lo que se realizaron modificaciones mágicas sobre esta base.
Sin embargo, después de usar este método, EventStream no se puede mostrar correctamente en DevTools de Chrome.
Modifique el puerto correspondiente a la línea 1 en static/js/chatglm.js
:
var baseUrl = "http://localhost:8800/"
Es posible que aparezcan caracteres confusos durante la generación de preguntas y respuestas en streaming
Esto se debe principalmente al hecho de que algunos tokens no son caracteres completos, por lo que la interfaz finalmente devuelve el resultado de generación completo. Si es un carácter Unicode distinto de cero, se puede procesar mediante juicio de codificación; sin embargo, todavía hay algunos otros caracteres confusos, y lo investigaré más a fondo;
Además de los repositorios citados anteriormente, también hay que agradecer a los siguientes proyectos:
ikechan8370/SimpleChatGLM6BAPI se refiere a la lógica del parámetro