Autoregressive Generation
Autoregressive Generation
一句话解释
自回归生成把联合分布拆成按位置的条件概率:P(x1...xT)=∏t P(xt | x<t)。模型每一步只决定下一个 token,再把它放回上下文;这让训练可以并行,却使在线生成天然带有串行依赖。
执行阶段
最小流程
- tokenize prompt。
- prefill 得到最后位置 logits 和初始 KV Cache。
- 应用 temperature、top-k/top-p 等采样策略。
- sample 或 argmax 得到下一个 token。
- 追加 token,用单 token decode 更新 KV Cache。
- 遇 EOS 或长度限制停止。
不使用 KV Cache 的教学实现会在每一步重算整个前缀,结果可以正确但计算量会随上下文增长。
prompt tokens + generated tokens 受 context window 限制;max_new_tokens 只约束新增 token 数。
训练与推理的断裂
训练有完整目标序列,可以用 Causal Mask 并行算出每个位置的 next-token loss;推理时真实的下一个 token 未知,必须等待模型自己采样的结果。因此训练 loss 下降不等于 free-running generation 不会累积错误,这正是 teacher forcing 与真实生成之间的分布差异。
采样与停止是系统契约
- greedy/argmax 稳定但容易重复;temperature 改变分布尖锐程度。
- top-k/top-p 把随机性限制在候选集合;beam search 和并行采样会改变搜索树与 KV 资源。
- EOS、stop sequence、chat template 和
max_new_tokens共同决定终止,ID 或模板不一致会造成过早停止或越界生成。
采样策略要和任务目标绑定:事实问答关注稳定与校准,创作关注多样性,工具调用关注 schema 合法率和停止边界。
一次生成的失败定位
- 重复循环:检查 logits、temperature、重复惩罚和 stop 条件。
- 长上下文变慢:区分 Prefill 的输入计算、Decode 的 KV 读取和服务排队。
- 不同客户端结果不同:核对 tokenizer、chat template、随机种子、采样参数和 streaming 拼接。
它向下连接 KV Cache,向上连接 Continuous Batching 与 Inference Engine Selection,横向依赖 Tokenization and BPE 和 Causal Mask。
生成不是一个只有模型的循环
在线请求还要经过 scheduler、KV block 分配、采样器和 streaming writer。某请求在等待 GPU 时,continuous batching 可能把别的请求插入同一轮 decode;因此一个 token 的 wall-clock 延迟由模型计算、排队、cache 分配和网络 flush 共同组成。看见 TPOT 变差时,先拆 TTFT、queue time、model time 和 inter-token gap,避免把调度问题误判成模型变慢。
采样器也改变了系统状态:top-p 需要对 logits 排序或累积概率,grammar-constrained decoding 会屏蔽非法 token,tool call 可能在生成中途把控制权交给外部执行器。此时“追加一个 token 再循环”中间还存在 schema 校验、工具超时和重试;重试是否复用 KV、是否重新采样都要定义,否则线上结果不可复现。
结束条件与 logprob 的边界
max_new_tokens 是预算,不是语义上的完成;EOS 是模型 token,stop sequence 可能跨 token 边界,客户端 streaming 又可能在 UTF-8 字节尚未完整时收到片段。评测长回答时分别记录自然 EOS、长度截断、stop 命中和外部中断的比例。需要 token-level 置信度时,保留采样前 logits 或选中 token 的 logprob;只保存最终文本无法恢复“模型当时是否犹豫”。