使用 SSE 驯服 AI 延迟
我开发了一个 AI 自动补全功能。用户非常讨厌它。
每一次按键都会触发一次 AI 请求。用户需要等待 2 到 3 秒才能得到完整的 JSON 响应。UI 感觉像是坏了一样。我尝试了防抖(debouncing)和缓存,但都没用。核心问题依然存在:在整个答案到达之前,用户什么也看不到。
我通过使用 Server-Sent Events (SSE) 来逐块流式传输响应,解决了这个问题。
旧的工作流程如下:
- 用户输入
- 300ms 防抖
- HTTP POST 请求
- AI 处理(1-2 秒)
- 服务器返回完整响应
- 客户端渲染
用户会盯着空白屏幕看好几秒。即使有加载动画(loading spinner),感觉还是很慢。
我考虑过轮询(polling)或 WebSockets。轮询的开销太大。而对于单向流来说,WebSockets 又太重了。
我选择 SSE 的原因是:
- 它是从服务器到客户端的单向工作模式
- 它使用简单的文本和 JSON 数据块
- 如果连接断开,它会自动重连
- 你的服务器不需要安装额外的库
结果改变了一切:
- 首个视觉响应时间:从 2.1 秒降至 0.3 秒
- 用户参与度:提升 40%
- 用户投诉:零
流式传输关乎感知。渐进式 UI 比静态 UI 感觉更快。用户更喜欢看到单词一个接一个地出现,而不是等待一大块文本。
如果你的 AI 响应非常短,那就坚持使用标准请求。如果你需要双向通信,请使用 WebSockets。但对于大多数 AI 流式传输需求,SSE 是最佳选择。
你在应用中是如何处理 AI 延迟的?你是采用流式传输,还是等待完整响应?