只有你
一个小型开源模型,在 MacBook Air 上微调而成,写作时不使用破折号、"不是 X,而是 Y" 或三连列表,也不需要系统提示词,你可以在本地用 Ollama 运行它。
简要说明
- 我把助手式的写作习惯从 Qwen3-4B-Instruct 中训练掉了,并将其发布为qwen3-4b-deslop。用 Ollama 运行它只需
ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M,下载大小 2.5 GB。 - 在 40 个训练中从未见过的提示词上,废话评分从每 1000 词 121 降到 12.5,68% 的回答得分落在人类写作的区间内。破折号从每 1000 词 20.5 降到零。
- 它仍然能正确回答 30 道事实性问题中的 30 道,并且在符合要求的体裁和长度方面与原模型一样频繁。它对人类撰写散文的预测变化幅度约为运行时引导的三分之一。
- 一个中间版本得分为 9.9,但写得很糟:没有观点的评论文章、编造的研究,以及一种新习惯——用 ", which" 连接每一个句子。修复这个问题需要第二个过滤器,用来检查回答是否做到了提示词所要求的事。
- 文风平实到近乎平淡,而且它仍然会编造人名和地名。
我的家庭实验室是一台 MacBook Air,所以这是一个在 161 个回答上训练的 4B 模型。这套方法不依赖于模型规模,在更大的模型上运行是下一步。
在 40 个留出提示词上的回答
这些是每个提示词从原模型和发布模型中各采样一个回答,涵盖四个体裁下的十个主题,不使用系统提示词。带下划线的段落是废话检测器所统计的内容。
主题
原始 Qwen3-4B-Instruct
去废话版
废话评分
该评分来自我根据一份 AI 写作习惯风格指南编写的检测器:破折号、"不是 X,而是 Y"、三连列表、自问自答的反问句、像 "here's the thing" 这样的路标语、用于强调的短碎片,以及 "delve" 和 "seamless" 这类词。每种习惯都有一个权重,评分是每 1000 词的加权计数。一位细心的真人写作者所写的段落得分接近零,而原模型平均为 121。
正则表达式无法分辨好文章和坏文章,因此下面每个模型也都做了损伤检查。漂移度衡量的是它在 22 段人类散文上的预测偏离原始模型的程度。一份 30 题的测验检查它是否仍然掌握知识,而一项基于规则的检查会标记出损坏的输出,比如句子以小写字母开头或丢失主题。我还阅读了每个模型的一部分回答样本。
训练方法
一个更早的实验在这个模型上发现,助手语域是模型内部的一个方向:在模型写作时减去它,再配合一个平实风格的系统提示词,可以把分数降到约 15,但这需要在生成过程中运行提示词和代码,而且它会改变模型对普通文本的预测。第二个实验逐个读取神经元,发现四个神经元一旦翻转符号,就能以几乎零成本消除 70% 的“不是 X,而是 Y”,不过只对这一个习惯有效。
为了把两者都写进权重,我用了蒸馏:一个教师模型由目前效果最好的各种方法构建而成,回答 288 条训练提示词。我保留通过检查的回答,让一个小型 LoRA 适配器学会从裸提示词生成这些回答。第一轮在无提示词、无钩子的情况下把分数降到了约 20。
第二轮
第二轮中,教师模型是第一轮模型加上四神经元补丁和平实风格提示词。再叠加方向引导后,产生了我所测到的最低分数 9.5,但文本没有大写字母且偏离主题,所以我把引导撤掉了。教师模型随后平均为 7.4,而用它最好的 171 条回答训练出的学生模型得分为 9.9,其中 80% 的回答落在人类范围内。
在它的回答中,一篇关于某公司新 CRM 的评论文章始终没有表明立场,读起来像一份事故报告。一篇关于搬去新城市的博客文章变成了一个关于一家人公寓漏水问题的第三人称故事。一篇关于室内植物的文章引用了“悉尼科技大学的一项研究”,而这项研究是模型编造的。几乎每个句子都用“, which”或“, so”与下一句连在一起,频率是原始模型的 28 倍。最后这个习惯来自我自己的教师提示词,它曾让模型用“because、so、but、which”连接句子,而两轮模仿把它放大了。
任务契合度检查
我添加了基于规则的检查,用来判断回答是否完成了提示词所要求的事情。评论文章必须尽早表明立场,个人反思必须用第一人称,邮件必须以问候语开头,长度必须大致符合要求。另外两项检查统计“, which”和“, so”连接以及编造的研究和百分比。在这些方面,第二轮模型只有 60% 的时候做到了要求,而原始模型为 78%。
第三轮
第三个教师模型得到的提示词把任务放在首位:被要求时表明立场,涉及个人内容时用第一人称写作,变化句式,不要编造研究或名字。它对每个提示词写三个回答,只有得分低于 12、通过损害检查并通过所有任务检查的回答才会被保留。大约 30% 的回答通过了,覆盖了 288 个提示词中的 161 个。
用这些回答训练出来的模型就是发布版。它的得分略有上升,从 9.9 升至 12.5,而任务契合度回升到 80%,“, which”连接从每 100 词 1.4 次降至 0.3 次。编造的研究和百分比几乎消失了。
下载与使用
量化版本(Q4_K_M,2.5 GB)可在笔记本电脑上通过 Ollama 或 llama.cpp 运行:
ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
llama-cli -hf erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
全精度权重可像任何 Qwen3-4B 检查点一样用 transformers 加载:
from transformers import AutoModelForCausalLM, AutoTokenizer
name = "erikkannike/qwen3-4b-deslop-v4"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, torch_dtype="auto")
msgs = [{"role": "user", "content": "Write a LinkedIn post about switching to a four-day week."}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
out = model.generate(ids, max_new_tokens=300, do_sample=True, temperature=0.7)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
仓库里也有单独的部分:LoRA 适配器(126 MB)和神经元编辑,后者是一个 175 字节的列表,包含四个权重列及其缩放系数。适配器是在编辑生效的情况下训练的,所以两者要一起使用。
局限
声音平淡:模型会写出一连串简短的陈述句,它的个人化文章读起来像日记。
它仍然会编造内容:如今研究和百分比已很少见,但虚构的人名和地名很常见,比如 Maple Street 上一家由名叫 Maria 的女人经营的咖啡店,因为每一轮训练奖励的都是具体细节。它还会写得很长,要求“约 150 词”的回答常常接近 200 词。
我只在这些体裁中测试了简短的英文散文。代码、长对话、其他语言和工具使用可能不比原始模型更好,甚至更差。评分标准是我用正则表达式写成的风格指南,目前还没有与读者进行盲测来检验它。数字在不同运行之间也会变化:同一个模型通过适配器评分为 10.2,作为合并权重评分为 12.5,这仅仅来自采样差异。
后续步骤
每个学生模型最终都与其教师能写出的最佳答案差不多好,所以更好的模型需要更好的教师。我正在整理一套优秀的人类写作,包括公共领域的散文和书信以及现代作品,用作基础模型的示例。基础模型从未经过助手训练,仍然像它学习的人那样写作。如果那位教师写得比这个模型更好,同样的配方应该能培养出一个既有品味又有良好习惯的学生。之后是在一个 7 到 8B 模型和一个约 30B 模型上运行同样的流程,并进行一次由人们挑选更好文本的盲测。
方法说明与注意事项- 基础模型:bf16 的 Qwen3-4B-Instruct-2507。每个适配器都是应用于所有注意力和 MLP 投影的 rank-16 LoRA,在仅含用户提示的输入上训练两个 epoch,损失只计算在回复上,每轮在 M2 MacBook Air 上耗时 1 到 3 小时。
- 测试集:十个从未用于训练的主题,每个主题四种体裁(博客文章、LinkedIn 帖子、解释性文章、观点文章),每个提示在温度 0.7 下采样一个答案,不使用系统提示。漂移是相对于原始模型在 22 段人类散文上的 KL 散度。
- 任务契合度检查是一些简单规则(观点文章开头附近的立场词、反思中的第一人称代词、邮件中的问候语、字数),它们会漏掉读者能察觉到的东西。训练数据是用这里报告的相同检查过滤的,所以任务契合度数字在一定程度上美化了模型。
- 神经元编辑翻转四个 MLP 神经元的符号(第 32 层神经元 4852、第 33 层神经元 348、第 28 层神经元 1121、第 32 层神经元 5418),这等同于将其所在层下投影权重的四列取负。GGUF 构建是从合并权重的 Q8_0 转换量化而来的。
- 读者的聊天和实时光标通过 WebRTC(Trystero 配合公共 Nostr 中继)直接连接读者。对等方可以看到彼此的 IP 地址,不会保存任何内容,"隐藏"会断开你的连接。