이 프로젝트는 OpneAI Chat Completion API(GPT3.5 API)의 구현을 모방하고 ChatGLM-6B용 스트리밍 HTTP API를 제공합니다.
이 리포지토리는 Flask 및 FastAPI의 샘플 서비스와 Node.js, npm 또는 webpack이 없는 기본 정적 웹 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 입니다. |
응답 | 끈 | 지금까지의 응답이 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를 사용하여 개발되었으며 mark.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 생성 중에 왜곡된 문자가 나타날 수 있습니다.
이는 주로 일부 토큰이 완전한 문자가 아니기 때문에 인터페이스가 최종적으로 완전한 생성 결과를 반환하기 때문에 발생합니다. 0이 아닌 유니코드 문자인 경우 인코딩 판단을 통해 처리할 수 있지만 여전히 일부 잘못된 문자가 있으므로 추가로 조사하겠습니다.
위에서 언급한 저장소 외에도 다음 프로젝트에도 감사해야 합니다.
ikechan8370/SimpleChatGLM6BAPI는 매개변수 논리를 참조합니다.