python flask 如何实现stream传输,类似chatgpt那样的?

python flask 如何实现stream传输,类似chatgpt那样的?

请问如何实现边生成边传输?
网上查到的代码如下:

from time import sleep

from flask import Flask, Response, stream_with_context

app = Flask(__name__)

@app.route('/stream', methods=['GET'])

def stream():

def generate():

for i in range(1, 21):

print(i)

yield f'This is item {i}\n' # 生成流数据

# 在生成每个数据项后可以添加一些适当的延时或其他逻辑

sleep(0.5)

return Response(generate(),

mimetype='text/plain')

if __name__ == '__main__':

app.run(debug=True)

这个效果不对, 上面的代码会等待generate()结束才开始浏览器才显示文本.
我希望是能一边执行一边返回


回答:

好好看文档哦 https://flask.palletsprojects.com/en/2.1.x/patterns/streaming/

python">from flask import stream_with_context, request

@app.route('/stream')

def streamed_response():

def generate():

yield 'Hello '

yield request.args['name']

yield '!'

return app.response_class(stream_with_context(generate()))


回答:

关于使用Flask 对接 GPT StreamAPI,经过实际的开发,以下是一些解决办法,可以参考:

  1. 首先前端网页需要能够通过 Flask,或者是从 Nginx 中获取到 Stream 的信息,那么就需要能够持续的获取数据信息,就需要前端网页支持流式传输;
  2. 前端网页支持的流式有以下这些个技术:WebSocket, SSE, Http Chunked
  3. 其中 Chunked 是传输时分段,是一种底层的传输,并不能够实现网页打字机那种持续的效果;并且部分前端框架是全量拼接Chunked数据之后,才会返回事件,因此不可用;
  4. SSE技术,这个技术有一个限制,要求客户端不能够提交参数,即无法使用POST等,提交给GPT信息,如果使用SSE那么就需要实现两个接口,一个是发送信息,并且快速的返回一个特定的ID,这个ID,用于给另一个 SSE接口 GET形式传参,然后持续接收Event事件,可以实现GPT 流式;
  5. 推荐使用 WebSocket API,可以在前端网页开启Socket,并且调用后台API,每一次发送GPT信息给API,然后就持续读取Stream返回即可;

关于 API 网关代理 GPT Stream API 数据:

Stream 数据在 Flask 请求之后,需要持续使用 yeild 来返回给客户端,你只要搜索一下
Flask yeild 就可以了。

不过 Flask 开发 WebSocket 接口不太理想,尤其是 Route 不好设置,或者是我没有设置好。


推荐使用 Quart (Flask 异步版本)
这个基本上就是 Flask 的异步版本,大部分API 都是同名的,部分插件也是支持的。

关键是原生支持 HTTP API + WebSocket


关于流式传输和 Nginx / CDN

部分CDN或者 Nginx 会把Chunked等数据自动拼接,建议和Stream相关的接口,

都给透传,不过如果使用了 WebSocket,那么就没有这方面的问题。


演示案例,之前开发了一个GPT站点 https://chat.acgbot.net

这个站点的整体架构是:

GPT - Gateway(Python Quart) - Nginx(Angular H5) - CloudFlare(CND)

Gateway部分单开 WebSocket,Angular 作为前端,CDN 加速

以上是 python flask 如何实现stream传输,类似chatgpt那样的? 的全部内容, 来源链接: utcz.com/p/938900.html

回到顶部