OpenAI 的流式输出(Streaming)主要有两种实现方式:Server-Sent Events (SSE) 和 HTTP Chunked Transfer Encoding。让我用图表来说明这两种方式。
```mermaid
sequenceDiagram
participant Client
participant Server
Note over Client,Server: 方式一:Server-Sent Events (SSE)
Client->>Server: HTTP GET 请求<br/>Headers: Accept: text/event-stream
activate Server
Note right of Server: 开始生成响应
Server->>Client: data: {"content": "Hello"}
Server->>Client: data: {"content": " World"}
Server->>Client: data: {"content": "!"}
Server->>Client: data: [DONE]
deactivate Server
Note over Client,Server: 方式二:HTTP Chunked Transfer
Client->>Server: HTTP POST 请求<br/>Headers: Transfer-Encoding: chunked
activate Server
Note right of Server: 分块发送数据
Server->>Client: 5\r\nHello\r\n
Server->>Client: 6\r\n World\r\n
Server->>Client: 1\r\n!\r\n
Server->>Client: 0\r\n\r\n
deactivate Server
```
两种实现方式的详细解释:
1. Server-Sent Events (SSE)
- 基于 HTTP 协议
- 客户端发送请求时带上 `Accept: text/event-stream` 头
- 服务器会保持连接打开
- 使用特定的文本格式发送数据(data: 开头的行)
- 适合单向数据推送
- 自动重连机制
- OpenAI API 默认使用这种方式
2. HTTP Chunked Transfer Encoding
- 同样基于 HTTP 协议
- 服务器通过分块发送数据
- 每个块前面有该块的大小(十六进制)
- 以大小为0的块表示传输结束
- 没有自动重连机制
与 WebSocket 相比的主要区别:
- 这两种方式都是基于 HTTP 的单向流式传输
- 不需要像 WebSocket 那样建立特殊的连接
- 更轻量级,适合单向的数据流推送
- 服务器实现更简单,不需要维护长连接状态
实际应用中的选择考虑:
1. 如果只需要服务器到客户端的数据流,SSE 是很好的选择
2. 如果需要双向实时通信,则应该选择 WebSocket
3. 如果是简单的数据流传输,Chunked Transfer 也是可行的方案