Этот проект имитирует реализацию API завершения чата OpneAI (API GPT3.5) и предоставляет потоковый HTTP API для ChatGLM-6B.
Этот репозиторий предоставляет примеры сервисов Flask и FastAPI, а также готовый статический веб-интерфейс без Node.js, npm или webpack.
Актуальная версия соответствует официальному ChatGLM-6B. Но вот напоминание:
stream_chat
пакет Transformers версии 4.25.1 больше нельзя использовать, поэтому 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 |
ответ | нить | Ответ на данный момент, когда он будет 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
Среди параметров -1 для --device представляет процессор, а другие числа 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
Этот репозиторий предоставляет демонстрационную страницу для вызова API потоковой передачи, которую можно использовать в среде интрасети без необходимости использования Nodejs, npm или веб-пакета.
Учитывая ограниченность моей среды разработки и скудные технические возможности, HTML-демонстрация была разработана с использованием bootstrap.js 3.x + Vue.js 2.x и визуализирована с использованием Marked.js+highlight.js. Информацию о конкретной версии см. ссылка CDN в HTML.
Поскольку собственная реализация EventSource браузера не поддерживает метод POST, возможность устанавливать заголовки запросов необходимо заменить сторонней реализацией.
Если вы используете NPM в серьезной разработке, вы можете использовать @microsoft/fetch-event-source;
Однако из-за моих ограниченных условий мне было лень компилировать TypeScript, поэтому я использовал @rangermauve/fetch-event-source. Однако в этом проекте есть только самые базовые функции EventSource, поэтому на этой основе были сделаны волшебные модификации.
Однако после использования этого метода EventStream не может корректно отображаться в DevTools Chrome.
Измените порт, соответствующий строке 1, в static/js/chatglm.js
:
var baseUrl = "http://localhost:8800/"
Во время потоковой передачи вопросов и ответов могут появляться искаженные символы.
В основном это вызвано тем, что некоторые токены не являются полными символами, поэтому интерфейс в конечном итоге возвращает полный результат генерации. Если это ненулевой символ Юникода, его можно обработать посредством оценки кодировки, однако есть еще некоторые искаженные символы, и я продолжу расследование;
Помимо упомянутых выше репозиториев, следует также поблагодарить следующие проекты:
ikechan8370/SimpleChatGLM6BAPI относится к логике параметров.