🌟深入理解 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、采样次数、停止条件,
你就能让模型输出朝着你想要的方向走。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐