本地大模型总车轱辘话?两个滑块就能治

在自己电脑上跑本地大模型的人,多半遇到过这样的场景:模型答着答着开始原地打转,同一个意思换四种说法反复讲。多数人的第一反应是模型太小、量化太狠,于是换更大的模型,问题却依旧。

XDA 撰稿人分享了自己的排查过程:元凶往往不是模型,而是设置面板里两个几乎没人动过的滑块——重复惩罚(repeat penalty)与出现惩罚(presence penalty)。二者功能相近却各司其职,网上大量教程把它们混为一谈,反而误导了调参方向。

一、默认值为什么不适合日常使用

本地模型的默认参数多为跑分评测调校,并非为日常对话设计。日常很少人每次都精心挑选示例、配上完整思维链指令。

LM Studio、Ollama、llama.cpp 基于同一核心引擎,但默认参数各自不同。

量化会把问题继续放大。多数人为了塞进显存跑 Q4 或 Q5 而非 FP16,精度一降最先冒头的就是重复和循环,小模型尤其明显。另外 Qwen 倾向过度解释,Gemma 长对话易啰嗦。

二、两个滑块分别管什么

重复惩罚是词元级别的控制,来自 2019 年的 CTRL 论文,作用是惩罚已出现过的具体词元。中性值 1.0,高于 1.0 开始抑制复用。甜区很窄,调到 1.05 或 1.1 通常就能清掉词语层面的循环;一旦推到 1.2,模型可能连「的」这类常用词都开始躲,输出反而古怪。命名上需留意:llama.cpp 称 repeat_penalty,OpenAI 接口最接近 frequency_penalty,Hugging Face 则名 repetition_penalty。

出现惩罚同样作用在词元层,算法却不同。重复惩罚随复用次数加重,出现惩罚是「出现过就扣一次固定分」,出现十次和一次扣得一样多,中性值 0,常见区间 -2.0 到 2.0。它把模型推离刚用过的那批词,换了词往往就换了话题——「同一个观点绕四遍」正源于此,并非模型真在做语义理解,只是好用的词元被耗尽后的副产品。

三、三组实测对照

这位撰稿人用同一条提示词跑了三轮,模型、温度、min-p、系统提示词全部固定,只改这两个参数:「用三种方式解释什么是 REST API:面向新手、懂 HTTP 的人、正在动手实现的人」。

  1. 两项都保持中性:回答表面正常,但 Qwen 犯了老毛病,每个小节都要先把「REST API 是一套规则」重述一遍才进入正题。
  2. 两项都拉满(重复 1.3、出现 1.8):开头尚可,接近结尾时不再生成完整句子,退化成一串地理名词堆砌,只能手动中止。这就是过度矫正——惩罚把合理的高概率词元也饿死了。
  3. 取中间值(重复 1.1、出现 0.6):输出干净的三段式解释,三类读者各自拿到了不同角度。

注意事项

这两个滑块奖励微调、惩罚猛拉。上述数值是在 LM Studio 里跑 Qwen 9B 得出的,只能当起点。温度也会参与其中:处于 0 或 0.1 时模型本就趋于确定,惩罚几乎没有发挥空间,0.6 到 0.8 之间才留有余地。

按任务微调同样重要:写代码时重复惩罚应贴近中性,因为代码本就要重复语法;推理类模型需要更低的出现惩罚;Q3、Q4 这类低精度量化整体宜用更轻的惩罚。模型的 Hugging Face 页面若给了推荐配置,从那里开始最省事。

来源:XDA Developers