如果你用过 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 平台不使用它。