top_p 是什么
核采样(top_p)在每步生成时,把候选词按概率从高到低累加,只保留累计概率刚好超过阈值的那一小撮词,再从这个小集合里采样。p 等于 1 相当于不裁剪,p 越小候选集合越窄。它和温度的作用点不同:温度改变分布形状,核采样直接砍掉长尾。常见取值落在 0.9 到 0.95 之间。
基本信息
| 适用平台 | OpenAI 兼容接口、vLLM、Transformers、llama.cpp 等同名参数 |
|---|---|
| 取值类型 | 0 到 1 的浮点数,1 表示不裁剪 |
| 常见取值 | 0.9 至 0.95 为通用起点 |
| 与温度关系 | 两者叠加调节随机性,一般只动其中一个 |
| 默认行为 | 各实现默认值不同,迁移后要核对 |
取值参考
| 取值 | 效果 | 适用情形 |
|---|---|---|
| 1.0 | 不裁剪,长尾词也有机会 | 需要多样性的创作场景 |
| 0.95 | 轻微裁剪,兼顾自然与稳定 | 常规问答与摘要 |
| 0.9 | 常用起点,长尾基本被切掉 | 通用对话服务的默认配置 |
| 0.8 | 候选明显收窄 | 结构化输出与短答 |
| 0.5 及以下 | 候选极窄,易重复与崩坏 | 仅在特定受控任务中尝试 |
典型使用场景
- 通用对话服务:用 0.9 搭配中低温度,稳定与自然兼顾
- 结构化输出:收窄到 0.8 左右,减少格式跑偏与多余改写
- 创作类功能:放宽到 1.0,把多样性交给采样而不是重复提问
- 跨引擎迁移:自建服务的默认值与云 API 不同,迁移后固定参数再回归
- 排查重复输出:先把核采样收窄或放宽做对照,确认是否采样参数导致的复读
vLLM 离线调用示例
vLLM 离线调用示例
from vllm import LLM, SamplingParams
# 采样参数集中声明,便于对比实验
sp = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=256)
llm = LLM(model="/models/Qwen")
outs = llm.generate(["用一句话解释什么是 KV 缓存"], sp)
print(outs[0].outputs[0].text) # 检查输出是否连贯、无复读top_p 与温度同时大改会让效果无法归因:调试时每次只动一个参数,并用固定测试集对比输出。
核采样阈值调得过小会把低概率词变相放大:候选集合被压到极窄后,少数错误候选反而更容易被选中,表现为重复与语句崩坏。