LLM 输出四层模型
LLM 流式输出从原始 token 到最终 UI 状态的四层抽象:raw tokens → text deltas → semantic chunks → UI state。
#type / concept
#status / evergreen
#tech / ai
#tech / architecture
[!info] related notes
- 所属 MOC: LLM Streaming MOC
- 下游协议: Delta Stream, Append Event Stream, Full State Stream
- 聚合层: Chunk Aggregator
- SSE 基础: SSE
- 关系笔记: LLM Streaming 分层架构
LLM 输出四层模型
一句话定义
LLM 的流式输出可以抽象为四层:raw tokens → text deltas → semantic chunks → UI state,每一层解决不同粒度的问题,SSE 协议设计的核心是在第 2 层和第 3 层之间选择传输粒度。
核心机制
第 1 层:Raw Tokens
模型最原始的输出,每个 token 是一个词元(可能是半个汉字、一个英文单词、一个标点符号)。
token: "你"
token: "好"
token: "世"
token: "界"
这一层由 LLM Provider(OpenAI / Claude / Qwen)直接输出,应用层通常不直接消费。
第 2 层:Text Deltas
将原始 token 组织为文本增量。这是大多数 SSE 协议实际传输的内容。
delta: "你"
delta: "好"
delta: "世界"
特点:
- 每个 delta 是同一段文本的追加内容
- 前端操作:
content += delta - 对应 Delta Stream 协议
第 3 层:Semantic Chunks
按语义边界组织的结构化块。一个 chunk 可能是一句话、一个 markdown 段落、一次 tool call、一段结构化数据。
{ "type": "text", "content": "你好世界" }
{ "type": "tool_call", "name": "search", "args": {...} }
{ "type": "extracted_info", "data": {...} }
特点:
- 每个 chunk 有明确的语义类型
- 前端按类型分发处理
- 对应 Append Event Stream 协议
第 4 层:UI State
前端最终渲染的状态。包括消息列表、工具调用状态、结构化信息面板、加载状态等。
{
messages: [...],
toolCalls: [...],
extractedInfo: {...},
status: "streaming"
}
这一层由前端状态管理器(Zustand / Redux / XState)维护。
层级关系
Raw Tokens ← LLM Provider 输出
↓ token 聚合
Text Deltas ← Delta Stream 协议传输
↓ 语义切分
Semantic Chunks ← Append Event Stream 协议传输
↓ 状态更新
UI State ← Frontend State Manager 管理
关键洞察:SSE 协议设计的核心决策是——你的事件流在哪一层传输?
- 在第 2 层传输 → Delta Stream(打字机效果)
- 在第 3 层传输 → Append Event Stream(多步骤流程)
- 在第 4 层传输 → Full State Stream(编辑器场景)
边界与易混淆点
- SSE 不等于协议:SSE 是传输通道(第 0 层),四层模型是数据语义的设计。
- Token ≠ Delta ≠ Chunk:一个 token 可能是半个字,一个 delta 可能包含多个 token,一个 chunk 可能包含多个 delta。
- 不是每层都必须存在:简单场景可以直接从 token 到 UI state,跳过中间层。