Delta Stream
LLM 流式协议的主流模式——只发送同一消息内容的文本增量(diff),前端通过 buffer += delta 拼接。ChatGPT、Claude、Gemini 都采用这种模式。
#type / concept
#status / evergreen
#tech / ai
#tech / architecture
[!info] related notes
- 所属 MOC: LLM Streaming MOC
- 对比: Append Event Stream, Full State Stream
- 综合对比: Delta Stream vs Append Stream
- 输出模型: LLM 输出四层模型
- 前端消费: 前端 SSE 消费
Delta Stream
一句话定义
Delta Stream 是最主流的 LLM 流式协议——只发送同一个消息内容的文本增量,前端通过 content += delta 拼接完整文本,实现打字机效果。
核心机制
数据模型
每个事件携带同一段文本的新增部分:
{ "type": "text.delta", "content": "你" }
{ "type": "text.delta", "content": "好" }
{ "type": "text.delta", "content": ",我" }
{ "type": "text.delta", "content": "可以帮你" }
前端操作
// 维护同一个 assistant message 的 buffer
message.content += event.content
// 最终结果
// message.content = "你好,我可以帮你"
核心模型是:一个消息正在被逐步生成。所有 delta 都在扩展同一段文本。
协议示例
{ "type": "message.start", "id": "m1", "role": "assistant" }
{ "type": "text.delta", "message_id": "m1", "content": "你" }
{ "type": "text.delta", "message_id": "m1", "content": "好" }
{ "type": "message.end", "id": "m1" }
最小场景
前端实现打字机效果:
let buffer = ""
// 每收到一个 delta 事件
function onDelta(content: string) {
buffer += content
render(buffer) // 重新渲染
}
适用场景
| 场景 | 说明 |
|---|---|
| ChatGPT 式对话 | 单条回答逐字生成 |
| Claude UI | AI 助手回复 |
| Copilot | 代码补全 |
| Perplexity | 搜索增强回答 |
优势
- 带宽最低:只传输增量,不重复已发送内容
- 延迟最低:token 到达即推送,无需等待聚合
- 最贴近 token streaming:和模型输出粒度天然匹配
- 实现简单:前端只需维护一个 buffer
局限
- 必须维护 buffer:前端需要自己拼接文本
- 无法回滚/修正:一旦发送,不能撤回已推送的 delta
- 不适合复杂编辑场景:不支持局部替换、undo
- 不擅长表达非文本内容:工具调用、结构化信息需要额外协议扩展
边界与易混淆点
- Delta ≠ Token:一个 delta 可能包含多个 token(由 Chunk Aggregator 聚合),也可能就是一个 token。
- Delta Stream 可以扩展:实际生产中通常在 Delta 基础上增加
tool_call、extracted_info等事件类型,变成 Delta + Append 的混合模式。 - char-level split 是反模式:如果每个汉字都单独发一个事件,不是 Delta Stream 的问题,而是 Chunk Aggregator 层粒度错误。
工业应用
OpenAI、Claude、Gemini 的 streaming API 都是 Delta Stream 的变体:
- OpenAI:
choices[0].delta.content - Claude:
content_block_delta事件 - Gemini:
candidates[0].content.parts[0].text