本工程仿造OpneAI Chat Completion API(即GPT3.5 API)的實現,為ChatGLM-6B提供串流HTTP API。
本倉庫提供了Flask和FastAPI下的範例服務和開箱即用的靜態Web UI,無需Node.js、npm或webpack。
實際版本以ChatGLM-6B官方為準。但這裡需要提醒一下:
stream_chat
方法後,已不能使用4.25.1的transformers包,故transformers==4.26.1。以下為本人開發環境的配置:
protobuf>=3.18,<3.20.1
transformers==4.26.1
torch==1.12.1+cu113
torchvision==0.13.1
icetk
cpm_kernels
非流式介面
介面URL: http://{host_name}/chat
請求方式:POST(JSON body)
請求參數:
欄位名 | 類型 | 說明 |
---|---|---|
query | string | 用戶問題 |
history | array[string] | 會話歷史 |
回傳結果:
欄位名 | 類型 | 說明 |
---|---|---|
query | string | 用戶問題 |
response | string | 完整的回复 |
history | array[string] | 會話歷史 |
流式接口,使用server-sent events技術。
介面URL: http://{host_name}/stream
請求方式:POST(JSON body)
返回方式:
delta
回傳結果:
欄位名 | 類型 | 說明 |
---|---|---|
delta | string | 產生的字符 |
query | string | 使用者問題,為省流,finished為true 時返回 |
response | string | 目前為止的回复,finished為true 時,為完整的回复 |
history | array[string] | 會話歷史,為省流,finished為true 時返回 |
finished | boolean | true 表示結束, false 表示仍有資料流。 |
清理顯存介面
http://{host_name}/clear
Flask下實作server-sent events,本來可以使用Flask-SSE
,但是由於該套件依賴Redis,而這一場景下並無必要,因此參考了這篇文檔,僅用最簡單的方式實作了server-sent events 。
Flask
Flask-Cors
gevent
python3 -u chatglm_service_flask.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
參數中,--device 為-1 表示cpu,其他數字i
表示第i
張卡。
FastAPI可以使用sse-starlette
建立和傳送server-sent events。
注意, sse-starlette 輸出的事件流可能帶有多餘的符號,前端處理時需要注意。
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
本倉庫提供了此串流API的呼叫示範頁面,內網環境即開即用,無需Nodejs、npm或webpack。
基於本人有限的開發環境制約和貧乏的技術儲備,HTML Demo使用bootstrap.js 3.x + Vue.js 2.x開發,使用marked.js+highlight.js渲染,具體版本可參考HTML中的CDN鏈接。
由於瀏覽器本身的EventSource實作不支援POST方法,設定請求頭等能力,需要使用第三方實作替代。
若在正開發中使用NPM,可用@microsoft/fetch-event-source實現;
但本人條件所限,懶得編譯TypeScript,於是採用了@rangermauve/fetch-event-source。不過工程只有EventSource最基本的功能,所以又在此基礎上做了魔改。
不過,使用該方式後,在Chrome的DevTools中,無法正確展現EventStream。
在static/js/chatglm.js
中修改第1行對應的連接埠:
var baseUrl = "http://localhost:8800/"
串流問答產生過程中可能會出現亂碼
這主要是部分token並不是完整的字元造成的,因此介面最後回傳了完整的生成結果。如果是非0平面的Unicode字符,可以透過編碼判斷處理;但還存在個別其它亂碼現象,本人會進一步排查。
除上述引用的倉庫外,還需要感謝以下項目:
ikechan8370/SimpleChatGLM6BAPI 參考了其中的參數邏輯