从 HTTP 到 SSE 再到 WebSocket:大模型流式输出与实时交互的工程演进

目录


一、SSE 是什么

SSE(Server-Sent Events)是一种基于 HTTP 的服务器推送技术,用于实现:

服务端 → 客户端的单向流式通信

其核心机制:

  • 客户端发起一次 HTTP 请求
  • 服务端保持连接不关闭
  • 持续返回数据(流式)

👉 本质可以理解为:

一个“不会立即结束”的 HTTP 响应


二、SSE 与 HTTP 的关系

2.1 核心结论

SSE 不是独立协议,而是建立在 HTTP 之上的一种通信模式。

2.2 通信流程

2.2.1 客户端请求

1
2
GET /sse HTTP/1.1
Accept: text/event-stream

2.2.2 服务端响应

1
2
3
HTTP/1.1 200 OK
Content-Type: text/event-stream
Connection: keep-alive

随后持续返回数据:

1
2
3
4
data: hello

data: world

2.3 SSE 依赖的 HTTP 能力

  • 长连接(Keep-Alive)
  • 分块传输(Chunked Transfer)
  • 流式响应(Streaming Response)

👉 一句话:

SSE = HTTP Streaming + 规范化协议 + 浏览器 API


三、为什么不直接用 HTTP

3.1 普通 HTTP 的局限

传统 HTTP 模型:

1
请求 → 一次性响应 → 结束

问题:

  • 无法边生成边返回
  • 用户体验差(必须等待完整结果)
  • 实时性差

3.2 SSE 的改进

SSE 在 HTTP 上增加:

能力 HTTP SSE
流式输出 ⚠️ 原始支持 ✅ 标准化
数据格式 ❌ 无 data:
事件机制
自动重连

👉 本质:

SSE 让 HTTP 具备“实时推送能力”

注意
SSE一般是基于HTTP/1.1实现的,HTTP/1.0默认是短连接,不支持chunked encoding,缺乏稳定的持久连接机制,因此无法支持SSE所需的流式长连接。


四、SSE 在大模型中的应用

4.1 典型链路

1
2
3
4
5
6
7
8
9
用户输入 prompt

HTTP 请求发送到服务端

LLM 开始生成 token

服务端通过 SSE 持续返回

前端实时渲染(打字效果)

4.2 一个关键认知

SSE 只负责“返回”,不负责“发送”

  • prompt:HTTP 请求发送
  • token:SSE 流返回

👉 两个阶段:

阶段 通信方式
发送 prompt HTTP
返回结果 SSE

五、SSE vs WebSocket

维度 SSE WebSocket
通信方向 单向 双向
协议 HTTP 独立协议
实现复杂度
适用场景 流式输出 实时交互

本质区别

SSE = 流式输出
WebSocket = 实时通信


六、停止生成与连接管理

6.1 核心机制

当用户点击“停止生成”:

前端

  • 使用 AbortController 终止请求
  • 或关闭 EventSource

后端

  • 感知连接断开
  • 主动取消 LLM 生成任务

6.2 关键点

断开连接 ≠ 自动停止生成

必须:

  • 前端断开连接 ✅
  • 后端取消任务 ✅

6.3 关于连接复用

  • Abort 后当前请求结束 ❌
  • 下次请求必须重新建立 HTTP 请求 ✅
  • TCP 连接可能复用(Keep-Alive)✅

七、SSE + Backpressure 机制

7.1 问题

服务端生成速度 > 前端消费速度

导致:

  • 内存堆积
  • UI 卡顿
  • 延迟逐步放大

7.2 解决方案

  • 解决方案一:前端队列
1
2
3
4
5
6
queue.push(chunk);

while (queue.length > 0) {
render(queue.shift());
await sleep(20);
}
  • 解决方案二:服务端限速
1
2
send(token);
sleep(10ms);
  • 解决方案三:显式 backpressure
1
client → pause signal → server stop streaming

(SSE 原生不支持,需要扩展协议)

八、为什么 AI 框架开始转向 WebSocket

8.1 场景变化

早期(SSE 足够)

1
2
3
用户 → prompt

LLM → token 流

现在(Agent 时代)

1
用户 ↔ Agent ↔ 工具 ↔ LLM

8.2 SSE 的瓶颈

  • 单向通信
  • 无法表达复杂交互
  • 控制能力弱(无法实时插入指令)

8.3 WebSocket 的优势

  • 全双工通信
  • 单连接承载所有交互
  • 支持复杂协议(tool call / interrupt)

8.4 对比

SSE

1
请求 → 流式响应 → 结束

WebSocket

1
2
3
4
5
连接建立

持续双向通信

复杂交互

九、总结

HTTP 是请求-响应模型,SSE 是流式响应模型,WebSocket 是实时通信模型。

9.1 技术演进路径

1
2
3
4
5
HTTP(一次性响应)

SSE(流式输出)

WebSocket(实时交互)

9.2 工程选型建议

场景 推荐方案
简单问答 / ChatGPT SSE
流式生成 SSE
Agent / Copilot WebSocket
实时协作 WebSocket

9.3 最后一层理解

SSE 解决的是“怎么把答案流出来”,
WebSocket 解决的是“怎么和 AI 持续对话”。