大模型SSE流式输出技术
文章目录
- 背景:为什么需要流式输出
- SSE 流式输出
- 很多厂商还是小 chunk
背景:为什么需要流式输出
大模型的响应通常很长,比如几百甚至几千个 token,如果等模型一次性生成完才返回:
- 延迟高:用户要等很久才能看到第一句话。
- 体验差:尤其是在聊天、代码生成等场景,用户期望“边想边说”。
- 内存压力大:服务器要先缓冲全部结果再返回。
因此很多厂商(OpenAI、DeepSeek、百度、阿里等)会用 流式输出:
- 模型边生成边发送给客户端。
- 用户前端边接收边渲染。
SSE 流式输出
SSE (Server-Sent Events) 是 HTTP 长连接 + 文本事件流 协议,由服务器持续推送数据给客户端,浏览器原生支持。
- 数据格式:data: 开头,\n\n 结束
SSE的核心就是在原本TCP的字节流基础上,通过定义特殊的分隔格式(比如每条事件以空行\n\n结束),来划分消息边界,方便浏览器端按事件逐条处理。 - 单向:服务器 → 客户端
- 基于 HTTP/1.1:不需要 WebSocket,也不需要额外握手
- 自动重连:浏览器的 EventSource 会自动重连
报文示例:
HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alivedata: {"choices":[{"delta":{"content":"你"}}]}data: {"choices":[{"delta":{"content":"好"}}]}data: [DONE]
这里 data: 后面就是 JSON,每次推送一小段(chunk),最后 “[DONE]” 表示结束。
如果 chunk 粒度过小,确实会浪费资源,主要浪费在 网络 IO 开销 上。
很多厂商还是小 chunk
- 体验优先:AI 聊天给人的“即时感”很重要,宁可多 IO 也要首字快。
- 心理暗示:用户看到文字逐渐出现,会觉得模型在思考(即使真实情况是批量生成的)。
- 大部分场景数据量小:和视频、文件传输比,这种文字流的带宽占用很低,浪费的部分能接受。