一句话定义:流式输出(Streaming)是指服务端不等全部结果算完,就把已经生成的内容分片、持续推给客户端;SSE(Server-Sent Events,服务器发送事件)是其中最常见的服务端推送协议。
把它想成上菜:普通请求像点了一桌菜,后厨全做完才一起端上来,等待久;流式输出像做好一道就端一道,你马上能吃到第一口。大模型生成文字时,每算出一个词元(token)或一小段,就立刻发出去,前端收到一段就追加一段,于是出现打字机效果。注意:打字机效果是前端渲染,流式输出是后端数据到达方式;如果后端一次性返回,前端也能用定时器“假装”逐字显示,但那只是动画。
SSE 怎么工作:客户端发起一个 HTTP 请求,服务端返回 Content-Type: text/event-stream,然后保持连接不关闭,按 data: ... 的格式持续发送小消息。浏览器有原生 EventSource 接口接收。它本质是单向:服务器→客户端。很多大模型 API 用 POST 发提示词,所以不一定用原生 EventSource,而是用 fetch 读取响应流(ReadableStream),再手动解析 SSE 格式;也有服务用 chunked 传输编码或 NDJSON(每行一个 JSON)达到类似效果。
和相邻概念的区别:
| 概念 | 方向 | 典型用途 | 特点 |
|---|---|---|---|
| 普通 HTTP | 请求→响应 | 一次性拿完整结果 | 简单,但等待久 |
| 轮询(Polling) | 客户端反复问 | 看任务好没 | 延迟高、请求多 |
| SSE | 服务器→客户端 | 聊天、通知、日志 | 基于 HTTP,文本友好,可自动重连 |
| WebSocket | 双向 | 协同编辑、游戏 | 全双工,但更重 |
| 流式输出 | 体验/数据形态 | 大模型对话 | 不是具体协议,SSE 只是载体之一 |
对实际工作的意义:对 AI 从业者,首字延迟(TTFT,Time To First Token)往往比总生成时间更影响体感。要做流式,得注意代理和网关别缓冲响应,否则字会攒着一次性出现;前端要能增量渲染 Markdown、处理半截 JSON 和代码块;用户点“停止”时,用 AbortController 断开连接,服务端是否停止计算取决于实现。对普通人,流式输出让等待变得可感知、可打断,长回答不用干等;但它不会让模型算得更快,只是把结果更早露出来。
