采样参数对输出分布的实际影响
调 LLM 参数时,常见做法是把 temperature 从 0.2 改到 0.8,跑一次,然后说“更有创意了”。这种比较没统计意义:单次输出不能代表一个参数配置,也无法区分参数影响与波动。
采样参数真正改变的是候选 token 的概率分布,以及模型从这个分布中选取下一个 token 的方式。要理解实际影响,应固定 Prompt 和模型快照,对每组参数重复调用,观察正确率、格式通过率、多样性、长度和尾部错误,而不是只挑两段看起来不同的文本。
一、从一个 token 的概率分布开始
假设模型在某一步给四个候选 token 的原始概率分别为 0.55、0.25、0.15 和 0.05。temperature 会重新缩放 logits:低温让头部候选更集中,高温让尾部候选获得更多机会。它不是给文本“加创意”的按钮,而是在每一步重新分配选择概率。
| 参数变化 | 分布效果 | 常见输出表现 | 主要风险 |
|---|---|---|---|
| temperature 降低 | 概率向头部集中 | 更稳定、更相似 | 模板化、重复 |
| temperature 提高 | 分布变平 | 措辞和路径更多样 | 偏题、格式漂移 |
| top_p 降低 | 截掉累计概率之外的尾部 | 少选低概率 token | 可能过早排除合理候选 |
| top_k 降低 | 只保留固定数量候选 | 搜索空间变窄 | 不同上下文使用同一 k 过于机械 |
这些变化会在生成过程中累积。第一句只差一个 token,整段回答就可能走向另一条路径。因此不能只看“有多少词不同”,还要看任务是否满足业务约束。
二、temperature 改变集中度,不等于质量旋钮
temperature 较低时,输出更接近最高概率路径,适合结构固定、答案空间窄的任务。但低温不保证事实正确:如果最高概率答案本来就是错的,降低 temperature 只会让错误更稳定。
高温也不自动提升创造力。它只是提高次优和长尾 token 被采到的概率。在品牌文案、头脑风暴中,这可能增加表达多样性;在 JSON、代码补丁和实体抽取中,同样的变化可能表现为字段漂移、无效语法或遗漏约束。
所以温度应跟验收方式绑定:能自动校验的开放任务可以适度增加探索,并让校验器筛选;无法自动验证的高风险任务,应优先稳定输出,并通过检索、工具或人工复核提高正确性。按任务选温度的速查建议可参考 按任务类型设置 LLM temperature 速查表,本文重点放在如何验证这些建议。
三、top_p 与 top_k 的差别在候选集合
top_p 采用 nucleus sampling:把候选按概率从高到低排列,保留累计概率达到阈值所需的最小集合。模型很确定时,集合可能很小;模型犹豫时,集合会自然扩大。top_k 则始终保留固定数量的候选,不管它们合计覆盖多少概率。
top_p 更能随上下文不确定性变化,top_k 则容易解释候选上限。不同 API 对 top_k 的支持、范围与默认值可能不同,跨供应商迁移时不能假设同名参数产生相同分布。
另一个常见错误是同时剧烈调整 temperature 和 top_p。两者都会改变采样空间,一次改两个变量后,即使结果改善,也不知道是谁起作用。建立基线时先保持厂商默认值,只调整一个参数;确有数据证明需要组合时,再做二维网格实验。
四、seed 只能帮助复现,不能保证绝对一致
部分模型接口提供 seed,让相同输入和参数更可能复现同一路径。它适合调试与回归测试,但不是跨时间、区域和模型版本的确定性承诺。服务端实现、模型快照和安全策略变化都可能让结果出现差异。
测试记录至少应包含完整模型标识、Prompt 版本、采样参数、seed、请求时间和系统指纹(如有)。只保存最终文本,很难解释同一测试为何变化。
对于要求确定性的结构化任务,还应使用 JSON Schema、枚举约束和业务校验,而不是把希望全部放在低 temperature 与固定 seed 上。具体双层校验方法见 LLM 输出验证:schema + 业务规则双层防护。
五、重复惩罚会同时影响啰嗦与术语一致性
frequency penalty 通常根据 token 已出现次数降低其后续概率,presence penalty 更关注“是否出现过”。它们可以减少循环和措辞重复,但也可能伤害代码、表格、法律条款和专有名词,因为这些任务本来就需要重复相同标识符。
看到输出重复时,先判断是采样分布过窄、Prompt 重述、上下文重复,还是生成循环。直接提高惩罚可能压下表面重复,却引入变量改名、字段不一致或同义词漂移。
应把重复率拆成可接受重复与异常重复。例如 JSON key 多次出现是结构要求,连续 n-gram 大段复现才可能是问题。惩罚参数也应与停止条件、输出长度和后处理去重一起评估。
六、设计一次可复现的重复采样实验
准备 50–200 条代表性 Prompt,覆盖短问答、长上下文、边界输入和容易失败的样本。每个配置对每条 Prompt 重复采样多次,并确保并发、超时与重试策略一致。示意代码如下:
configs = [
{"temperature": 0.0, "top_p": 1.0},
{"temperature": 0.4, "top_p": 1.0},
{"temperature": 0.8, "top_p": 1.0},
]
for prompt in dataset:
for config in configs:
for run in range(10):
result = call_model(prompt, **config)
save(
prompt_id=prompt.id,
config=config,
run=run,
text=result.text,
usage=result.usage,
latency=result.latency,
)
指标至少包含任务正确率、schema 通过率、输出长度、延迟、token 成本和人工偏好。多样性可计算不同答案比例、n-gram 重合度或语义距离,但不能把“差异更大”直接当成“质量更高”。
七、从分布数据选生产参数
选择配置时不要只看平均分。结构化抽取的平均正确率可能相近,尾部失败却相差很大;创意任务的偏好更高,也可能产生更多不可发布内容。决策应同时看尾部失败、重试成本和人工修正时间。
可靠流程是:先用低随机性配置建立基线,再逐步扩大探索范围;每次只改一个变量;对差异重复抽样;最后用小比例真实流量验证。模型版本更新后应重跑数据,不能沿用旧版本的“最佳温度”。
即使供应商不返回 logprobs,也可通过重复结果的类别分布观察变化。重点是测出参数对业务验收指标的影响。