EN

LLM 流式 vs 轮询:并排对比

实时 LLM 响应的 API 设计对比——比较 FastAPI 和 WebSocket 的 UX 模式

返回教程列表
进阶9 分钟

LLM 流式 vs 轮询:并排对比

实时 LLM 响应的 API 设计对比——比较 FastAPI 和 WebSocket 的 UX 模式

LLM 流式 vs 轮询对比(2026):这是两个问题——单响应渐进展示用流式(SSE)、长任务追踪用提交+轮询/webhook、机器消费输出两者都不用。含真实产品三层混合架构与反模式警告。

LLM 流式 vs 轮询:并排对比

一张表决定:

你的场景使用方式

用户看着响应逐字出现(聊天、Copilot)流式 响应供代码消费,而非人眼(提取 JSON、分类、嵌入)普通请求/响应——两者都不用 任务耗时数分钟以上(批量运行、Agent 流水线、视频生成)提交 + 轮询(或 Webhook)

值得细说的微妙之处:“流式 vs 轮询”实际上指的是两个不同的问题——*如何逐步交付单个响应*(流式的职责)和*如何追踪长时间运行的任务*(轮询的职责)。大多数真实产品在不同地方需要两者。

流式:感知延迟即产品

一个 LLM 可能需要 8 秒完成,但只需 300 毫秒生成第一个 token。流式将“盯着旋转圈 8 秒”变成“0.3 秒后开始阅读”——模型并没有更快,但首 token 时间取代总时间成为感知延迟,这是任何模型端优化都无法比拟的 UX 提升。每个主流提供商都支持(stream=True),通过单个 HTTP 响应中的 SSE 交付:

python
stream = client.chat.completions.create(model='gpt-4o-mini', messages=msgs, stream=True)
for chunk in stream:
    print(chunk.choices[0].delta.content or '', end='', flush=True)

你需接受的流式代价:基础设施不能缓冲(nginx proxy_buffering off,注意会缓冲整个体的无服务器平台),错误处理形式改变(模型中途出错时状态码 200 已发送——你需要带内错误事件),逐 token 输出在必须验证*整个*响应后才能展示时很尴尬。服务端实现:FastAPI 流式配方;更深入的 SSE 机制:SSE 指南

何时不流式:机器消费的输出。流式输出半个 JSON 对象毫无帮助——请求完整结果,验证(Zod vs Pydantic),然后返回。

轮询:用于任务,而非 token

当工作超出合理 HTTP 请求时长——500 个文档的批量处理、多步 Agent、任何排队任务——模式是提交,获取任务 ID,定期检查

python
job = client.batches.create(...)            # 立即返回一个 ID
while (j := client.batches.retrieve(job.id)).status not in ('completed', 'failed'):
    time.sleep(30)

轮询的优点在于运维:它能在客户端断开和部署时存活(状态保存在服务端),调试简单(curl 状态端点),且无需特殊基础设施。代价:延迟粒度等于轮询间隔,天真的紧密循环浪费请求——使用退避(1s → 2s → 5s → 上限),当提供商/你的基础设施支持推送时,优先使用 Webhook 而非轮询。典型的 LLM 示例是 Batch API(OpenAI Batch vs 标准)。

反模式:为 token 级更新轮询——在服务端存储部分生成结果,浏览器每 500 毫秒获取一次。你继承了流式的复杂性*和*轮询的延迟;SSE 的存在正是为了让你永远不要构建这个。

真实产品趋同的混合架构

一个生产级的 Agent/聊天功能通常同时使用所有三层:

  • 提交任务 → 任务 ID(以便运行在关闭标签页后仍然存活),
  • 流式当前步骤的 token 给正在观看的人(SSE/WebSocket),
  • 轮询或 Webhook 任务状态,用于重新连接的客户端和后台完成(邮件“你的报告已就绪”)。
  • 这也是流式本身缺乏的重连故事:SSE 没有重放,因此重连时你需要获取累积状态(轮询形状的端点)并从那里恢复实时流。

    WebSocket?

    仅当流量真正双向且持续时——语音 Agent、协作会话、生成中途的用户打断。对于标准的“模型说话,用户阅读”流程,SSE 以普通 HTTP 语义提供相同的 UX(可通过代理工作,浏览器 EventSource 自动重连,无连接状态操作负担)。

    常见问题

    流式会消耗更多 token 吗? 不会——相同的 token,相同的账单。一个操作差异:流式可以在用户导航离开时中途中止生成,停止为剩余部分付费;而一次性非流式调用会运行到完成。

    Agent 如何适配? Agent 步骤(工具调用、检索)是*事件*,而非 token——将它们作为类型化 SSE 事件流式输出(“搜索中…”、“找到 12 个结果”)以实现活动反馈 UX,对于断开的客户端则回退到任务轮询。

    gRPC 流式? 对于服务间内部流量,它是原生适配——参见 gRPC for AI services。面向浏览器则保持 SSE。


    *最后更新:2026 年 6 月。*

    相关工具

    fastapipython