跳到主要内容
一句话搞懂:你调的那些采样参数,到底在调什么

一句话搞懂:你调的那些采样参数,到底在调什么

阿简
阿简

· 阅读约 5 分钟

同一个 prompt,同一个模型,隔半小时再跑,结果不一样。

很多人先怀疑自己 prompt 写得不稳。

不是。模型每次吐给你的不是一个字,是词表上的一整个概率分布。后面那堆参数,全在回答同一件事:这个分布里,你信哪一部分。

先讲 temperature。它被高估了。

做法不复杂,logits 除以 T,再 softmax。T 小于 1,分布变尖;大于 1,分布变平。原文那个例子挺好:原本 4:1 的偏好,T=2 时变成约 2:1,T=0.5 时变成约 16:1。

麻烦在于它是整体缩放。它分不清"这是个合理的备选"和"这是长尾里的噪声",一视同仁地放大压小。所以温度调低治不了重复。分布压得再尖,尖的那个也可能就是错的。

长尾谁来管?截断。

top-k 是最早的答案:按概率排序,只留前 K 个,重新归一化再采。简单,够用。

毛病一句话能说完:K 是固定的,模型的不确定性不是。模型很确定的时候,你还留着 40 个候选,里面就混着荒谬的。模型很不确定的时候,40 个又不够,合理的备选被你关在门外。

top-p 换了思路,按累积概率截,取达到 p 的最小集合。分布集中时核小,分布分散时核大,候选集跟着模型的不确定性走。Holtzman 那批人 2019 年的工作,就是从这儿把"最大似然适合训练、不代表适合生成"讲清楚的。

到这儿都还是常识。

下面这条才值得说。

多数人以为 top-k 和 top-p 一起设,等于取交集。不对,实际比交集更紧。

评论区有位 Vinh Nguyen 做了个手工验证。他在一个合成的 Zipf 尾部上重实现两个 warper。单独 top_p=0.9,保留 93 个 token;单独 top_k=50,保留 50 个。按 transformers 里实际的顺序一起开,只留 29 个。

原因不复杂。top-p 不是在原始分布上算累积概率,它是在 top-k 已经筛过的 scores 上再 softmax、再 cumsum。top 50 里握着 81.5% 的质量,这 81.5% 里的 90% 对应真实分布的 73.5%。所以两个一起开,有效 top_p 差不多是 0.735,不是你以为的 0.9。

他自己标了边界:合成分布、手工重实现、读的是 main 分支、没跑 generate。这个边界标得好。愿意把"我这结论撑到哪一步"写出来的人,说的东西才值得抄。

所以参数调不明白,多半不是不懂单个参数,是不知道它们排队的顺序。

一条典型流水线是这样:先做 repetition penalty 之类的 logit 调整,再 temperature 缩放,然后 top-k / top-p / min-p 过滤,重新归一化,采样,追加 token,回到模型。顺序变了,结果就变。

顺手说个符号陷阱。经典那版 repetition penalty 对出现过的 token 做乘性调整:正的 logit 除以 penalty,非正的乘 penalty,penalty 不小于 1。6.0 在 1.2 下变成 5.0,-6.0 变成 -7.2。

你要是图省事,把所有 logit 都除以 1.2,-6.0 就变成 -5.0。本来想压它,结果把它抬上去了。

这参数还有个更麻烦的地方:它 token 盲目,不看你重复的是不是该重复。JSON 和 Python 里本来就该反复出现同样几个 token,一刀切下去容易坏事。它更适合打断病态循环,不适合拿来追求普遍的多样性。

顺便算笔账。一个月 100 万请求,每请求 500 个输出 token,就是 5 亿输出 token。只要有 2% 因为循环或者下游检查失败重生成,一个月多出 1000 万输出 token。坏输出要是还触发工具调用、重试、多步 agent 循环,账还得往上翻。生产环境里调这玩意儿的目标不是"生成得好看",是在成本、延迟和失败率这三条约束下把任务做成。

min-p 我先放一半。

它用最佳 token 的概率 P_max 定阈值,保留不低于 min_p * P_max 的 token。P_max=0.60、min_p=0.1 时阈值是 0.06;P_max=0.12 时阈值掉到 0.012。听起来比 top-p 更会看情况,原论文报的质量 / 多样性权衡改善也挺好看。但 2025 年有过一轮批判性再分析,挑战了其中一部分结论。这个我没吃透,先放在这里,想明白再补。

那到底用哪个。

我的看法是别堆。要么只用一种截断,要么就把 top-k 关掉。同时开两个,你调的是它们的乘积,还是你没看见的那个乘积。

起点可以这么定:temperature 从 1.0 起,再挑一种截断方式,只有真的观察到重复时才加 repetition control。创意写作 T 大概 0.8 到 1.1、top_p 0.9 到 0.98;确定性抽取 T 用 0 到 0.3;代码同样 0 到 0.3、repetition penalty 保持 1.0。原文说这不是定律,我觉得也是。

这几个参数不改变模型本身。它们只改变你允许模型从哪个范围里挑下一个 token。

所以调参不是调音色,是决策。你在替它决定信谁。

本周就这些。

上面有任何一条你试过、或者觉得我讲错了,欢迎告诉我。讲错的我补,没讲清的我改。

下周见。

阿简
阿简

每周替你把 vibe-coding 圈的大事筛成一张小抄,被讲玄的概念一句话搞懂。

查看主页 →