一句话定义:预填充(Prefill)是大模型一次性把整段提示词读完、并算出第一个字的阶段;解码(Decode)是之后一个字一个字往外蹦的阶段。
原理:批发和零售
大模型生成回答分两步走。
第一步 Prefill:你把提示词(prompt)丢进去,模型把这几百上千个 token 全部并行地过一遍网络。因为词与词之间没有先后依赖,GPU 可以一次性把它们一起算完,像批发——量大,但算力吃得满、单位成本低。这一步结束时,模型顺手存下一份 KV Cache(键值缓存,记录每个词的中间状态),并吐出第一个字。
第二步 Decode:从第二个字开始,每生成一个字都要依赖前面所有字,没法并行,只能一步一个字地串行推进。每走一步,都要把整个模型权重和不断变长的 KV Cache 从显存里搬一遍,可真正做的计算量很小——像零售,一次只卖一件,运费却照付。算力大量闲置,瓶颈卡在显存带宽上。
为什么体感是「首字慢、后面飞快」
你感受到的两段延迟,恰好对应这两个阶段:等第一个字,是在等 Prefill 把整段提示词嚼完(TTFT,首字延迟);第一个字出来之后,每个字的间隔(TPOT)基本恒定且很短,文字就像打字机一样刷刷地流出来。
输入越长,Prefill 越久,首字等得越心焦;输出越长,Decode 只是线性地多跑几步,每步速度不变。这也解释了:贴一大段长文进去提问,首字明显变慢;问一句短话,几乎秒回。
| 维度 | 预填充 Prefill | 解码 Decode |
|---|---|---|
| 处理对象 | 整段输入提示词 | 每次一个新 token |
| 并行性 | 全部 token 并行算完 | 串行,一步一个 |
| 瓶颈 | 算力(大矩阵乘法) | 显存带宽 |
| 对应体感 | 首字延迟 TTFT | 每字间隔 TPOT |
| 随长度变化 | 输入越长越慢 | 每字耗时基本不变 |
和相邻概念的区别
KV Cache 不是一个阶段,而是贯穿两阶段的产物:Prefill 建立它,Decode 复用它并不断加长。流式输出(streaming)也不是计算阶段,它只是把 Decode 产出的字实时推给前端——它不加快速度,只是让你更早看到东西。
实际意义
对从业者:想压首字延迟,就优化 Prefill(前缀缓存、提示词压缩、切块调度);想提吞吐,就把多个请求的 Decode 阶段凑成一批一起跑,用并发把闲置算力填满;再进一步,可以把两者拆到不同机器上分别部署。具体方案与参数以各家官方文档为准。
对普通人:别把一整篇文档塞进去只问一句话,首字会等很久。想要「有反应」,优先选支持流式输出的产品——它会先给你第一个字,再慢慢补完。
