このプロジェクトは、OpneAI Chat Completion API (GPT3.5 API) の実装を模倣し、ChatGLM-6B 用のストリーミング HTTP API を提供します。
このリポジトリは、Flask および FastAPI でのサンプル サービスと、Node.js、npm、または webpack を使用しないすぐに使える静的 Web UI を提供します。
実際のバージョンは公式 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ボディ)
リクエストパラメータ:
フィールド名 | タイプ | 説明する |
---|---|---|
クエリ | 弦 | ユーザーの問題 |
歴史 | 配列[文字列] | セッション履歴 |
返される結果:
フィールド名 | タイプ | 説明する |
---|---|---|
クエリ | 弦 | ユーザーの問題 |
応答 | 弦 | 完全な返信 |
歴史 | 配列[文字列] | セッション履歴 |
サーバー送信イベント技術を使用したストリーミング インターフェイス。
インターフェース URL: http://{host_name}/stream
リクエストメソッド:POST(JSONボディ)
返却方法:
delta
返される結果:
フィールド名 | タイプ | 説明する |
---|---|---|
デルタ | 弦 | 生成された文字 |
クエリ | 弦 | ユーザーの問題、フローを保存するため、終了時に返されるのはtrue |
応答 | 弦 | これまでの応答は、 completed がtrue の場合、完全な応答です。 |
歴史 | 配列[文字列] | セッション履歴、フローを保存するため、終了時に返されますtrue |
終了した | ブール値 | true 終了を示し、 false データ フローがまだ存在することを示します。 |
メモリインターフェイスをクリーンアップする
http://{host_name}/clear
Flask でサーバー送信イベントを実装するには、 Flask-SSE
使用することもできますが、このパッケージは Redis に依存しているため、このシナリオでは必要ありません。そのため、このドキュメントを参照して、最も単純なサーバー送信イベントを実装しました。方法。 。
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
使用して、サーバー送信イベントを作成および送信できます。
sse-starlette によって出力されるイベント ストリームには冗長なシンボルが含まれる可能性があるため、フロントエンド処理中に注意する必要があることに注意してください。
fastApi
sse-starlette
unicorn
python3 -u chatglm_service_fastapi.py --host 127.0.0.1 --port 8800 --quantize 8 --device 0
このリポジトリは、Nodejs、npm、または webpack を必要とせずに、イントラネット環境ですぐに使用できるストリーミング API を呼び出すためのデモ ページを提供します。
限られた開発環境の制約と不十分な技術的予備力に基づいて、HTML デモは 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/"
ストリーミング Q&A 生成中に文字化けが発生する場合がある
これは主に、一部のトークンが完全な文字ではないため、インターフェイスが最終的に完全な生成結果を返すことが原因で発生します。ゼロ以外の Unicode 文字であればエンコード判定で処理できますが、他にも文字化けがいくつかあるのでさらに調査してみます。
上記のリポジトリに加えて、次のプロジェクトにも感謝する必要があります。
ikechan8370/SimpleChatGLM6BAPI はパラメーター ロジックを指します