头图

大家有没有想过,当你和 ChatGPT、豆包、通义千问聊天时,输入问题后,模型不会一次性弹出完整回答,而是逐字逐句输出。这背后是大语言模型(LLM)推理生成内容的核心逻辑——推理全流程,核心分为两个截然不同的阶段:Prefill(预填充)Decode(解码)。简单说,就是模型先“一口气读完、吃透你的问题”,再“逐字逐句写回答”。下面用通俗的语言,结合技术细节,把整个流程讲清楚。

一、生活化类比:把推理比作一场开卷考试

理解这两个阶段,先看一个好懂的比喻:

  • Prefill(预填充)= 通读材料+做笔记:拿到试卷(你的问题)和参考资料,快速通读全文,在草稿纸上记下要点、逻辑关联,全程费脑力,但不写任何答案
  • Decode(解码)= 逐题逐字写答案:看着草稿纸上的笔记,逐字书写答案,每写一个字都核对上下文,过程轻松,但只能一个字一个字写,没法跳步

这里的“草稿纸”,就是工程里关键的 KV Cache(键值缓存)——模型理解问题后的核心记忆,后续生成回答全靠它。

二、Prefill(预填充):一次性吃透你的问题

Prefill 是推理的第一步,也是决定“你多久能看到第一个字”的关键阶段,核心是一次性、并行处理你输入的整段问题,完成“理解+记笔记”。

2.1 它具体在做4件事

  1. 分词(Tokenization):把你的文字拆成模型能懂的最小语义单元(Token),比如中文里一个词、半个词都是1个Token,再转换成数字ID,相当于把人类语言翻译成模型的“数学语言”。
  2. 全序列并行计算:把整段输入一次性送入模型,通过自注意力机制,同时计算所有Token之间的上下文关联(比如理清“它”指代橘子还是桌子)。
  3. 建立记忆(KV Cache):把计算好的关键信息(Key和Value矩阵)存入显存,生成KV Cache——相当于把理解好的问题逻辑,记在“草稿纸”上。
  4. 产出第一个字:基于最后一个Token的隐状态,生成回答的第一个Token,完成Prefill闭环。

2.2 Prefill的4个核心特点

特征通俗说明
计算密集型要做大规模矩阵乘法,输入越长计算量越大,GPU算力是瓶颈(长文本会陡增)
高度并行整段问题的所有Token同时计算,速度快
显存峰值高一次性给整段输入分配KV Cache,长文本会瞬间占用大量显存
决定首字延迟(TTFT)你发完问题到看到第一个字的等待时间,完全由Prefill决定

一句话总结:Prefill 是模型“埋头苦读、吃透问题”的过程,读得越快,你看到首字就越早。

三、Decode(解码):自回归逐字写回答

Prefill生成第一个字后,模型立刻进入Decode阶段,核心是串行、逐字生成后续回答,全程依赖Prefill留下的KV Cache。

3.1 它具体在做循环操作

  1. 刚生成的1个Token(及位置编码偏移) 作为新输入;
  2. 读取Prefill缓存的KV Cache,以及之前Decode新增的缓存;
  3. 计算当前字与历史上下文的关联,不用重新算旧内容
  4. 采样生成下一个Token;
  5. 把新字的信息追加到KV Cache,更新“草稿纸”;
  6. 重复以上步骤,直到遇到结束符(EOS)、达到长度上限,或触发异常终止(显存不足、用户中断)。

3.2 Decode的4个核心特点

特征通俗说明
显存带宽密集型每次要读取庞大的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 vs Decode 核心对比

对比维度Prefill(预填充)Decode(解码)
输入规模成百上千个Token并行处理每次仅1个Token串行处理
计算类型大规模矩阵乘法(算力瓶颈)小矩阵+大量缓存读取(带宽瓶颈)
并行性高度并行,效率高严格串行,效率低
优化方向FlashAttention、算子融合KV Cache压缩、PagedAttention

简单说:Prefill适合“批量干重活”,Decode适合“串行干轻活”,分开处理才是最高效的方式。

六、关键影响:理解两阶段,看懂模型体验与优化

6.1 显存规划:长文本的“隐形杀手”

Prefill是显存占用高峰,输入越长,KV Cache占用越大。比如72B大模型处理128K超长文本,KV Cache会占用数十GB显存,显存不够直接接不了长问题
不同模型架构差异明显:GQA(分组查询头)模型比普通模型,KV Cache显存占用低30%~70%,选型时要重点关注。

6.2 体验权衡:首字快 vs 输出顺

  • 长文档问答(长Prefill+短Decode):优先看首字延迟(TTFT),建议控制在1~3秒内;
  • 日常聊天(短Prefill+长Decode):优先看输出流畅度(TPOT),建议控制在50~100ms/字,接近人类打字速度。

6.3 现代优化手段:解决痛点、提升效率

技术解决问题作用阶段小说明
FlashAttention降显存占用、提计算速度Prefill需Ampere及以上GPU支持
PagedAttention避免显存碎片、高效管缓存Decode推理引擎核心优化
Chunked Prefill超长问题不阻塞聊天请求Prefill牺牲少量首字延迟,换并发
投机解码加速逐字生成Decode小模型打草稿、大模型批改
KV Cache量化降显存带宽压力Decode轻微精度损失,需场景验证
Prefix Caching重复问题不用反复读Prefill缓存常见问题前缀,省算力

七、结语

大模型和你聊天,从来不是“边读边写”,而是先精读吃透、再慢写输出的精密流水线:Prefill决定模型理解深度和首字速度,Decode决定回答长度和阅读流畅度。

对我们普通用户来说,不用纠结复杂技术,只需知道:输入问题后短暂等待,是模型在“认真读题”;后续逐字输出,是模型在“慢慢作答”——流畅对话的背后,全是这两个阶段的默契配合。


蔡大锅
2.5k 声望366 粉丝