AI 见闻
精选· 重要性 3/5

微调LLM写出90年代风格的技术文档

Hacker News (AI)··taubek·约 8 分钟阅读
Hacker News 190
中文导读

作者通过微调开源LLM,使其模仿80-90年代技术写作风格,验证了风格迁移的可行性,并展示了低成本实现本地化、专业化模型的可能性。

对LLM进行微调,让其像1995年一样编写文档在我对2030年的预测中,我写道技术作家将使用专门的LLM,在强大的硬件上本地运行。我在工程专家中看到了向“本地优先”转变的迹象,但我们还没有做到这一点,部分原因是前沿模型的能力要强大得多。

但这并不意味着我们不能进行实验。这正是我上周所做的:尝试微调一个指令模型,使其像80年代和90年代的软件技术作家一样写作。召唤旧技术写作知识进行研究要训练一个个人本地模型像90年代的技术作家一样写作,需要大量的书面资料。

例如,如果我想微调一个模型使其像我一样写作,这个博客还不够,因为写这篇文章时它只有不到10万字。你需要更多样本进行彻底训练,而这些样本既不容易获得,也不容易生成。唯一的快速方法是使用现有语料库。

我从哪里能找到呢?认识一下Bitsavers:这是一个收集和扫描旧计算机手册和小册子的网站。它是一个极其宝贵的计算机历史和古代技术写作知识库,到处都有镜像。由于我喜欢90年代的微软手册,我选择了微软系列作为训练材料的来源。

该合集包含1977年至2005年间出版的绝版文档:超过3700万字,涵盖旧系统和SDK。

我下载了OCR文本文件,并用老旧的Python脚本清除了内容中的伪影和杂乱(如索引和前言)。然后,我通过OpenRouter使用了一个便宜且快速的模型gemma-4-26b,根据每个段落的可理解性将其分类为“保留”或“删除”。

这第二轮处理花费了大约8美元。不过,即使经过两轮清理,训练数据中仍保留了一些我后来才发现的噪声,但这对于我的测试来说基本可以接受。我将净化后的文本按段落和章节边界分割,在标题处断开,并保持代码块完整,根据Claude的建议,每个块的上限约为512个token。

每个块都与从模板生成的合成指令配对。我最终得到了192,456个JSONL格式的样本(每行一个JSON对象)。我本可以用一个小模型来生成更好的指令和问题,但我没有耐心。

微调作为从头训练的替代方案在理想世界中,我会有几百万美元闲置,随时可以烧掉来创建我自己的LLM——Fabrice。由于我远非富有(否则我不会写这篇文章),Fabrice的替代方案是微调,即调整模型的“权重”,使每个生成的token都受到训练材料的约束。

我喜欢把微调想象成用拖船稍微改变一座巨大冰山的轨迹;只需一点点,就能达到预期效果。为什么选择微调而不是检索增强生成(RAG)?因为在这个实验中,我主要不是对检索事实感兴趣(那是RAG擅长的场景),而是让LLM以特定风格表现和写作,无论它对上下文了解多少。

与完整训练相比,微调不需要大量数据,因此更便宜。另外,只是因为:我一直想尝试微调这种技术,看看它有多可行。

为了避免花几天或几周时间在我那显卡相当旧的电脑上微调模型,我使用了Runpod,这是一个面向AI开发者的在线服务,以(相对)低廉的价格提供预配置GPU和工具的按需pod。例如,每小时不到6美元,你就可以租到一张性能强劲的Nvidia B200显卡(192GB内存)。

该服务有一个方便的API,带有可配置的自动充值和成本控制机制。进入一个充满神秘流行语的世界在决定微调一个模型后,我向Claude咨询了最合理的方法。

我们选择了QLoRA(量化低秩适配),它不是通过改变LLM的每个权重来实现微调,而是“冻结”它们并在上面添加一个适配器,这是一个重塑模型行为的小文件(可以理解为一种掩码)。

QLoRA中的Q意味着结果是量化的,即压缩的,从而减少了内存需求。你还跟得上吗?很好。如果你觉得这很复杂,那是因为它确实如此。如今在家用LLM做任何事情都是一种妥协:你要么牺牲时间,要么花钱,要么限制你雄心勃勃的目标。

我试图找到平衡,在不到一个周末的时间里得到一些有意义的结果。我选择尝试微调两个模型:Llama 3.1 8B Instruct和Qwen 2.5 7B Instruct。它们的大小(约8B)可以在MacBook Air上舒适运行。

我还测试了一个Llama基础模型(它没有经过回答问题的训练)。我在几种不同条件下测试了微调:改变训练材料的量(子集 vs 完整语料库)、训练轮数(epochs)以及秩等结构参数。我对这些只有肤浅的了解,但我相信我的代理会做出正确的选择,而我则乐于在每一步提出质疑。

例如,在某些情况下,3个epoch可能导致“过拟合”;在LLM的世界里,这意味着过度训练。有趣的时光。适配器只能应用于你微调的目标模型。

训练每个适配器后,我将它们导出到我的笔记本电脑,转换并量化为GGUF LoRA文件,然后将其注册为本地Ollama模型,以便在笔记本电脑上运行进行基准测试。

本地转换方法速度更快,且不需要GPU,尽管推理速度比完全合并的模型稍慢。对于手头的测试,我不太关心速度。在所有条件下训练适配器大约花了一整天时间,包括休息时间,总费用为50美元。

在此过程中,我丢失了两个适配器:Runpod对预算毫不留情,一旦资金为零就会立即删除pod(这是一个教训,是的)。Claude负责设置每次运行并跟进Runpod的API。

Claude Code的/goal命令对于循环每个阶段非常有帮助(回想起来,我会在YOLO模式下运行它)。下表显示了我比较的所有模型及其条件:微调后风格是否发生了迁移?我对每个模型都使用了相同的提示:- 记录malloc(),一个C语言核心函数,训练材料可能了解它。

- 记录一个虚构的ConnectWifi() Win32 API函数。训练材料中没有出现。- 以1990年代微软风格解释什么是REST API(时代错位测试)。你可以在该要点中看到所有问题和答案。

对于malloc()测试,未修改的模型生成了现代Markdown文档,风格类似README,而微调后的模型使用了符合时代的结构,包含Synopsis块、Return Value部分等。

对于虚构的ConnectWifi()函数,只有3个epoch的模型保持了虚构,并将其记录得像真的一样,而其他模型则打破了第四面墙,坚持内部知识并抵制训练。REST API测试也相当有趣:Llama Instruct 40k失败了,产生了平淡的营销散文。

Claude将此归因于Llama为了使其友好易用而经历的强化训练(RLHF)。Qwen微调模型更好地保持了语域,生成了符合时代结构的文档,使用HTTP方法名称作为动词和正式标题。Qwen 192k是最强的,开头就像Windows 2000 Resource Kit的一章。

让我重复一遍:一个7B模型,在1990年代的文档上训练,并在2000年代的概念上测试,产生了一个令人信服的章节开头,可能被误认为是真正的时代材料。风格迁移了。哇。另一方面,基础模型...

原文出处
Fine-tuning an LLM to write docs like it's 1995

本文为机器翻译辅以 AI 润色,仅供参考。原始事实以原文为准。

相关阅读