python flask 如何实现stream传输,类似chatgpt那样的?
请问如何实现边生成边传输?
网上查到的代码如下:
from time import sleepfrom 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,经过实际的开发,以下是一些解决办法,可以参考:
- 首先前端网页需要能够通过 Flask,或者是从 Nginx 中获取到 Stream 的信息,那么就需要能够持续的获取数据信息,就需要前端网页支持流式传输;
- 前端网页支持的流式有以下这些个技术:WebSocket, SSE, Http Chunked
- 其中 Chunked 是传输时分段,是一种底层的传输,并不能够实现网页打字机那种持续的效果;并且部分前端框架是全量拼接Chunked数据之后,才会返回事件,因此不可用;
- SSE技术,这个技术有一个限制,要求客户端不能够提交参数,即无法使用POST等,提交给GPT信息,如果使用SSE那么就需要实现两个接口,一个是发送信息,并且快速的返回一个特定的ID,这个ID,用于给另一个 SSE接口 GET形式传参,然后持续接收Event事件,可以实现GPT 流式;
- 推荐使用 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