推理生成过程
一句话理解
大模型回答问题时,不是一次性生成整段文本,而是不断预测下一个 token,再把新 token 追加到上下文中,循环直到停止。
基本循环
flowchart LR A["输入上下文"] --> B["模型前向计算"] B --> C["输出 logits"] C --> D["采样/选择下一个 token"] D --> E["追加到上下文"] E --> B
简化成伪代码:
while not stopped:
logits = model(context)
next_token = decode(logits)
context.append(next_token)Logits 和概率
模型最后会对词表中的每个 token 输出一个分数,这些分数叫 logits。
logits 经过 softmax 后变成概率分布:
token A: 0.40
token B: 0.25
token C: 0.10
...解码策略决定从这个概率分布里选哪个 token。
常见解码策略
Greedy Decoding
每一步都选择概率最高的 token。
优点:
- 稳定。
- 可复现。
- 适合确定性任务。
缺点:
- 容易保守。
- 可能陷入重复或局部最优。
Temperature
Temperature 控制概率分布的平滑程度。
- temperature 低:更保守,更偏向高概率 token。
- temperature 高:更随机,输出更发散。
常见直觉:
| 场景 | temperature |
|---|---|
| 代码、事实问答 | 低 |
| 创意写作、头脑风暴 | 中高 |
Top-k
只从概率最高的 k 个 token 中采样。
例如 top-k = 40,表示每一步只考虑前 40 个候选 token。
Top-p
也叫 nucleus sampling。
它不是固定候选数量,而是选择累计概率达到 p 的候选集合。
例如 top-p = 0.9,表示只在累计概率达到 90% 的候选 token 中采样。
为什么同一个问题会有不同答案
如果使用采样策略,模型每一步都有一定随机性。只要某一步 token 不同,后续上下文就变了,最终答案也可能不同。
影响因素包括:
- temperature。
- top-p / top-k。
- system prompt。
- 上下文顺序。
- 是否启用工具。
- 模型服务端是否固定随机种子。
KV Cache 的作用
自回归生成时,历史 token 不断增加。如果每一步都重新计算所有历史 token 的 Key/Value,成本很高。
KV Cache 会缓存历史 token 的 Key 和 Value,让下一步只需要计算新 token 并复用历史缓存。
优势:
- 显著提升生成速度。
- 降低重复计算。
代价:
- 上下文越长,KV Cache 占用越多显存。
详细可看 图解 Transformer 中的 QKV 机制。
停止条件
生成会在一些条件下停止:
- 生成了结束 token。
- 达到最大输出 token 数。
- 命中 stop sequence。
- 工具调用或应用层中断。
- 安全策略拦截。
流式输出
流式输出不是模型一次性知道完整答案后慢慢显示,而是每生成一小段 token 就返回给客户端。
这样用户能更快看到响应,但也意味着:
- 早期输出可能影响后续方向。
- 应用层需要处理半句、半个 Markdown 表格、半段 JSON。
小结
核心结论
推理生成就是“预测一个 token、追加一个 token、继续预测”的循环。temperature、top-p、top-k 等参数控制输出的稳定性和发散度,KV Cache 则用空间换速度。