当前位置:   article > 正文

django+nginx+uwsgi 与chatgpt进行对话并流式传输_django实现chatgpt的流式输出

django实现chatgpt的流式输出

目录

前提

服务端

后端

前端


前提

网络上大多数流式传输使用的是fastapi,关于Django3的流式传输很少,这里就介绍一下如何使用。而Django3主要是使用StreamingHttpResponse, Javascript主要使用fetch。切记部署后端的服务器要能够连得上外网,如果服务器再国内可能需要反向代理或者其他手段。

服务端

文件位置: conf.d/default.conf
具体配置根据需要, 就是其中的uwsgi_buffering off极为重要

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. charset utf-8;
  5. location /aigc/ {
  6. include uwsgi_params; # 与uwsgi进行连接
  7. uwsgi_pass IP:PORT; # uwsgi映射的ip:接口
  8. uwsgi_read_timeout 60;
  9. uwsgi_buffering off; # 重中之重, 不进行缓存缓冲
  10. }
  11. }

后端

所需第三方库

Django==3.2.13

示例代码

app名称/views.py

  1. from django.http import StreamingHttpResponse # 引入流式传输第三方库
  2. import openai # 引入chatgpt
  3. openai.api_key = 'sk-xxx' # 给openai添加key
  4. # 接口函数, 这里并没有存储上下文, 需要的话自行编写
  5. def chat(request):
  6. prompt = request.GET.get('prompt') # 接收提示词
  7. messages = [{
  8. "role": 'user',
  9. "content": prompt
  10. }] # 生成上下文对话链
  11. response = openai.ChatCompletion.create(
  12. model="gpt-3.5-turbo", # 模型
  13. messages=messages, # 上下文
  14. temperature=1, # 温度
  15. stream=True, # 流式
  16. )
  17. def stream():
  18. for event in response:
  19. yield event['choices'][0]['delta'].get('content', '') # 获取参数
  20. # 生成流式进行传输
  21. r = StreamingHttpResponse(streaming_content=stream(), content_type='text/event-stream')
  22. r['Cache-Control'] = 'no-cache'
  23. return r

urls.py

  1. from django.urls import path, include
  2. from app名称.views import chat
  3. urlpatterns = [
  4. path('chat', chat, name='chat'), # 流式
  5. ]

前端

chat.js

  1. <script>
  2. fetch('/aigc/chat', {
  3. headers: {
  4. 'Accept': 'text/event-stream'
  5. },
  6. method: 'POST',
  7. body: formData,
  8. })
  9. .then(response => {
  10. const stream = response.body;
  11. // 创建一个可读流的阅读器
  12. const reader = stream.getReader();
  13. const processStream = () => {
  14. const decoder = new TextDecoder();
  15. reader.read().then(({done, value}) => {
  16. if (done) {
  17. console.log('Stream reading complete');
  18. return;
  19. }
  20. const text1 = decoder.decode(value);
  21. console.log(text1); # 文字进行打印
  22. //每个text1就是一端文字, 直接输出到对话框即可
  23. // 继续读取下一块数据
  24. processStream();
  25. })
  26. };
  27. processStream();
  28. });
  29. </script>

原网站: ai爱好者论坛 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/451137
推荐阅读
相关标签
  

闽ICP备14008679号