





















大家有没有想过,当你和 ChatGPT、豆包、通义千问聊天时,输入问题后,模型不会一次性弹出完整回答,而是逐字逐句输出。这背后是大语言模型(LLM)推理生成内容的核心逻辑——推理全流程,核心分为两个截然不同的阶段:Prefill(预填充) 和 Decode(解码)。简单说,就是模型先“一口气读完、吃透你的问题”,再“逐字逐句写回答”。下面用通俗的语言,结合技术细节,把整个流程讲清楚。
理解这两个阶段,先看一个好懂的比喻:
这里的“草稿纸”,就是工程里关键的 KV Cache(键值缓存)——模型理解问题后的核心记忆,后续生成回答全靠它。
Prefill 是推理的第一步,也是决定“你多久能看到第一个字”的关键阶段,核心是一次性、并行处理你输入的整段问题,完成“理解+记笔记”。
| 特征 | 通俗说明 |
|---|---|
| 计算密集型 | 要做大规模矩阵乘法,输入越长计算量越大,GPU算力是瓶颈(长文本会陡增) |
| 高度并行 | 整段问题的所有Token同时计算,速度快 |
| 显存峰值高 | 一次性给整段输入分配KV Cache,长文本会瞬间占用大量显存 |
| 决定首字延迟(TTFT) | 你发完问题到看到第一个字的等待时间,完全由Prefill决定 |
一句话总结:Prefill 是模型“埋头苦读、吃透问题”的过程,读得越快,你看到首字就越早。
Prefill生成第一个字后,模型立刻进入Decode阶段,核心是串行、逐字生成后续回答,全程依赖Prefill留下的KV Cache。
| 特征 | 通俗说明 |
|---|---|
| 显存带宽密集型 | 每次要读取庞大的KV Cache,瓶颈是显存带宽,不是算力 |
| 严格串行 | 必须等第N个字生成,才能生成第N+1个字,没法并行 |
| 单步计算量小 | 每次只处理1个Token,计算简单、耗时短 |
| 决定输出流畅度(TPOT) | 每个字的间隔时间,决定你感知的“打字速度” |
一句话总结:Decode 是模型“奋笔疾书写回答”的过程,受限于显存带宽,只能一个字一个字往外“吐”。
graph TD A[用户输入文本] --> B[第一站:分词 Tokenization] B --> B1[文本转数字Token ID] B --> B2[添加特殊标记] B --> B3[CPU轻量操作,瞬时完成] B3 --> C[第二站:Prefill 预填充] C --> C1[整段问题一次性送入GPU] C --> C2[并行计算上下文关联] C --> C3[生成KV Cache 显存占用高峰] C --> C4[输出第一个回答字] C4 --> D[第三站:Decode 解码生成] D --> D1[循环:输上一字→读KV Cache→生成下一字] D --> D2[追加新内容到KV Cache] D --> D3{异常判断} D3 -->|显存不足/超时/用户中断| D4[终止生成] D3 -->|正常| D5[直到结束符/达长度上限] D4 & D5 --> E[第四站:反分词 Detokenization] E --> E1[数字Token转回可读文字] E1 --> F[逐字流式返回给用户]
核心原因:Prefill和Decode的计算模式、资源瓶颈完全不同,强行合并会导致资源浪费、效率暴跌。
| 对比维度 | Prefill(预填充) | Decode(解码) |
|---|---|---|
| 输入规模 | 成百上千个Token并行处理 | 每次仅1个Token串行处理 |
| 计算类型 | 大规模矩阵乘法(算力瓶颈) | 小矩阵+大量缓存读取(带宽瓶颈) |
| 并行性 | 高度并行,效率高 | 严格串行,效率低 |
| 优化方向 | FlashAttention、算子融合 | KV Cache压缩、PagedAttention |
简单说:Prefill适合“批量干重活”,Decode适合“串行干轻活”,分开处理才是最高效的方式。
Prefill是显存占用高峰,输入越长,KV Cache占用越大。比如72B大模型处理128K超长文本,KV Cache会占用数十GB显存,显存不够直接接不了长问题。
不同模型架构差异明显:GQA(分组查询头)模型比普通模型,KV Cache显存占用低30%~70%,选型时要重点关注。
| 技术 | 解决问题 | 作用阶段 | 小说明 |
|---|---|---|---|
| FlashAttention | 降显存占用、提计算速度 | Prefill | 需Ampere及以上GPU支持 |
| PagedAttention | 避免显存碎片、高效管缓存 | Decode | 推理引擎核心优化 |
| Chunked Prefill | 超长问题不阻塞聊天请求 | Prefill | 牺牲少量首字延迟,换并发 |
| 投机解码 | 加速逐字生成 | Decode | 小模型打草稿、大模型批改 |
| KV Cache量化 | 降显存带宽压力 | Decode | 轻微精度损失,需场景验证 |
| Prefix Caching | 重复问题不用反复读 | Prefill | 缓存常见问题前缀,省算力 |
大模型和你聊天,从来不是“边读边写”,而是先精读吃透、再慢写输出的精密流水线:Prefill决定模型理解深度和首字速度,Decode决定回答长度和阅读流畅度。
对我们普通用户来说,不用纠结复杂技术,只需知道:输入问题后短暂等待,是模型在“认真读题”;后续逐字输出,是模型在“慢慢作答”——流畅对话的背后,全是这两个阶段的默契配合。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。