Delta Stream

LLM 流式协议的主流模式——只发送同一消息内容的文本增量(diff),前端通过 buffer += delta 拼接。ChatGPT、Claude、Gemini 都采用这种模式。

#type / concept #status / evergreen #tech / ai #tech / architecture

[!info] related notes

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 UIAI 助手回复
Copilot代码补全
Perplexity搜索增强回答

优势

  • 带宽最低:只传输增量,不重复已发送内容
  • 延迟最低:token 到达即推送,无需等待聚合
  • 最贴近 token streaming:和模型输出粒度天然匹配
  • 实现简单:前端只需维护一个 buffer

局限

  • 必须维护 buffer:前端需要自己拼接文本
  • 无法回滚/修正:一旦发送,不能撤回已推送的 delta
  • 不适合复杂编辑场景:不支持局部替换、undo
  • 不擅长表达非文本内容:工具调用、结构化信息需要额外协议扩展

边界与易混淆点

  • Delta ≠ Token:一个 delta 可能包含多个 token(由 Chunk Aggregator 聚合),也可能就是一个 token。
  • Delta Stream 可以扩展:实际生产中通常在 Delta 基础上增加 tool_callextracted_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
创建于 2026/6/29 更新于 2026/7/15