【大模型应用开发-FastAPI框架】(十一) Fastapi使用SSE实现流式输出

一、SSE介绍

服务端推送
在服务器推送技术中,服务器在消息可用后立即主动向客户端发送消息。其中,有两种类型的服务器推送:SSE和 WebSocket。

SSE(Server-Send Events)
SSE 是一种在基于浏览器的 Web 应用程序中仅从服务器向客户端发送文本消息的技术。SSE基于 HTTP 协议中的持久连接, 具有由 W3C 标准化的网络协议和 EventSource 客户端接口,作为 HTML5 标准套件的一部分。

二、使用SSE实现流式输出

1、安装依赖库

pip install asyncio
pip install sse-starlette

2、后端代码

import json
 
from fastapi import FastAPI, Query, Path
import uvicorn
from starlette.requests import Request
import asyncio
from sse_starlette import EventSourceResponse
 
app = FastAPI()
 
 
@app.get("/stream")
async def flush_stream(request: Request):
    async def event_generator(request: Request):
        res_str = "这是一个流式输出他会将每个字挨个挨个的输出哈哈!!!"
        for idx, word in enumerate(res_str):
            if await request.is_disconnected():
                print("连接已中断")
                break
            data = json.dumps({"id": idx, "message": word}, ensur
### 实现大型模型API的流式响应 为了实现在后端提供大型模型API的流式输出功能,通常会采用异步处理机制以及特定框架的支持来确保数据能够实时传输给客户端。对于Distil-Whisper这样的高效语音识别模型而言,在构建其API接口时同样适用这种方法[^1]。 #### 使用Python Flask与SSE (Server-Sent Events) 一种简单的方式是利用Flask Web服务器配合SSE协议实现服务端事件推送: ```python from flask import Flask, Response, stream_with_context import time app = Flask(__name__) @app.route('/stream') def streaming(): def generate(): for i in range(10): # 模拟分批次返回结果的过程 yield f"data: Processing batch {i}\n\n" time.sleep(1) # 假设每批处理耗时一秒 return Response(stream_with_context(generate()), mimetype='text/event-stream') if __name__ == '__main__': app.run(debug=True) ``` 此代码片段展示了如何创建一个简单的HTTP GET请求路径`/stream`,它将以逐条消息的形式向调用者发送更新直到完成整个过程。实际应用中,应替换模拟逻辑为真实的推理流程,并调整延迟时间以匹配实际情况下的性能表现。 #### 结合ASGI Server 和 FastAPI 提供更强大的支持 当面对更高并发量需求或希望获得更好的开发体验时,则可以选择FastAPI搭配像Uvicorn这样的ASGI兼容Web服务器来进行部署。这种方式不仅简化了异步编程模式的应用,还允许开发者更容易地集成其他现代特性如自动化的交互文档界面等。 下面是一个基于FastAPI的例子,其中包含了对Distil-Whisper模型预测结果进行流式传输的功能示例: ```python from fastapi import FastAPI from starlette.responses import StreamingResponse import asyncio app = FastAPI() async def predict_stream(text_input): """假设这是执行预测并逐步产出的部分""" await asyncio.sleep(2) # 暂停两秒模仿加载模型的时间 chunks = ["This is the first part", " followed by second.", " Finally third."] for chunk in chunks: yield chunk.encode('utf-8') # 将字符串转换成字节串以便于网络传输 await asyncio.sleep(.5) # 添加短暂延时使效果更加明显 @app.get("/predict/{input_text}") async def read_item(input_text: str): return StreamingResponse(predict_stream(input_text), media_type="application/octet-stream") # 启动命令 uvicorn your_script_name:app --reload ``` 在这个例子中,定义了一个名为`predict_stream()` 的协程函数负责生成连续的数据块;而路由处理器则通过 `StreamingResponse` 类将这些动态产生的内容作为HTTP响应的一部分持续不断地传递出去。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forest_long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值