阅读《AI Engineering》笔记09 为什么大模型的回答不是固定的
Sampling 决定了:模型会不会“胡说八道”输出是创意还是稳定同样 prompt 得到的答案会不会变化模型生成的效率和速度多样性 vs 可控性如何平衡Sampling 是大模型“性格”的调节器。如果你能熟练调教 temperature、top-k、top-p、采样次数、停止条件,你就能让模型输出朝着你想要的方向走。
🌟深入理解 Sampling:为什么大模型的回答不是固定的?
很多同学第一次接触大模型(LLM)时都会问:
“同样的问题,我每次问到的答案怎么还不一样?”
“模型为什么会乱说?怎么控制它稳定一点?”
答案就藏在一个核心机制里:Sampling(采样)。
本文你将读懂:
-
sampling 是怎么让模型的输出“充满随机性”的
-
temperature、top-k、top-p 到底是调什么
-
为什么温度越高模型越“飘”
-
怎么通过采样多次来提升模型输出
-
为什么有时模型“胡说八道”(hallucination)
1️⃣ 为什么需要 Sampling?
先看一个基础认知:
语言模型不是在“选择答案”,而是在“按照概率抽卡”。
比如输入一句话“我最喜欢的颜色是……”,
模型在生成下一个词时,会给所有可能的 token(“红”“绿”“蓝”……)一个概率分布:
-
green:50%
-
red:30%
-
purple:10%
-
……
如果你让模型每次都选择最高概率的词,那叫 greedy sampling(贪心采样),
结果就是:
➡️ 输出乏味、重复、毫无创意。
所以,LLM 更常用的是:
按照概率随机抽一个下一个 token。
这就是 sampling 的根。
2️⃣ Sampling 是如何计算的?
模型输出的不是概率,而是 logits(原始分数),例如:
[1, 2] # A 的 logit 是 1,B 的 logit 是 2
logits 不能直接用,需要用 softmax 转化为概率:
softmax([1, 2]) = [0.27, 0.73]
但为了控制输出风格,我们可以在 softmax 前对 logits 做一些“手脚”——也就是各种 sampling 策略。
3️⃣ Temperature:最常用也最好理解的控制器
Temperature = 控制模型“胆子大小”的旋钮。
公式:
logits / T
效果非常好记:
| 温度 | 效果 |
|---|---|
| 低温(0–0.4) | 输出稳定但无聊,偏官方、机械 |
| 中温(0.7–1.0) | 正常对话的最佳范围 |
| 高温(>1.0) | 更有创意,也更容易胡言乱语 |
例如:
原 logits:
A = 1,B = 2
softmax → A: 0.27,B: 0.73
温度 = 0.5:
A: 0.12,B: 0.88 # 越低越保守
温度 = 2:
A: ↑,B: ↓ # 小概率 token 会被放大,更随机
👉 这就是为什么写诗要用高温度,
而写 SQL、写代码时一定要用温度 0。
4️⃣ Top-k:只在最可能的 k 个词里抽
如果模型的词表有 10 万个词,每次都 softmax 很贵。
于是出现 top-k:
✨ 只在概率最高的前 k 个 token 中软最大化
常见 k:50 / 100 / 200
效果:
-
k 小:更稳定,但可能缺乏想象力
-
k 大:更自由,但也更不可控
5️⃣ Top-p(Nucleus Sampling):比 top-k 更智能
top-k 是固定数量
top-p 是固定“累积概率”
比如设 p=0.9:
模型计算所有 token 的概率,从最高往下累加:
token1:40%
token2:30%
token3:15% # 累计 = 85%
token4:5% # 累计 = 90%(到 p=0.9 了,停止)
👉 只在 [token1, token4] 中采样。
它的优点:更智能地适应不同场景。
例如:
-
“只回答 yes 或 no” → 只会留下 2 个 token
-
“写一首诗” → 留下几十甚至上百个 token
因此 top-p 是许多默认设置的首选。
6️⃣ 多次采样(Test Time Compute):提高质量的最有效方法之一
一个简单但非常有效的策略:
“同一个问题,让模型回答多次,然后挑最好的那个。”
例如让模型生成 5 个回答,可以通过:
-
选平均 logprob 最高的
-
选 reward model 得分最高的
-
让用户挑
-
选最短 / 最长
-
选语法合法的(如 SQL、JSON)
Google 在评估 Gemini 时,
对每个 MMLU 题目采样 32 次输出,选择最常出现的答案。
结果分数直接提高。
这也叫 self-consistency(自洽投票)。
7️⃣ 为什么多采样并不能无限提升?
OpenAI 做过实验:
-
采样数从 1 增加到 400 → 性能先上升后下降
-
采样过多反而容易采到“对 verifier 有欺骗性”的坏样本
另一边 Stanford 的 Monkey Business 论文又发现:
-
性能随着采样数量增加呈 对数线性增长,甚至到 10,000 也能进一步提升
但现实中:
💡 没人会为一个输入采样 400 次,更不会采样 1 万次。太贵了。
8️⃣ 停止条件(Stopping)
生成太长会:
-
花钱
-
慢
-
用户不喜欢
所以常见做法:
-
限制最大 token 数
-
设置 stop 字符,例如
"```", "</json>" -
使用 end-of-sequence token
但注意:
❗生成 JSON 时截断会导致缺失括号,很难解析
❗生成代码时过早停止会生成残代码
9️⃣ 总结:Sampling 影响一切
Sampling 决定了:
-
模型会不会“胡说八道”
-
输出是创意还是稳定
-
同样 prompt 得到的答案会不会变化
-
模型生成的效率和速度
-
多样性 vs 可控性如何平衡
一句话总结:
Sampling 是大模型“性格”的调节器。
如果你能熟练调教 temperature、top-k、top-p、采样次数、停止条件,
你就能让模型输出朝着你想要的方向走。
更多推荐


所有评论(0)