一、环境
运行工具llama.cpp,机器配置i5,8GB内存,无显存。
模型Qwen3.5-0.8B.Q8_0.gguf,主要使用3款量化模型
a. unsloth 量化后的gguf Q8
b. unsloth 使用dynamic quant动态量化技术Q8 gguf
c. 使用了opus 4.6蒸馏数据微调的Q8 gguf
效果最好的是opus 4.6蒸馏数据微调的Q8 gguf。
二、任务
使用0.8B的参数llm,目标是处理短文错字、语法错误问题。
提示词示例
python
你是一个严谨的文字校对助手。请对用户输入的句子进行纠错且不能改变原意。
工作流程:
内部思考:请将具体的推导、语法规则分析、逻辑辨析全部写在 <think> 标签内。
正式输出:在标签外,严格按照以下格式输出,不要有任何开场白:
【错误点】:[简要列出错别字或语病]
【修正句】:[给出最终纠正后的纯文本句子]
示例:
输入:他走过来拿起一跟笔。
最终输出:
<think>
"一跟笔"中"跟"是量词错误,应为"根"。
</think>
【错误点】:量词误用,"一跟笔"应为"一根笔"。
【修正句】:他走过来拿起一根笔。
待处理文本:
发现问题:
1)当前验证在系统提示词中加入输出格式约束,时常会出现失效,输出并不会完全准从要求。
2)无限思考,偶发出现模型无限思考。
三、处理
1)由于参数量极小,模型在本质上缺乏复杂的逻辑遵循能力和长序列指令保持能力。
0.8B 模型的参数量进入<think>阶段时,消耗大量的注意力权重在描述错误上,输出【修正句】时,其 KV Cache(记忆)中已经充斥了大量的推理文字,导致模型由于上下文窗口内的注意力稀释,忘记了最初要求的格式。
把模型的推理模式关闭使用参数"-rea off",并缩减提示词减掉身份、思考说明
bash
对用户输入的句子进行纠错且不能改变原意。
示例:
输入:他走过来拿起一跟笔。
最终输出:
【错误点】:量词误用,"一跟笔"应为"一根笔"。
【修正句】:他走过来拿起一根笔。
待处理文本:
2)对于之前的思考重复循环,是因为参数量低,逻辑推理能力弱,推理过程中陷入局部最优无法跳出。
开始修改运行参数调高了repeatition_penalty=1.5 或者2,但是情况没有好转, 之后又调整了frequency_penalty。这些参数并没有被正确的使用,反而可能加重模型进入死循环。原因是纠错任务与对话任务有一个本质区别是高度的文本重叠。 直接对已经出现过的 Token 的概率进行**倍数削减,**对于 0.8B 这种逻辑脆弱的模型,会因此感到困惑,转而寻找概率稍低但没出现过的词为躲避重复开始胡言乱语,导致格式崩溃。frequency_penalty根据 Token 出现的次数线性增加惩罚,比repeatition_penalty更温柔,但是效果是一样的。不设置重复惩罚会更加适合小模型。
3)对于任务特性是规范的纠正原文语病、错字,并非需要多样性的文本创作,所以更应该考虑降低temperature 至 0.1 - 0.2,提高确定性并把 Top-p 降至 0.4 - 0.5,提高生成的严谨与确定性。
4)辅助手动
a. 设置最大的上下文数量,出现重复循环超上下文直接终止
b. 开启logit bias,对特定符号给出更高的生成概率,例如"】"符号出现概率提高,引导贴近格式。
c. 添加停止符,提前终止生成
- 使用更大参数的模型
测试qwen3.5 2B Q4 gguf量化模型效果体感并0.8B Q8 gguf量化差点,主要原因是模型参数量都很小在量化后精度的损失导致模型能力减弱,量化越重能力降低更多,所以导致高参数可能比低参数表现更好。 对于几十上百B大参数模型却又相反,因为模型有非常深的网络层具有更强的容错能力。
低配置的纯cpu环境可以使用max_context参数降低上下文数量,降低模型运行占用的内存,这样会有更多稍大参数的模型选择。
gguf模型运行一个比较粗略的估计是Q8模型用参数量乘2.5,在不设置上下文大小的情况。