Este projeto imita a implementação da API OpneAI Chat Completion (API GPT3.5) e fornece API HTTP de streaming para ChatGLM-6B.
Este repositório fornece serviços de amostra em Flask e FastAPI e uma UI da Web estática pronta para uso, sem Node.js, npm ou webpack.
A versão atual está sujeita ao ChatGLM-6B oficial. Mas aqui vai um lembrete:
stream_chat
, o pacote transformers 4.25.1 não poderá mais ser utilizado, portanto transformers==4.26.1.A seguir está a configuração do meu ambiente de desenvolvimento:
protobuf>=3.18,<3.20.1
transformers==4.26.1
torch==1.12.1+cu113
torchvision==0.13.1
icetk
cpm_kernels
interface sem streaming
URL da interface: http://{host_name}/chat
Método de solicitação: POST (corpo JSON)
Parâmetros de solicitação:
Nome do campo | tipo | ilustrar |
---|---|---|
consulta | corda | Problemas do usuário |
história | matriz[string] | histórico da sessão |
Resultados de retorno:
Nome do campo | tipo | ilustrar |
---|---|---|
consulta | corda | Problemas do usuário |
resposta | corda | resposta completa |
história | matriz[string] | histórico da sessão |
Interface de streaming , usando tecnologia de eventos enviados pelo servidor.
URL da interface: http://{host_name}/stream
Método de solicitação: POST (corpo JSON)
Método de retorno:
delta
Resultados de retorno:
Nome do campo | tipo | ilustrar |
---|---|---|
delta | corda | caracteres gerados |
consulta | corda | Problema do usuário, para salvar fluxo, retornado quando finalizado é true |
resposta | corda | A resposta até agora, quando terminada é true , é uma resposta completa |
história | matriz[string] | O histórico da sessão, para salvar o fluxo, retornado quando concluído é true |
finalizado | booleano | true indica o fim, false indica que ainda há fluxo de dados. |
Limpe a interface de memória
http://{host_name}/clear
Para implementar eventos enviados pelo servidor no Flask, você poderia ter usado Flask-SSE
. No entanto, como este pacote depende do Redis, não é necessário neste cenário. Portanto, referi-me a este documento e implementei eventos enviados pelo servidor da maneira mais simples. caminho. .
Flask
Flask-Cors
gevent
python3 -u chatglm_service_flask.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Entre os parâmetros, -1 para --device representa cpu, e outros números i
representam o i
ésimo cartão.
FastAPI pode usar sse-starlette
para criar e enviar eventos enviados pelo servidor.
Observe que o fluxo de eventos gerado por sse-starlette pode conter símbolos redundantes, aos quais é necessário prestar atenção ao processar pelo front end .
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
Este repositório fornece uma página de demonstração para chamar a API de streaming, que pode ser usada imediatamente no ambiente de intranet sem a necessidade de Nodejs, npm ou webpack.
Com base nas restrições limitadas do meu ambiente de desenvolvimento e nas reservas técnicas deficientes, a demonstração HTML foi desenvolvida usando bootstrap.js 3.x + Vue.js 2.x e renderizada usandomarked.js+highlight.js. Para a versão específica, consulte. o link CDN em HTML.
Como a implementação EventSource do próprio navegador não suporta o método POST, a configuração do cabeçalho da solicitação e outros recursos requer uma implementação de terceiros.
Se você usa o NPM em desenvolvimento sério, pode usar @microsoft/fetch-event-source;
No entanto, devido às minhas condições limitadas, tive preguiça de compilar o TypeScript, então usei @rangermauve/fetch-event-source. No entanto, este projeto possui apenas as funções mais básicas do EventSource, portanto, modificações mágicas foram feitas com base nisso.
No entanto, após usar este método, EventStream não pode ser exibido corretamente no DevTools do Chrome.
Modifique a porta correspondente à linha 1 em static/js/chatglm.js
:
var baseUrl = "http://localhost:8800/"
Caracteres distorcidos podem aparecer durante a geração de perguntas e respostas de streaming
Isso é causado principalmente pelo fato de alguns tokens não serem caracteres completos, então a interface finalmente retorna o resultado completo da geração. Se for um caractere Unicode diferente de zero, ele poderá ser processado por meio de julgamento de codificação; no entanto, ainda existem alguns outros caracteres ilegíveis e investigarei mais detalhadamente;
Além dos repositórios citados acima, também merecem agradecimentos os seguintes projetos:
ikechan8370/SimpleChatGLM6BAPI refere-se à lógica do parâmetro