一、 流式输出:用户体验的“秒回”魔法

当你在对话界面输入一个问题,然后看到答案像真人打字一样,一个词一个词地“流淌”出来,而不是干巴巴地转圈等待最后一次性返回所有内容。这种即时反馈的体验,其核心就是 流式输出(Streaming)

传统的API调用模式,客户端发送请求,服务端处理完毕后,一次性将整个响应体返回。对于大模型这种生成任务,处理可能需要数秒甚至更久。用户在这段时间里面对的是一个空白的加载动画,焦虑感随之上升。而流式输出则不同,服务端在开始生成第一个词时,就立即将其发送给客户端,随后持续地发送后续生成的片段。这带来了两个直接好处:

二、 SSE:服务器单向“嘀嗒嘀嗒”的推送协议

要实现流式输出,我们需要一个允许服务器持续向客户端推送数据的协议。SSE(Server-Sent Events,服务器推送事件)就是 Web 领域为此而生的标准方案。它基于 HTTP 协议,但实现了一种轻量级的、由服务器到客户端的单向数据流

与需要建立全双工连接的 WebSocket 相比,SSE 更加简单和专一:

三、 MiMo 如何结合 SSE 实现流式对话

对于大模型应用 MiMo(可以理解为任何基于LLM的聊天服务),其流式输出正是通过SSE协议将“思考”过程实时透传给前端。整个过程可以概括为:

  1. 客户端发起一个普通的HTTP POST请求,携带用户消息。
  2. 服务端接收请求,调用大模型推理。这里的关键是,调用方式不是等待整个回答生成完毕,而是使用模型提供的流式API(如 stream=True 参数)。
  3. 服务端将响应头设置为 Content-Type: text/event-stream,并开始一个持续的HTTP响应。
  4. 服务端从模型的流式接口不断获取生成的文本片段(token),按照SSE协议格式(如 data: {"content": "你好"}\n\n)写入响应流。
  5. 客户端(浏览器端或支持SSE的客户端库)通过 EventSource API 监听此连接,每接收到一个事件,就将其解析并追加到页面的输出区域中。
  6. 当模型生成完毕或客户端中断时,连接关闭。
提示:虽然 WebSocket 也能实现流式,但对于模型输出这种“服务器单向生成”的场景,SSE 是更简单、更贴合语义的选择。它无需处理复杂的双向通信逻辑。

四、 客户端示例:监听SSE流

在前端JavaScript中,我们可以直接使用原生的 EventSource 或在 fetch API中配合 ReadableStream 来处理SSE。这里以 fetch + ReadableStream 为例,它提供了更灵活的控制。

async function chatStream(prompt) {
  const response = await fetch('/api/chat', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ prompt })
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder('utf-8');

  let buffer = '';
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    buffer += decoder.decode(value, { stream: true });
    // 按SSE协议分割事件,通常以双换行符 \n\n 分隔
    const events = buffer.split('\n\n');
    // 最后一个片段可能不完整,保留在buffer中
    buffer = events.pop();

    events.forEach(event => {
      if (event.startsWith('data: ')) {
        const data = event.substring(6); // 去掉 'data: ' 前缀
        try {
          const parsed = JSON.parse(data);
          document.getElementById('output').innerText += parsed.content;
        } catch (e) {
          console.error('解析SSE数据失败:', e);
        }
      }
    });
  }
}

五、 应用场景:不仅仅是聊天

流式输出和SSE的价值远不止于聊天机器人。在任何处理时间较长且结果可以分步呈现的任务中,它都能极大改善用户体验。

六、 实践须知与技巧

在你的项目中引入SSE时,需要注意以下几点:

核心提示SSE 是基于文本的协议,在传输二进制数据(如图片)时,需要先进行Base64编码。对于大模型生成的文本,这完全不是问题。

七、 总结:让交互回归自然

流式输出通过 SSE协议,将大模型“思考-输出”的离散过程,转变为对用户而言连续、自然的交互体验。它不仅是技术优化,更是交互设计哲学的一次体现:尊重用户的注意力和时间,通过实时反馈建立信任感。在你的下一个AI应用项目中,不妨将流式输出作为一项基础能力来设计,它带来的体验提升会远超你的预期。