目录
- 前言
- [一、AI 应用中常见的流式技术(六大类)](#一、AI 应用中常见的流式技术(六大类))
-
- [1、LLM Token Streaming(最底层)](#1、LLM Token Streaming(最底层))
- [2、HTTP Chunked Transfer(传输层流)](#2、HTTP Chunked Transfer(传输层流))
- [3、SSE(Server-Sent Events)(AI 应用主流)](#3、SSE(Server-Sent Events)(AI 应用主流))
- 4、WebSocket(双向实时流)
- [5、Async Generator / Iterator(进程内流)](#5、Async Generator / Iterator(进程内流))
- [6、Message Stream / Queue(系统级流)](#6、Message Stream / Queue(系统级流))
- [二、AI 应用中的"流式分层模型"(非常重要)](#二、AI 应用中的“流式分层模型”(非常重要))
- [三、ReadableStream 在"流式分层模型"中扮演着什么角色?](#三、ReadableStream 在“流式分层模型”中扮演着什么角色?)
-
- [1、ReadableStream 的核心定位](#1、ReadableStream 的核心定位)
- [2、ReadableStream 到底解决了什么问题?](#2、ReadableStream 到底解决了什么问题?)
-
- (1)、把"异步产出"变成"标准流接口"
- [(2)、 统一 Node / Edge / Browser 的流模型](#(2)、 统一 Node / Edge / Browser 的流模型)
- [3、ReadableStream 在 AI 中的三种"主流用法"](#3、ReadableStream 在 AI 中的三种“主流用法”)
- [4、ReadableStream vs SSE vs WebSocket(非常关键)](#4、ReadableStream vs SSE vs WebSocket(非常关键))
- [5、为什么现代 AI 框架"强依赖" ReadableStream?](#5、为什么现代 AI 框架“强依赖” ReadableStream?)
-
- [(1)、Fetch-first 架构的必然选择](#(1)、Fetch-first 架构的必然选择)
- (2)、Backpressure(背压)能力非常关键
- (3)、可以被"多次变换(TransformStream)"
- 四、工程实践建议(非常重要)
- 五、实际主流厂商是怎么做的?
-
- 1、OpenAI:事件流做得最彻底、最工程化
-
- [(1)、接口层:SSE + Event Stream(事实标准)](#(1)、接口层:SSE + Event Stream(事实标准))
- (2)、内部真实模型(推断)
- [(3)、为什么 OpenAI 要做这么复杂?](#(3)、为什么 OpenAI 要做这么复杂?)
- 2、Claude(Anthropic):保守但非常"干净"的流式
-
- [(1)、接口层:HTTP Streaming(SSE-lite)](#(1)、接口层:HTTP Streaming(SSE-lite))
- (2)、设计哲学
- (3)、推断的内部结构
- 3、DeepSeek:典型"中国工程取向"------实用优先
- [4、Gemini(Google):双轨制,非常"Google 风格"](#4、Gemini(Google):双轨制,非常“Google 风格”)
-
- (1)、两套体系并存(很关键)
-
- [①、API / Web 场景](#①、API / Web 场景)
- [②、实时 / 多模态场景](#②、实时 / 多模态场景)
- [(2)、Gemini 的真正优势点](#(2)、Gemini 的真正优势点)
- (3)、推断内部结构
- 5、给我们的工程启示(非常实用)
- 六、前端到底需要关心什么?
-
- 1、前端真正"直接相关"的技术清单(重点)
-
- [(1)、SSE(Server-Sent Events)(⭐⭐⭐⭐⭐)](#(1)、SSE(Server-Sent Events)(⭐⭐⭐⭐⭐))
- [(2)、Fetch + ReadableStream(最重要)(⭐⭐⭐⭐⭐)](#(2)、Fetch + ReadableStream(最重要)(⭐⭐⭐⭐⭐))
- (3)、WebSocket(可选,但重要)(⭐⭐⭐⭐)
- [(4)、流式 UI 渲染(非常关键)(⭐⭐⭐⭐⭐)](#(4)、流式 UI 渲染(非常关键)(⭐⭐⭐⭐⭐))
- [(5)、Abort / 中断机制(⭐⭐⭐⭐)](#(5)、Abort / 中断机制(⭐⭐⭐⭐))
- (6、)多厂商协议适配(工程现实)(⭐⭐⭐⭐)
- 2、明确界限:哪些"看起来高级"的东西,其实前端不用管?
- [3、前端视角的"主流 AI 流式技术地图"](#3、前端视角的“主流 AI 流式技术地图”)
- 4、给你的"前端工程建议"
前言
在正文开始之前,我们不妨先思考一个问题------"为什么主流 AI Agent 需要"切片分段输出",而不是等模型算完再一起返回?"
主流 AI Agent 必须切片分段输出,不是因为"体验更好",而是因为:
- 大模型天生流式生成的
- Agent 本质是长期运行的进程
- 执行路径与耗时不可预期
- 中间状态本身就是"结果的一部分"
- 系统必须可中断、可观察、可协作
一、AI 应用中常见的流式技术(六大类)
当前 AI 应用(Chat / Agent / Copilot / 多模态) 中,真正常用且成熟的流式技术主要是:
| 技术 | 层级 | 是否主流 | Agent 友好度 | 实时性 | 复杂度 |
|---|---|---|---|---|---|
| Token Streaming | 模型 | ⭐⭐⭐⭐⭐ | ⭐ | 极高 | 低 |
| HTTP Chunk | 传输 | ⭐⭐⭐ | ⭐ | 高 | 低 |
| SSE(Server-Sent Events) | 网络 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 高 | 中 |
| WebSocket | 网络 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 极高 | 高 |
| Async Generator | 运行时 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 高 | 中 |
| Message Stream | 系统 | ⭐⭐⭐ | ⭐⭐⭐⭐ | 中 | 高 |
注意:
- "流式 ≠ 网络协议"
- 它是从 "模型 → 进程 → 网络 → 前端" 的一整条链路
下面逐一展开。
1、LLM Token Streaming(最底层)
原理:
- 大模型 每生成一个 token 就立刻返回
- SDK / API 层把 token 当成流
- decode token → emit → client
常见形式:
- OpenAI stream=true
- Claude streaming
- DeepSeek / Qwen streaming
优缺点:
| 优点 | 缺点 |
|---|---|
| 最低延迟 | 只有文本 |
| 实现简单 | 无语义 |
| 符合模型本性 | 不支持 Agent |
适用:
- Chat
- 补全
- 编辑器 Copilot
所有 AI 流式的"源头"
2、HTTP Chunked Transfer(传输层流)
原理:
- HTTP/1.1 的 Transfer-Encoding: chunked
- 服务端边算边写 response
bash
chunk1\r\n
chunk2\r\n
chunk3\r\n
特点:
- 不定义事件
- 只是"数据块"
优缺点:
| 优点 | 缺点 |
|---|---|
| 无额外协议 | 前端解析困难 |
| 基础设施兼容 | 无事件语义 |
| 实现成本低 | 不可扩展 |
3、SSE(Server-Sent Events)(AI 应用主流)
原理:
- 基于 HTTP 长连接
- 服务端主动 push 事件
- 客户端 EventSource 监听
bash
event: token
event: tool_start
event: tool_end
event: final
为什么 AI 特别适合 SSE?
- 单向(Agent → 用户)
- 天然支持 事件类型
- 不需要复杂连接管理
AI 中常见事件:
json
{ "type": "delta" }
{ "type": "tool_call" }
{ "type": "observation" }
{ "type": "final" }
优缺点:
| 优点 | 缺点 |
|---|---|
| Agent 友好 | 单向 |
| HTTP 友好 | 不适合高频控制 |
| 易调试 | 需要事件规范 |
ChatGPT / LangChain / Vercel AI 首选
4、WebSocket(双向实时流)
原理:
- 建立全双工长连接
- 双方随时发送消息
- Client ⇄ AI Runtime
常见 AI 用法:
- 实时 token 流
- 用户中断 / 追问
- Agent 控制指令
优缺点:
| 优点 | 缺点 |
|---|---|
| 双向 | 实现复杂 |
| 实时 | 连接管理难 |
| 强交互 | 基础设施要求高 |
典型场景:
- DE Copilot
- 多模态实时对话
- 语音 Agent
强交互 AI 才值得用
5、Async Generator / Iterator(进程内流)
⚠️ 这是Agent 内部最重要、但最容易被忽略的流式技术
原理:
AI 执行逻辑本身就是:
typescript
async function* runAgent() {
yield plan
yield tool_call
yield observation
yield final
}
特点:
- 不关心网络
- 描述的是 执行过程的"时间流"
优缺点:
| 优点 | 缺点 |
|---|---|
| 非常优雅 | 不是传输协议 |
| 易组合 | 需对外包装 |
| Agent 天然匹配 | 前端不可直接用 |
使用框架:
- LangGraph
- CrewAI(内部)
- AutoGen(内部)
Agent 的"内核流式模型"
6、Message Stream / Queue(系统级流)
原理:
- Agent 把结果写入流
- 多个消费者订阅
- Agent → Kafka / Redis Stream → UI / Logger / Monitor
特点:
- 非实时
- 高可靠
- 可回放
优缺点:
| 优点 | 缺点 |
|---|---|
| 高可靠 | 延迟高 |
| 多订阅 | 架构复杂 |
| 可审计 | 不适合 Chat |
适用:
- 企业级 Agent
- 长任务
- 多 Agent 协同
二、AI 应用中的"流式分层模型"(非常重要)
成熟 AI 应用一定是"多层流式"叠加:

不是选一个,而是"每一层都流式"。
三、ReadableStream 在"流式分层模型"中扮演着什么角色?
前面我们一起学习了"SSE / WebSocket / Token Streaming / Async Generator",ReadableStream 正好是把这些"流"真正串起来的那一层。
一句话概述:ReadableStream 是 AI 应用中"流式数据的标准承载体与拼装层 ",不是协议,而是能力底座。
1、ReadableStream 的核心定位
在 AI 流式体系中的位置:
typescript
LLM Token
↓
Async Generator(Agent 执行流)
↓ yield
ReadableStream ← ★关键承载层
↓ encode / format
SSE / HTTP Chunk / WebSocket
↓
Browser EventSource
↓
UI Render
它是:
- Agent 执行过程的"可观察接口"
- 流式协议的"物理承载层"
- 工程上连接模型、系统、UI 的桥梁
换句话讲,ReadableStream 是"把时间序列的数据变成可传输流"的那一层。
2、ReadableStream 到底解决了什么问题?
(1)、把"异步产出"变成"标准流接口"
Agent / LLM 常见输出形态是:
typescript
async function* generate() {
yield chunk1
await tool()
yield chunk2
}
ReadableStream 的作用:
typescript
new ReadableStream({
async pull(controller) {
const { value, done } = await iterator.next()
controller.enqueue(value)
if (done) controller.close()
}
})
它把"生成逻辑"和"传输逻辑"彻底解耦
(2)、 统一 Node / Edge / Browser 的流模型
ReadableStream 是:
- Web 标准
- Node 18+ / Bun / Deno / Edge 全支持
- Fetch API 原生兼容
typescript
return new Response(stream)
这就是为什么 Vercel / Cloudflare / Edge Agent 都围绕它构建
3、ReadableStream 在 AI 中的三种"主流用法"
用法1:LLM Token → HTTP Response
typescript
const stream = new ReadableStream({
async start(controller) {
for await (const token of llm.stream()) {
controller.enqueue(encoder.encode(token))
}
controller.close()
}
})
return new Response(stream)
最基础的 Chat 流式返回
用法2:Agent Event → SSE
typescript
controller.enqueue(
encoder.encode(
`event: tool\ndata: ${JSON.stringify(data)}\n\n`
)
)
ReadableStream 在这里:
- 管理 backpressure
- 控制连接生命周期
- 顺序推送事件
SSE 本身就跑在 ReadableStream 之上
用法3:ReadableStream 作为"流式组合器"
typescript
const stream = new ReadableStream({
async start(controller) {
for await (const event of agent.run()) {
controller.enqueue(format(event))
}
}
})
Agent 的"外放接口"
4、ReadableStream vs SSE vs WebSocket(非常关键)
很多人会混淆这三者
| 技术 | 是什么 | 解决什么 |
|---|---|---|
| ReadableStream | 流抽象 | 数据如何连续产生 |
| SSE | 协议约定 | 事件如何表达 |
| WebSocket | 通信通道 | 双向如何通信 |
用类比的思维一句话总结:
- ReadableStream:水管
- SSE:水的分段规则
- WebSocket:双向管道
5、为什么现代 AI 框架"强依赖" ReadableStream?
(1)、Fetch-first 架构的必然选择
现代 AI 框架普遍:
- 不再暴露 res.write
- 使用 return new Response(stream)
- ReadableStream 是 唯一标准方式
(2)、Backpressure(背压)能力非常关键
AI 输出特点:
- token 很多
- UI 消费速度不稳定
ReadableStream 内置:
- highWaterMark
- 自动 pull / pause
这是直接写 socket 做不到的
(3)、可以被"多次变换(TransformStream)"
typescript
stream
.pipeThrough(formatter)
.pipeThrough(compressor)
.pipeTo(response)
非常适合:
- Token → Event
- Event → UI
- 插件化 Agent 输出
四、工程实践建议(非常重要)
| 要做的工程 | 推荐的技术组合 |
|---|---|
| Web Agent / Copilot | Async Generator + SSE |
| 复杂多步骤 Agent | LangGraph + Event |
| IDE / 可中断 Agent | WebSocket + Event |
| 企业级 Agent 平台 | Event Bus + Workflow |
五、实际主流厂商是怎么做的?
主流大厂并不是"是否流式"的差异,而是:
- 流式到什么粒度?
- 是否把 Agent 的过程事件化?
- 对开发者暴露到哪一层为止?
四大厂商在"流式"上的共识是:
- 底层:Token 级流式是必选
- 传输:HTTP + 流(SSE / chunk)是主流
- 语义:开始向"事件流"而不是"纯文本流"演进
- Agent 能力:只"半开放",核心推理不全暴露
| 厂商 | 传输协议 | 流式粒度 | 事件语义 | Agent 感 | 工程取向 |
|---|---|---|---|---|---|
| OpenAI | SSE | Token + Event | 极强 | ⭐⭐⭐⭐⭐ | 平台化 |
| Claude | HTTP Stream | Token | 弱 | ⭐⭐ | 稳定优先 |
| DeepSeek | HTTP Stream | Token | 极弱 | ⭐ | 兼容优先 |
| Gemini | WS / gRPC / HTTP | Token / Frame | 强 | ⭐⭐⭐⭐ | 多模态 |
1、OpenAI:事件流做得最彻底、最工程化
(1)、接口层:SSE + Event Stream(事实标准)
你实际拿到的是什么?
- HTTP 长连接
- Content-Type: text/event-stream
- 强事件语义
json
{
"type": "response.output_text.delta",
"delta": "Hello"
}
json
{
"type": "response.tool_call",
"name": "search"
}
特点总结:
| 维度 | 表现 |
|---|---|
| 传输 | SSE |
| 粒度 | Token / Event |
| 事件种类 | 非常丰富 |
| Agent 感 | ⭐⭐⭐⭐⭐ |
(2)、内部真实模型(推断)
bash
Model Token Stream
↓
Internal Agent Runtime
↓
Event Normalizer
↓
ReadableStream
↓
SSE
关键点:
- ReadableStream 是核心承载
- Token 只是事件的一种
- Tool / Reasoning / Output 全事件化
OpenAI 实际已经是"Agent Runtime as a Service"
(3)、为什么 OpenAI 要做这么复杂?
支持:
- 工具调用
- 多模态
- 多阶段输出
为未来:
- 多 Agent
- 长任务
- 可中断执行
Chat 只是最简单的 use case
2、Claude(Anthropic):保守但非常"干净"的流式
(1)、接口层:HTTP Streaming(SSE-lite)
Claude 的 streaming:
- 本质是 HTTP chunked
- 表面看像 SSE
- 但 事件种类明显更少
json
{ "type": "content_block_delta" }
json
{ "type": "message_stop" }
(2)、设计哲学
Anthropic 的取舍是:
- "给你流式文本 + 最小必要结构,但不暴露 Agent 内部"
特点:
| 维度 | 表现 |
|---|---|
| 事件数量 | 少 |
| 语义 | 克制 |
| Agent 暴露 | 低 |
| 稳定性 | 极高 |
(3)、推断的内部结构
typescript
LLM Token Stream
↓
Lightweight Stream Wrapper
↓
HTTP Chunk / SSE-like
Claude 更像"增强版 Chat Completion"
3、DeepSeek:典型"中国工程取向"------实用优先
(1)、接口层:OpenAI-compatible + streaming
DeepSeek 的实际策略是:
- 高度兼容 OpenAI
- streaming 参数与 OpenAI 基本一致
- JSON delta 返
json
{
"choices": [{
"delta": { "content": "..." }
}]
}
(2)、特点总结
| 维度 | 表现 |
|---|---|
| 兼容性 | ⭐⭐⭐⭐⭐ |
| 流式 | Token 为主 |
| Agent 事件 | 少 |
| 工程成本 | 低 |
(3)、架构判断
typescript
LLM Token Stream
↓
OpenAI-style Delta Wrapper
↓
HTTP Stream
非常适合国内/企业"快速 Agent 落地"
4、Gemini(Google):双轨制,非常"Google 风格"
(1)、两套体系并存(很关键)
①、API / Web 场景
- HTTP streaming
- JSON chunk
- 类似 Claude / OpenAI
②、实时 / 多模态场景
- WebSocket / gRPC
- 强实时
- 语音、视频
(2)、Gemini 的真正优势点
- 原生多模态流式
- 音频 / 视频 frame 级流
- 极强的 低延迟双向能力
- Audio Frame ⇄ Model ⇄ Audio Frame
(3)、推断内部结构
typescript
Multi-modal Stream
↓
gRPC / WebSocket
↓
Web / Mobile SDK
Gemini 的"流式"不是为 Chat,而是为"实时智能体"
5、给我们的工程启示(非常实用)
如果你要"对齐主流厂商"
- 接口层
- SSE(事件化)
- 承载层
- ReadableStream
- 内部
- Async Generator / Event Emitter
最推荐的结构:
typescript
Agent (async generator)
↓
Event Normalize
↓
ReadableStream
↓
SSE / WS
真巧,这正是 OpenAI 正在做的事。
六、前端到底需要关心什么?
对于主流 AI 厂商的"流式能力",前端只需要关心 6 件事:
- 如何建立流式连接
- 如何稳定的持续接收数据
- 如何区分不同的"分段类型",然后分别进行正确的解析
- 如何优雅的渐进渲染
- 如何中断 / 结束
- 如何兼容不同厂商
其他的(Agent 内部、模型推理、工具调用)前端不需要知道。
1、前端真正"直接相关"的技术清单(重点)
(1)、SSE(Server-Sent Events)(⭐⭐⭐⭐⭐)
为什么前端必须懂 SSE?
- OpenAI(新接口)
- LangChain / LangGraph
- Vercel AI
- 大量自建 Agent
前端使用方式
typescript
const es = new EventSource("/api/stream")
es.onmessage = (e) => {
const data = JSON.parse(e.data)
}
前端关注点:
| 点 | 说明 |
|---|---|
| event 类型 | token / tool / final |
| 自动重连 | 浏览器内建 |
| 连接关闭 | es.close() |
| 错误处理 | onerror |
这是"ChatGPT 风格体验"的核心
(2)、Fetch + ReadableStream(最重要)(⭐⭐⭐⭐⭐)
⚠️ 前端"真正的底层能力"
标准写法:
typescript
const res = await fetch("/api/stream")
const reader = res.body!.getReader()
while (true) {
const { value, done } = await reader.read()
if (done) break
const text = decoder.decode(value)
}
为什么它如此重要?
- SSE 底层就是 ReadableStream
- 可解析:
- Token
- JSON
- 自定义协议
- Edge / 浏览器统一
前端关注点:
- TextDecoder
- chunk 拼接
- JSON boundary
- backpressure(隐式)
(3)、WebSocket(可选,但重要)(⭐⭐⭐⭐)
前端适合用 WS 的场景:
- 实时中断
- 实时控制 Agent
- 多模态(语音 / IDE)
typescript
const ws = new WebSocket(url)
ws.onmessage = (e) => {}
前端复杂度:
| 点 | 难度 |
|---|---|
| 重连 | 高 |
| 心跳 | 必须 |
| 状态同步 | 难 |
| 协议设计 | 自己来 |
不需要双向控制,别用
(4)、流式 UI 渲染(非常关键)(⭐⭐⭐⭐⭐)
前端不只是"接收",而是要:
- 边收边渲染,而不是 setState 全量替换
常见做法(React):
typescript
setText(prev => prev + delta)
进阶关注点:
- Markdown 增量渲染
- Code block 未闭合
- 光标位置
- 滚动锚点
体验好坏,80% 在这里
(5)、Abort / 中断机制(⭐⭐⭐⭐)
前端必须能"停下来"。
Fetch + AbortController:
typescript
const controller = new AbortController()
fetch(url, { signal: controller.signal })
controller.abort()
SSE:
typescript
es.close()
WebSocket:
typescript
ws.close()
为什么重要?
- 用户打断
- Token 失控
- Agent 卡死
(6、)多厂商协议适配(工程现实)(⭐⭐⭐⭐)
前端面对的真实世界:
| 厂商 | 返回结构 |
|---|---|
| OpenAI | event + delta |
| Claude | chunk + type |
| DeepSeek | OpenAI-style delta |
| Gemini | chunk / ws |
前端推荐做法:
typescript
normalizeChunk(raw) => {
return {
type: "text" | "tool" | "final",
content: string
}
}
不要把厂商结构写死在 UI 里
2、明确界限:哪些"看起来高级"的东西,其实前端不用管?
Agent 内部状态机看起来很高大上,但前端其实根本不用管:
❌ LangGraph 节点
❌ Tool 调用逻辑
❌ Reasoning Token
❌ ReadableStream 的生产端
前端只要一个东西:"稳定、可预测、可中断的流"。
3、前端视角的"主流 AI 流式技术地图"

4、给你的"前端工程建议"
✅ 前端必会的 AI 三件套:
- Fetch + ReadableStream(必须精通)
- SSE 的事件模型
- AbortController + 流式 UI 更新
❌ 不要一开始就碰:
- 自定义 WS 协议
- 多 Agent 同屏协作
- 推理过程可视化