详解 SSE 流式传输原理和优势,说明为何生产环境需要流式化(降低延迟感、支持中断、处理长回复),包括取消机制和中断拦截。
当你向大语言模型发送 prompt 时,默认采用同步模式:客户端会等待服务端生成完整响应,然后以单个 payload 一次性返回。对于简短回答,这种方式尚可接受;但面对长篇写作、编程辅助或多步骤 Agent 工作流时,延迟很快就会变得难以忍受。Streaming 通过在 token 生成时即时传输它们来解决这个问题,既能让用户立即看到反馈,也能帮助开发者构建响应更迅速的系统。
LLM Streaming 使用基于 HTTP 的 Server-Sent Events(SSE)。服务端不再返回单个 JSON 响应,而是在模型生成 token 的过程中推送一系列 JSON chunk。每个 chunk 都包含最终文本的一小段增量内容,因此客户端可以在内容抵达时逐步渲染文字,而不必阻塞到整个生成过程结束。
感知延迟会显著降低,因为用户可以在几百毫秒内看到第一个 token,而不必一直等到最后一个 token 生成。除此之外,如果用户改变主意,你还可以取消正在处理的请求;也可以提前拦截 Agent 的 tool call,无须消耗完整的 completion。对于语音和聊天界面而言,Streaming 实际上是必不可少的。
在底层,连接使用 chunked transfer encoding。每个事件都是一行纯文本,以 data: 为前缀,并使用两个换行符作为分隔。最后一个 chunk 包含 [DONE] 标记,用于表示传输完成。每个 payload 都与标准的 chat completions schema 保持一致,其中包含 id、object、created、model 和 choices 数组。在 choices 内部,delta 对象承载增量内容,而 finish_reason 只会出现在最后一个 chunk 中。
由于 Oxlo.ai 完全兼容 OpenAI SDK,因此启用 Streaming 只需要两处改动:将客户端指向 https://api.oxlo.ai/v1,并设置 stream=True。下面分别展示了使用 Python、Node.js 和 cURL 调用 Oxlo.ai API 的示例。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.oxlo.ai/v1",
api_key=os.environ["OXLO_API_KEY"]
)
stream = client.chat.completions.create(
model="your-model-id", # e.g., Qwen 3 32B, Llama 3.3 70B, DeepSeek R1 671B
messages=[{"role": "user", "content": "Explain LLM streaming"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.oxlo.ai/v1',
apiKey: process.env.OXLO_API_KEY,
});
const stream = await client.chat.completions.create({
model: 'your-model-id', // e.g., Kimi K2.6, DeepSeek V4 Flash
messages: [{ role: 'user', content: 'Explain LLM streaming' }],
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) {
process.stdout.write(content);
}
}
curl https://api.oxlo.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXLO_API_KEY" \
-d '{
"model": "your-model-id",
"messages": [{"role": "user", "content": "Explain LLM streaming"}],
"stream": true
}'
生产环境中的客户端必须具备足够的韧性。应使用异常处理包裹消费循环,以捕获网络超时或连接重置。在 Node.js 中,可以为请求附加 AbortController signal;在 Python 中,可以通过跳出 generator 循环来停止消费。SSE stream 中的空行是用于维持连接的 heartbeat,应当忽略。只解析以 data: 开头的行,并在调用 JSON.parse() 或 json.loads() 之前移除这一前缀。由于 Oxlo.ai 在提供热门模型时没有 cold start,即使流量激增,time-to-first-token 也能保持稳定。
Streaming 改变的是 token 抵达的时间,而不是生成的 token 数量。在按 token 计费的平台上,最终账单会随着输入和输出 token 总量增加。Oxlo.ai 对每次 API 请求收取固定费用,无论 prompt 多长都一样,因此,即便发送长文档或多轮对话历史,成本也不会随之增加。对于长上下文摘要、代码生成,以及以 Streaming 方式输出大量内容的 Agent 循环,这种可预测性既能避免账单暴增,也能简化容量规划。面对长上下文工作负载,按请求计费可能比按 token 计费的替代方案便宜 10~100 倍。具体方案请参阅 Oxlo.ai 定价页面。
在渲染之前,应先缓冲不完整的 Markdown 或 HTML token,避免 UI 中出现格式破损。将 time-to-first-token 和吞吐量记录为核心健康指标。通过 keep-alive 复用 HTTP 连接,避免重复进行 TLS handshake。如果你正在构建 Agent,应检查 chunk 中是否出现了早期 tool-call 特征,而不是等待完整 completion 结束。选择服务提供商时,需要确认你所需的具体模型是否支持 Streaming。Oxlo.ai 为 45 种以上的模型提供 Streaming,其中包括 reasoning、code 和 vision 变体,并且热门 endpoint 没有 cold start。
Streaming 已经不再是一项小众优化,而是现代聊天、编程和 Agent 界面的基本要求。Oxlo.ai 让接入变得非常简单:将 base URL 改为 https://api.oxlo.ai/v1,设置 stream=True,即可从丰富的模型目录中接收标准 SSE chunk。凭借按请求计费、无 cold start 以及对 OpenAI SDK 的完整兼容,Oxlo.ai 非常适合任何依赖快速、可预测 Streaming 的生产流水线。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。