如果你用过 ChatGPT、DeepSeek 等大语言模型,一定注意到一个细节:AI 的回复并不是一次性出现,而是像打字机一样一段一段地流式输出。

这种细节不仅提升了用户体验,也让 AI 的响应显得更自然、更即时。

那么,在浏览器端,这种流式输出到底是如何实现的?
调研主流的 AI 对话产品后,可以发现目前主要有两种技术方案:

  • 服务器发送事件 Server-Sent Events(SSE)

  • WebSocket 长连接

下面分别介绍它们的特点、应用场景和前端使用方式。

服务器发送事件

服务器发送事件,简称 SSE,是一种单向的服务器推送技术:浏览器发起一个 HTTP 请求后,服务器可以源源不断地推送消息。主流应用 ChatGPT、DeepSeek、Gemini 等都用的是这种方式。

前端如何使用 SSE?

核心 API 是 EventSource:

const es = new EventSource('/api/chat');

es.onmessage = (event) => {
  const text = event.data;
  console.log('token:', text);
};

es.onerror = () => {
  es.close();
};

只要服务器持续输出如下格式的文本,浏览器就会不断收到数据:

data: hello
data: world
data: ...

WebSocket 长连接

WebSocket 是一种支持双向通信的全双工协议。连接建立后,客户端和服务器双方都可以以“帧”的形式发送数据。我目前看下来只有微软的 Copilot 是用的这种方式。

前端如何使用 WebSocket?

const ws = new WebSocket("wss://api.example.com/chat");

ws.onmessage = (event) => {
  console.log('token:', event.data);
};

ws.onopen = () => {
  ws.send(JSON.stringify({ prompt: "hello" }));
};

对比与总结

技术方案 特点 适用场景 主流大模型使用情况
SSE 单向推送、基于 HTTP、简单易用 文本流式输出 ChatGPT / DeepSeek / Gemini / Claude 等
WebSocket 全双工通信、支持二进制 协作编辑、多人实时、复杂交互 Copilot

如果你正在开发一个 AI 对话产品,优先建议使用 SSE,尽管 WebSocket 具有双向通信的优势,但在纯粹的文本输出流场景下,SSE 的单向性已足够。因此,多数 LLM 平台不使用它。