โปรเจ็กต์นี้เลียนแบบการใช้งาน OpneAI Chat Completion API (GPT3.5 API) และให้บริการสตรีม HTTP API สำหรับ ChatGLM-6B
พื้นที่เก็บข้อมูลนี้ให้บริการตัวอย่างภายใต้ Flask และ FastAPI และ Web UI แบบคงที่ที่พร้อมใช้งานทันทีโดยไม่ต้องใช้ 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 แสดงถึง 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
พื้นที่เก็บข้อมูลนี้มีหน้าสาธิตสำหรับการเรียก API การสตรีม ซึ่งสามารถใช้งานได้ทันทีในสภาพแวดล้อมอินทราเน็ตโดยไม่ต้องใช้ Nodejs, npm หรือ webpack
จากข้อจำกัดด้านสภาพแวดล้อมการพัฒนาที่จำกัดของฉันและการสำรองทางเทคนิคที่ไม่ดี การสาธิต 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/"
อักขระที่อ่านไม่ออกอาจปรากฏขึ้นในระหว่างการสตรีมการสร้างคำถามและคำตอบ
สาเหตุหลักมาจากข้อเท็จจริงที่ว่าโทเค็นบางตัวมีอักขระไม่ครบถ้วน ดังนั้นอินเทอร์เฟซจึงส่งคืนผลลัพธ์การสร้างที่สมบูรณ์ในที่สุด หากเป็นอักขระ Unicode ที่ไม่ใช่ศูนย์ ก็สามารถประมวลผลได้โดยการเข้ารหัส อย่างไรก็ตาม ยังมีอักขระอื่นที่อ่านไม่ออก และฉันจะตรวจสอบเพิ่มเติม
นอกเหนือจากพื้นที่เก็บข้อมูลที่อ้างถึงข้างต้นแล้ว ยังต้องขอบคุณโครงการต่อไปนี้ด้วย:
ikechan8370/SimpleChatGLM6BAPI อ้างถึงตรรกะของพารามิเตอร์