采样参数决定模型在「下一个词」的概率分布里怎么挑。模型每一步都会给出 一张候选词的概率表,采样参数做两件事:先砍掉一部分候选,再决定从剩下的里面怎么随机选。 大部分「文风不对」「老是复读」的问题都出在这一层。
最该先动的三个
temperature(temp)
把概率分布拉平或拉尖。低于 1 会让高概率词更占优,输出更稳但更单调;
高于 1 则相反,更有变化也更容易跑偏。它是唯一一个绝大多数场合都值得
先调的参数。SillyTavern 自带的文本补全默认值就是 0.7,
多数模型在 0.7 到 1.1 之间表现合理。
min-p(min_p)
按「相对于最高概率词的比例」砍掉尾巴。设为 0.05 意味着概率低于最高候选
5% 的词全部丢弃。它比 top-p 更适应不同的分布形状,是目前较通用的截断方式。
在模型很确定时(最高概率词遥遥领先),min-p 会自动砍得很狠;在模型犹豫时会放宽。
这正是想要的行为。常用值 0.02 到 0.1。
重复惩罚(rep_pen)
对已出现过的词降权。调高它是处理复读最直觉但最粗暴的办法:它不区分
「不该重复的句式」和「本来就该重复的人名、代词」,压过头会让文字变得别扭。
酒馆的默认值是 1.2,通常在 1.0 到 1.2 之间取值,再往上要谨慎。
其余截断类参数
| 参数 | 做什么 | 说明 |
|---|---|---|
top_k | 只保留概率最高的 K 个候选 | 最粗糙的一种。设为 1 等于贪心解码,会导致逐字复读 |
top_p | 保留累计概率达到 P 的那批候选 | 经典做法,分布很尖时可能只剩一个词 |
top_a | 按最高概率的平方比例设阈值 | 思路与 min-p 相近 |
typical_p | 按信息量偏离度筛选 | 倾向于挑「不过分意外也不过分平庸」的词 |
tfs | Tail-Free Sampling,按概率曲线的二阶导找尾巴 | 较少用 |
nsigma | 按标准差设阈值 | 较新的截断方式;发给后端时字段名可能是 top_n_sigma |
这些参数互相叠加,同时开好几个通常没有好处:每一个都在砍候选,叠起来很容易 砍到只剩一个词,于是又回到了复读。一般只留一个截断类参数生效,其余置于关闭值。
进阶:动态温度、DRY、XTC
动态温度(dynatemp)
让温度随分布的不确定度浮动,而不是固定一个值。你在酒馆里调的是
dynatemp(开关)、min_temp、max_temp 和
dynatemp_exponent;请求发出前,酒馆会把这几个值换算成后端认识的字段
(dynatemp_low / dynatemp_high / dynatemp_range
或 dynatemp_min / dynatemp_max,视后端而定)。
模型确定时压低温度保稳,犹豫时抬高温度求变化。
DRY
DRY(Don't Repeat Yourself)专门对付成串的重复:它检测的是重复的词序列
而不是单个词,因此比 rep_pen 精准得多,不会误伤正常复现的人名。
参数包括 dry_multiplier(惩罚强度,为 0 时关闭)、
dry_base(惩罚随长度增长的底数)、dry_allowed_length
(允许重复的最大长度,超过才开始罚)和 dry_penalty_last_n(回看范围)。
另有 dry_sequence_breakers 用于指定哪些符号算作序列的断点。
处理复读,DRY 通常比调高 rep_pen 更值得先试。
XTC
XTC(Exclude Top Choices)反其道而行:按概率剔除掉部分最高候选,逼模型
选次优解,用来打破套路化表达。由 xtc_threshold(候选需高于此概率才可能被剔除)
和 xtc_probability(剔除发生的概率)控制。用得过猛会明显损伤连贯性。
mirostat
另一套思路:不设固定截断,而是动态调整以维持目标困惑度。由
mirostat_mode、mirostat_tau(目标值)和
mirostat_eta(调整速率)控制。启用它时,通常应关闭其他截断类参数。
调参顺序建议
- 先把所有截断类参数关掉,只留
temp和一个min_p - 调
temp到文风合适 - 如果出现复读,先试 DRY,而不是先加
rep_pen - 确认
top_k没有被设成1 - 其余参数在确有需要时再逐个开,一次只动一个
最后一条尤其重要:同时改三个参数然后觉得「好像好了一点」,是调参最常见的浪费方式。
参数名与默认值可在
public/scripts/textgen-settings.js
中核对。
另外注意:不是每个后端都支持全部参数。端侧模型和各家云 API 支持的子集 差别很大,不被支持的参数会被静默忽略。调了没反应,先确认后端认不认。