⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

12.3.1 AI 应用的核心模式——流式响应原理:为什么需要 Streaming UI

一句话破题

流式响应让 AI 的回答像"打字机"一样逐字出现,将用户的等待焦虑转化为阅读体验,这是现代 AI 应用的核心交互模式。

认知重构:为什么等待 5 秒感觉像 50 秒

当你向 ChatGPT 提问时,模型实际上是逐个 Token 生成答案的。传统的 HTTP 请求会等待所有 Token 生成完毕后才返回,这意味着:

  • 用户需要盯着空白屏幕等待数秒
  • 如果回答很长,等待时间可能超过 10 秒
  • 用户无法判断请求是否卡住了

流式响应的做法是:一边生成,一边返回

本质还原:传统响应 vs 流式响应

技术实现:Server-Sent Events

流式响应通常基于 Server-Sent Events (SSE)WebSocket 实现。Vercel AI SDK 默认使用 SSE:

javascript
// 服务端发送的格式
data: {"content": "你"}
data: {"content": "好"}
data: {"content": "!"}
data: [DONE]

客户端通过 EventSourcefetch + ReadableStream 接收:

javascript
const response = await fetch('/api/chat', {
  method: 'POST',
  body: JSON.stringify({ message: 'Hello' }),
});

const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  
  const text = decoder.decode(value);
  console.log(text); // 逐步输出
}

用户体验的质变

指标传统响应流式响应
首字节时间5-10 秒< 1 秒
感知等待时间很长几乎无感
中断能力无法中断可随时停止
错误反馈超时后才知道实时感知

流式响应的挑战

虽然流式响应体验更好,但也带来了一些技术挑战:

  1. 状态管理:需要追踪"正在生成"、"已完成"、"发生错误"等状态
  2. 错误处理:流式传输中途出错如何恢复?
  3. 渲染性能:频繁更新 DOM 可能导致卡顿
  4. 取消机制:用户中途取消如何优雅处理?

这些问题,Vercel AI SDK 都提供了解决方案。

AI 协作指南

  • 核心意图:让 AI 帮你理解或实现流式响应的底层机制。
  • 需求定义公式"请解释 Server-Sent Events 如何工作,并给出一个 Next.js 中实现流式 AI 响应的基础示例。"
  • 关键术语SSEReadableStreamTextDecoder流式传输 (streaming)

避坑指南

  • 不要忘记处理连接中断:网络不稳定时,流可能意外关闭。
  • 注意内存管理:长时间的流式响应可能累积大量数据。
  • 测试弱网环境:流式响应在弱网下可能表现异常。