一、初识流式:为何 AI 对话需要“边答边现”?
在与大语言模型(如 MiMo)交互时,传统的“请求-等待-响应”模式会带来明显的延迟。你发送一个请求,模型需要“思考”一段时间,生成完整的回答后才一次性返回给你。对于长篇回答,这个等待过程可能长达数十秒,用户体验非常糟糕。
流式输出(Streaming) 的核心思想是“化整为零”。模型在生成回答的同时,就将已经生成的部分数据块(token by token)实时推送给客户端。用户可以立刻看到第一个字、第一句话,并随着后续内容的陆续到达,形成自然的阅读流。这极大地提升了交互的实时感和流畅性,是现代 AI 应用(如 ChatGPT、各类 Copilot)的标配体验。
二、协议基石:SSE 如何实现服务端“推送”
要实现流式输出,我们需要一种机制让服务器能主动向客户端推送数据,而不是等待客户端每次都来拉取。Server-Sent Events(SSE) 就是这样一个基于 HTTP 的轻量级协议,专为服务器到客户端的单向实时通信而设计。
SSE 的优势在于其简洁和兼容性。它本质上是一个长连接的 HTTP 响应,内容类型为 text/event-stream。服务器持续地在这个连接上发送格式化的文本消息,而客户端(浏览器或应用)使用标准的 EventSource API 或 Fetch API 来监听并处理这些消息。它无需复杂的协议升级(如 WebSocket),天然适配 HTTP/1.1 和 HTTP/2,部署和调试都相对简单。
三、MiMo 的实践:从模型输出到流式事件
当我们将 MiMo 的输出设置为流式模式时,其工作流程大致如下:
- 客户端发起一个 POST 请求到 MiMo 的 API 端点,并在请求体中明确设置
"stream": true。 - MiMo 服务端接收请求,开始生成回答。与非流式模式不同,它不会将所有生成的 token 缓存起来,而是每生成一个或一小批 token,就立即构造一个符合 SSE 规范的事件(event)并推送给客户端。
- 客户端通过监听 SSE 连接,实时接收这些事件,并逐步拼接出完整的回答。
一个典型的 SSE 事件格式如下:
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"你好"},"index":0,"finish_reason":null}]}
其中 data: 字段后跟随的是一个 JSON 字符串,它通常包含一个