Skip to content
🔗 分享本题
查看我的学习进度 →

LLM 流式输出按单向推送和双向实时交互选择 SSE 或 WebSocket 图

🧠 记忆锚点:以服务器持续推送为主选 SSE;需要频繁双向实时交互选 WebSocket,同时都要处理取消、重连和背压。

💡 答案要点

流式输出的价值:

  • 降低首字延迟(TTFT),提升用户体验
  • 用户可以边看边思考,不用等完整答案
  • 节省服务器内存(不用缓存完整响应)

实现方案对比:

方案优点缺点适用场景
SSE简单、原生支持、自动重连单向通信(服务器→客户端)大多数 AI 问答场景
WebSocket双向通信、低延迟实现复杂、需要心跳需要客户端交互的场景

SSE 实现示例(Go):

go
func streamHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    flusher, _ := w.(http.Flusher)

    // 调用 LLM API(流式)
    stream, _ := client.CreateChatCompletionStream(...)

    for {
        response, _ := stream.Recv()
        if errors.Is(err, io.EOF) {
            break
        }

        // 发送 SSE 事件
        fmt.Fprintf(w, "data: %s\n\n", response.Choices[0].Delta.Content)
        flusher.Flush()
    }
}

面试话术:

"如果主要是服务器向客户端单向推送 token,SSE 通常更简单;需要持续双向音频、客户端实时控制或低延迟交互时再考虑 WebSocket 或 WebRTC。选型依据是通信方向、断线恢复、代理兼容性和背压,而不是固定比例。"

📚 参考:MDN:Server-Sent Events(SSE 标准文档)