在 FastAPI 中集成 RAG 接口并支持流式输出,推荐使用 `StreamingResponse` 配合异步生成器,或引入 `sse-starlette` 库实现 SSE 协议。适用场景为大模型 Token 逐字生成、知识库问答降低首字延迟。风险边界在于异步函数阻塞事件循环会导致流式中断,需确保检索与生成全程异步。
先说结论:FastAPI 原生支持异步流式响应,通过 `StreamingResponse` 或 SSE 协议可将 RAG 检索与生成结果分段推送给前端。
- 适合:大模型 Token 流式输出、降低用户感知延迟。
- 先看:依赖 `async def` 生成器函数 yield 数据块。
- 建议:复杂场景优先选用 SSE 协议,前端兼容性与重连机制更好。
命令速用版
pip install fastapi uvicorn sse-starlette为什么会这样
大语言模型采用自回归方式生成内容,逐个输出 Token。传统 HTTP 响应需等待全部内容生成完毕才返回,用户等待时间长。流式输出将生成过程拆分为多个数据块,服务端每生成一部分就立即推送,前端收到即可渲染,显著降低感知延迟。FastAPI 基于 Starlette,原生支持异步流式响应,适合此类边算边出的场景。
分步处理
第一步:安装依赖。除 FastAPI 和 Uvicorn 外,若使用 SSE 协议需安装 `sse-starlette`。
第二步:定义异步生成器。编写 `async def` 函数,内部循环调用 RAG 检索与模型生成,使用 `yield` 逐块返回数据。确保 RAG 检索过程也是异步的,避免阻塞事件循环。
async def generate_response(query):
# 模拟 RAG 检索与生成
for chunk in rag_chain.stream(query):
yield chunk第三步:配置路由响应。使用 `StreamingResponse` 包裹生成器,指定 `media_type="text/event-stream"` 或 `text/plain`。若使用 `sse-starlette`,返回 `EventSourceResponse`。
from fastapi.responses import StreamingResponse
@app.post("/rag/stream")
async def rag_stream(request: QueryRequest):
return StreamingResponse(generate_response(request.query), media_type="text/event-stream")第四步:处理跨域与断开。添加 `CORSMiddleware` 允许前端跨域访问。在生成器中检查 `request.is_disconnected()`,若前端断开则停止生成,节省资源。
怎么验证是否生效
查看浏览器开发者工具 Network 面板,请求状态应为 200,响应头 `Content-Type` 包含 `text/event-stream` 或 `text/plain`。观察前端界面,文字应呈打字机效果逐字出现,而非等待数秒后一次性显示。若使用 SSE,前端应能通过 `EventSource` 对象监听消息。
常见坑
- 同步函数阻塞:在异步生成器中调用同步检索函数会卡住整个服务,需确保 RAG 链路全异步。
- 缺少 Yield:直接返回字符串而非生成器,会导致前端一次性接收全部内容,失去流式效果。
- 跨域错误:未配置 CORS 中间件,前端浏览器会拦截流式响应。
- 连接断开未处理:用户关闭页面后服务端继续生成,浪费算力,需在生成器内监听断开状态。
常见问题
SSE 和 WebSocket 选哪个?
优先选 SSE。SSE 基于 HTTP,前端使用 `EventSource` 原生支持自动重连,实现简单,适合服务端单向推送流式文本。WebSocket 支持双向通信,但需手动处理重连,适合复杂交互场景。
流式输出影响检索速度吗?
不影响检索速度,只影响响应呈现方式。RAG 检索仍在服务端完成,流式仅改变结果返回形式。若检索本身慢,首字出现时间仍会延迟,需优化检索链路。
如何处理长连接超时?
配置 Nginx 或网关的超时时间长于模型生成预期时间。FastAPI 层面可通过心跳机制保持连接活跃,避免中间网络设备切断连接。
参考来源
- 从 0 到 1 搭建可商用的 AI 聊天机器人:300 行代码搞定 RAG + 流式输出
- 第 08 章 FastAPI 与 SSE 流式 RAG 后端
- 仅限首批 200 位开发者获取:FastAPI 2.0 流式 AI 响应模板仓库 (含 LangChain v0.3 适配、RAG 流式分块、token 级进度回调)
- RAG 实战之`--Stream` 流式输出
- FastAPI 与 LLM 流式输出实现方案
- Kotaemon 支持流式输出,提升用户交互体验
- RAG day05 流式部署