大语言模型(LLM)的微调,现在已经成了很多项目里的关键一步。通用模型能力很强,但落到具体场景时,往往还需要再'调教'一下。这篇文章整理了我对微调技术的理解,包括什么时候该用、主要的方法,以及一些实践中的取舍。
LLM 项目里的几步走
在聊微调之前,可以先看一个典型的 LLM 项目是怎么推进的。虽然每个团队的做法有差别,但大致绕不开这几件事:
- 定目标:一开始就得想清楚,这个模型是用来做通用助手,还是只解决一个特定任务(比如医疗报告生成)。目标越清晰,后面越省力。
- 选模型:从零训练一个新模型还是基于已有的模型来改?大部分时候,直接用现成的预训练模型做适配会高效很多,但也有一些场景值得从零开始。
- 性能与调整:拿到模型后先跑一跑,如果效果不达预期,先试试提示工程。还不够?那就考虑微调。整个过程里,要注意让模型的输出和人的偏好对齐。
- 评估与迭代:用指标和基准持续评估,然后在提示工程、微调和评估之间来回循环,直到结果满意。
- 部署:当模型表现稳定了,就推上线。这时候,计算效率和用户体验就得放在前面考虑了。
微调到底是什么
简单说,LLM 微调是把预训练模型在一个更小、更专门的数据集上再训练一轮,让它适应特定任务。它的作用就是把一个通才变成一个专才。
举个例子:OpenAI 的 GPT-3 是个通用 NLP 模型。假设一家医疗机构想用它帮医生从文本笔记自动生成患者报告。虽然 GPT-3 能写文字,但不懂那么多医学术语。于是机构拿了一批医疗报告和笔记数据,对 GPT-3 做微调。训练之后,模型就逐渐掌握了临床语言的惯用表达和报告格式,最后能协助医生写出准确连贯的报告。
微调听起来很美好,但它不是白来的——需要标注数据,还要算力。所以不是每个项目上来就微调。
什么时候才需要微调
处理 LLM 任务时,大家会先用一些低成本的方法:上下文学习、零样本推理、少样本推理。
- 上下文学习:在提示里塞几个例子,给模型一个完成任务的模样。
- 零样本推理:直接问,不给例子。如果效果不好,再试单样本或少样本——也就是加一两个完成示例。
这些小技巧能解决不少问题,但对较小的模型经常失效。而且,示例会吃掉宝贵的上下文窗口空间,挤占了其它信息的位置。
当这些方法搞不定的时候,就该微调上场了。和预训练时用的海量无标注文本不同,微调是监督学习,你需要准备一批'提示-应答'对这样的标注数据。模型会根据这些数据来更新权重,让它在特定任务上的表现更上一层楼。
有监督微调(SFT)是怎么做的
通常说的微调,指的就是有监督微调(Supervised Fine-Tuning)。流程大致是这样:
准备数据。有不少现成的数据集可以挖掘,即使它们不是现成的指令格式,也能转化成微调需要的提示-回答对。比如把亚马逊的产品评论数据集改造成指令数据集。网上有不少提示模板库可以用。
训练过程。把数据分成训练集、验证集和测试集。训练时,每次从训练集里取一批提示送给模型,让它生成完整的回答。模型会拿自己的预测和真实标签对比,算出一个误差,然后通过梯度下降反向传播去调整权重。简单讲,就是让模型学怎么把回答往标签上靠。
多轮迭代。在数据上反复训练多个 epoch,模型逐渐找到一种权重配置,让特定任务上的误差越来越小。目标是把之前学到的通用知识,调整去适应新数据的模式和细节。
举个实际的对比。
对一个'天空为什么是蓝色?'的问题,微调前的模型可能只回一句:'因为大气层散射阳光。'这对科普平台来说太简略了。收集一批相关的问答数据微调之后,模型的回答变成了:'天空呈现蓝色是因为一种叫瑞利散射的现象。太阳光进入大气层,不同颜色的光波长不同,蓝光波长短,容易被气体和颗粒向四面八方散射。直射的阳光看起来是白色的,但天空看起来就是蓝色的。' 这个回答详细得多,更适合科普场景。
几类主要的微调方法
微调方法这几年发展很快,这里挑几个最重要的说。
指令微调(Instruction Fine-Tuning)
这是一种提升模型泛化能力的策略。训练时,数据里不光有内容,还有明确的指令。比如你想提高模型的摘要能力,就给它一堆'请总结以下文本:'这样的提示和对应的摘要。做翻译就加'把这段话翻译成英文:'之类的。指令能让模型学会按特定的方式'思考',更聚焦任务。
全微调(Full Fine-Tuning)
就是把模型所有参数都放开更新。做完全微调你会得到一个全新的模型版本,效果通常最好,但代价也最大。和预训练类似,它需要大量的内存和算力来存梯度、优化器状态等。如果不是资源充足,全微调很难搞,而且在多个任务上微调会产出一堆巨大的模型文件,存储也是问题。
参数高效微调(PEFT)
全微调对硬件要求太高,于是有了参数高效微调(PEFT)。它的思路是只更新模型里一小部分参数,其余权重都冻住。这样能大幅降低内存占用,有时更新量只有原模型的 15%~20%。像微软的 LoRA、斯坦福的 Prefix-Tuning、谷歌的 Prompt Tuning,还有后来的 QLoRA、DoRA 都属于这类。
PEFT 还有个关键好处:不容易忘掉之前学的东西(灾难性遗忘),因为原始模型的大部分权重根本没动。这对需要经常切换任务的团队很友好。
其他常见概念
除了上面这些,日常还会碰到几个术语:
- 迁移学习:把一个在大规模数据上预训练的模型,用到你自己的特定任务上小改一下。数据少、时间紧的时候很实用。
- 任务特定微调:完全围绕一个任务去收集数据和微调,比迁移学习更深入,但也需要更多资源。
- 灾难性遗忘:全微调时,模型在一个任务上调整过头,容易把其他任务的能力丢掉。比如情绪分析更好了,但可能忘了怎么摘要。
- 多任务学习:训练数据一次包含多个任务的示例,同时提升模型在几个任务上的表现。能缓解灾难性遗忘,但需要大量数据,经常要五到十万条样本。
- 顺序微调:从通用领域到专业领域,一步步往下走,比如从通用语言微调到医学语言,再到儿科心脏病学。逐层深入。
RAG 与微调:竞争还是互补?
提到微调,就少不了 RAG(检索增强生成)。RAG 不直接改模型参数,而是让模型在生成答案时参考外部的知识库。它的优势是信息可以随时更新,不用重新训练;而微调是把知识固化到权重里,更新起来麻烦。
传统观念里,RAG 和微调常被看作两条不同的路,但实践下来,它们配合使用往往效果更好。比如可以微调一个模型让它更擅长使用检索结果,或者用 RAG 弥补微调模型在事实性知识上的滞后。两者不是替代关系。
一些实践建议
最后,结合自己的理解,给一点上手微调时的建议:
- 任务清晰是前提。先想清楚你到底要让模型干什么,有了明确的目标才好评估做得好不好。
- 选好基座模型。别从零开始,预训练模型节省的时间和计算量太大了。它已经具备了通用语言能力,你只需要往特定领域加把火。
- 超参数要调。学习率、batch size、epoch 数这些都要根据任务摸索。没有一劳永逸的设置,可以从小规模实验开始。
- 评估不能省。留好测试集,用没见过数据看模型的真实水平。效果不理想就回头迭代,可能是数据问题,也可能是方法不对。
微调不是银弹,但很多时候它是把通用模型变成趁手工具的那一步。希望这篇文章帮你理清了思路。

