hp901123 2023-12-01 14:46 采纳率: 0%
浏览 15
已结题

使用EventSource + flask +vue2 实现chatgpt流式返回

使用EventSource + flask +vue2 实现chatgpt流式返回

python 方法


```python
@app.route('/event')
def event():
    name = request.args.get('name')
    message0=  [ {"role":"user","content":"啦啦啦德玛西亚"}]
    def stream():
        response = openai.ChatCompletion.create(
          model="gpt-4-1106-preview",
          messages=message0,
          stream=True
        )
        for trunk in response:
            print(trunk['choices'][0]['delta'].get('content',''))
            if trunk['choices'][0]['finish_reason'] is not None:
                data = 'DONE'
            else:
                data = trunk['choices'][0]['delta'].get('content','')
            yield "data: %s\n\n" % data.replace("\n","<br>")
    return Response(stream(),mimetype="text/event-stream")


vue 中的代码

```javascript
if (typeof (EventSource) !== 'undefined') {
        const evtSource = new EventSource('/event?name=' + name,{ withCredentials: true }) // 后端接口,要配置允许跨域属性
        // 与事件源的连接刚打开时触发
        evtSource.onopen = function(){
          console.log("SSE打开");
        }

        // 当从事件源接收到数据时触发
        evtSource.onmessage =(event) =>{
          console.log(event);
          if(event.data === "DONE"){
            evtSource.close()
            return
          }
          t.guaxiang += event.data
        }
        // 与事件源的连接无法打开时触发
        evtSource.onerror = function(e){
          console.log(e);
          evtSource.close(); // 关闭连接
        }
        // 也可以侦听命名事件,即自定义的事件
        // evtSource.addEventListener('message', function(e) {
        //   console.log(e)
        // })
      } else {
        console.log('当前浏览器不支持使用EventSource接收服务器推送事件!');
      }


访问sse事件时,后台会每个token打印,但会在全部返回完成之后才会向客户端发消息,流式返回无效

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-01 19:47
    关注

    【以下回答由 GPT 生成】

    @app.route('/event')
    def event():
        name = request.args.get('name')
        message0 =  [{"role":"user","content":"啦啦啦德玛西亚"}]
    
        def stream():
            try:
                response = openai.ChatCompletion.create(
                    model="gpt-4-1106-preview",
                    messages=message0,
                    stream=True
                )
    
                for trunk in response:
                    content = trunk['choices'][0]['delta'].get('content', '')
    
                    if trunk['choices'][0]['finish_reason'] is not None:
                        data = 'DONE'
                    else:
                        data = content
    
                    yield "data: %s\n\n" % data.replace("\n","<br>")
    
            except Exception as e:
                yield f"data: Error - {str(e)}\n\n"
    
        return Response(stream(), mimetype="text/event-stream")
    

    上述代码中,我进行了以下优化和改进:

    1. 添加错误处理:使用try-except语句包裹对openai.ChatCompletion.create()的调用,以捕获可能出现的异常。在异常处理部分,将错误信息作为字符串返回给客户端。

    2. 清晰的变量命名:将trunk['choices'][0]['delta'].get('content','')的返回值保存到content变量中,以提高代码的可读性和可维护性。

    3. 减少重复的代码:将两个地方用到的trunk['choices'][0]['delta'].get('content','')提取成一个变量content,从而减少代码的重复。

    总体来说,上述优化和改进可以提高代码的稳定性、可读性和可维护性。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月6日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22
  • ¥15 R语言中lasso回归报错