大模型微调入门——从概念到实践的完整指南

当你拥有了一个通用大模型,想让它变成你专属领域的专家时,你会发现重新训练大模型的成本极高,这时候微调技术可以成为一个很好的解决方案。本文将从微调的三大主流路线聊起,深入拆解经典微调算法LoRA的原理,最后以LlamaFactory为工具走一遍实操流程。

一、让大模型”接地气”的三条路:SFT、RLHF与RAG

预训练大模型就像一个博览群书的通才——上知天文下知地理,但真要让它干具体活儿,往往差点意思。它可能写出格式不对的代码,或者在专业领域给出泛泛而谈的回答。让通才变专家,业界主要有三条路:SFT有监督微调、RLHF强化学习人类反馈、RAG检索增强生成。

SFT:手把手教模型做事

SFT(Supervised Fine-Tuning)的思路很直接——给模型看”标准答案”。你准备好一批”指令-回答”配对的数据,模型照着学,逐渐掌握特定任务的表现方式。

打个比方,SFT就像新员工入职时的导师制:导师手把手演示每类工作该怎么处理,新人照着做几遍就上路了。比如你希望模型学会按特定格式输出JSON,准备几百条”输入自然语言 → 输出对应JSON”的样本,微调几轮,模型就能稳定地按格式输出了。

SFT适用于模型需要学习新的输出格式、新的任务类型、或者特定领域知识的场景。它的优势是效果直接、可控性强,缺点是需要准备微调数据,且对标注数据的质量和数量都有要求——垃圾数据教出来的模型也是垃圾。

RLHF:教会模型”什么是好的”

SFT教会模型”怎么做”,RLHF(Reinforcement Learning from Human Feedback)则进一步教会模型”什么是好的”。光学会做事还不够,模型还得学会判别哪个回答更好、更符合人类的偏好。

RLHF的流程分三步。第一步,先用SFT训练一个基础模型。第二步,训练一个奖励模型(Reward Model),让它学会给回答打分——人类标注员对同一问题的多个回答排序,奖励模型从中学会区分好坏。第三步,用强化学习(通常是PPO算法)让模型朝着高分方向优化。

想象一个厨师学艺的过程:SFT阶段是跟着菜谱学做菜,RLHF阶段则是请食客品尝打分,厨师根据反馈调整口味。菜谱让你”会做”,食客反馈让你”做得好吃”。

RLHF适用于需要让模型输出更符合人类偏好的场景,比如减少有害输出、让回答更礼貌周到、让创意写作更吸引人。ChatGPT之所以回答问题既准确又”会说人话”,背后就有RLHF的功劳。但RLHF的代价也不低——需要大量人类标注偏好数据,训练流程也更复杂。

RAG:给模型一本”开卷参考书”

RAG(Retrieval-Augmented Generation)走的是另一条思路。与其把知识”灌”进模型脑子里,不如每次回答问题时,先从外部知识库检索相关资料,再把检索结果塞给模型作为参考,让模型基于这些资料来生成回答。

还是用考试来类比:SFT和RLHF是”闭卷考试”,知识全靠脑子记;RAG则是”开卷考试”,你可以翻书查资料再作答。闭卷考试的好处是反应快,但记忆有上限;开卷考试虽然多了翻书的步骤,但能获取最新、最准确的信息。

RAG适用于知识更新频繁、需要引用精确信息的场景。比如企业客服系统中,产品手册经常更新,用微调的方式让模型记住每个版本不太现实,而RAG每次都从最新文档中检索,天然就能保证信息的时效性。再比如法律咨询场景,律师需要引用具体法条,RAG可以从法规数据库中精确检索,避免模型”编造”法律条文。

三者怎么选?

三种方法不是互斥的,实际项目中经常组合使用。简单来说:

如果你的核心需求是让模型学会特定任务的输入输出模式,数据也有条件准备,SFT是最直接的选择。如果你希望模型的回答更”合人心意”、更有品质感,在SFT基础上加一轮RLHF是值得的。如果你需要模型回答时效性强或需要精确引用外部知识,RAG是必选项,它可以和SFT/RLHF叠加使用。

值得一提的是,RAG严格来说并不属于微调的范畴——它不需要修改模型参数,而是在推理阶段动态引入外部信息。但三者经常被放在一起讨论,因为在”如何让通用模型适应特定需求”这个问题上,它们是三种最主流的解决方案。

二、微调算法分类:全参数 vs 部分参数

确定了要走微调这条路,下一个问题就是:微调时,模型的参数该怎么调?这里有一个根本性的选择——全参数微调还是部分参数微调。

全参数微调:大力出奇迹

全参数微调(Full Fine-Tuning)就是字面意思:解冻模型所有参数,让每一个权重都参与更新。这是最”原始”的微调方式,也是效果上限最高的方式——既然所有参数都在优化,模型就有最大的自由度去适应新任务。

全参数微调的好处是简单粗暴、效果通常最好。但它的问题也同样突出。

首先是资源消耗惊人。以一个7B参数的模型为例,全参数微调不仅要存储模型本身的权重(约14GB的FP16),还要为优化器保存动量、方差等状态(Adam优化器需要额外2倍参数量的存储),加上梯度、激活值,一张24G显存的卡可能都不够用。如果模型大到65B、175B,全参数微调对绝大多数团队来说就是天方夜谭。

其次是部署成本。全参数微调后,每个任务都产出一个完整的模型副本。三个任务就得存三个7B模型,五个任务就是五个。存储和切换都是负担。

部分参数微调:四两拨千斤

部分参数微调(Parameter-Efficient Fine-Tuning,PEFT)的思路是:冻结大部分预训练参数不动,只训练一小部分新增或选中的参数。既然研究表明模型在微调时的权重变化其实”维度不高”(后面讲LoRA时会展开),那我们没必要让所有参数都动,只要抓住关键的少量参数就够了。

打个比方,全参数微调像是把整栋楼拆了重装,部分参数微调则像是只换几个房间里的家具——楼还是那栋楼,改动的只是局部,但住起来的感受可以大不相同。

部分参数微调的方法很多,常见的有以下几类:

Prefix Tuning / Prompt Tuning:在输入前添加可训练的”虚拟前缀”(类似可学习的提示词),只训练这些前缀向量。优点是完全不改模型权重,缺点是占用了模型的上下文长度,且优化起来比较困难。

Adapter Tuning:在Transformer的各层之间插入小型的适配器模块(通常是一个降维-升维的瓶颈结构),只训练适配器参数。缺点是增加了推理时的计算量——每次前向传播都多了一层适配器要过。

LoRA:在原有权重矩阵旁并联低秩分解矩阵,只训练这些小矩阵。这是目前最流行的方案,下一节详细展开。

部分参数微调的优势很明确:训练参数量大幅减少(通常不到总参数的1%),显存占用显著降低,而且训练完的”增量”可以单独保存——一个基础模型加几个小的适配器文件,就能服务多个任务,部署和切换都轻便。缺点是,在极端复杂任务上,部分参数微调的效果上限可能略低于全参数微调。但在绝大多数实际场景中,这个差距微乎其微。

一个折中的思路是:先用部分参数微调快速迭代实验,确定方案可行后,再用全参数微调做最终的精调,兼顾效率与效果。

三、LoRA:低秩适应的精妙之处

在众多部分参数微调方法中,LoRA(Low-Rank Adaptation)无疑是最经典、应用最广泛的。它出自微软2021年的论文《LoRA: Low-Rank Adaptation of Large Language Models》,核心思想优雅而高效。

从一个问题出发

论文提出了一个关键假设:预训练模型在适应下游任务时,权重的变化量具有”低秩”性质。什么意思呢?

想象一个模型某层的权重矩阵是 4096x4096 的方阵,全参数微调会更新这 1600 多万个参数。但论文认为,真正有效的变化信息可能只存在于一个远小于4096维的子空间里。就好像你在一个 4096 人的大公司里,真正推进某项业务变革的核心人员可能就几十号——虽然每个人都多少受影响,但驱动变化的关键信号集中在少数人手中。

LoRA的做法

对于一个预训练好的权重矩阵 W0(维度为 d x k),LoRA不去直接更新它,而是保持 W0 冻结,用一个低秩分解来表示权重的变化量:

1
2
W = W0 + delta_W
delta_W = B * A

其中 B 是 d x r 的矩阵,A 是 r x k 的矩阵,r 就是”秩”,且 r 远小于 d 和 k。训练时,只有 A 和 B 是可训练的,W0 完全不动。

前向传播的过程变成了:

1
h = W0 * x + B * A * x

输入 x 同时经过原始权重 W0 和增量权重 BA,两路结果相加作为输出。

初始化时,A 用随机高斯初始化,B 初始化为零矩阵。这意味着训练开始时 BA=0,模型从预训练的原始状态出发,随着训练逐步积累变化量。

“秩”到底意味着什么

秩 r 是LoRA中最关键的超参数,理解它非常重要。

从线性代数的角度,一个矩阵的秩反映了它包含的”独立信息”的维度。秩为 r 的矩阵,本质上只有 r 个独立的行或列,其余都可以由这 r 个线性组合出来。

在LoRA的语境里,秩 r 控制的是”允许模型学习多大的变化空间”。r 越大,BA 矩阵能表达的变换越丰富,模型适应新任务的能力越强,但可训练参数也越多;r 越小,参数越少、训练越快,但表达能力受限。

论文做了一个很精彩的实验:在 GPT-3 175B 上,权重矩阵的维度高达 12288,但实验发现 r=1 或 r=2 就能在不少任务上达到与全参数微调相当的效果。这有力地印证了”权重变化量是低秩的”这个假设——即使给模型巨大的变化空间(d=12288),它真正用到的可能就那么一两个维度。

实际使用中,r 的常见取值在 4 到 64 之间。简单任务(如特定格式转换)用较小的 r 即可,复杂任务(如领域知识注入)可能需要更大的 r。

LoRA应用在Transformer的哪些层

论文研究了LoRA应该应用在Transformer的哪些权重矩阵上。Transformer自注意力模块中有四个权重矩阵:Wq(Query投影)、Wk(Key投影)、Wv(Value投影)、Wo(Output投影)。实验发现,将LoRA同时应用在 Wq 和 Wv 上效果最好,单纯应用在 Wq 上次之,而把一个较大秩的LoRA只放在一个矩阵上,不如把同样总参数量分散到多个矩阵上。

直观理解:让多条”线路”都有微调的空间,比只给一条”线路”很大的调整余地更有效。就像改革一个组织,同时优化几个关键部门的效果,往往好过只对某一个部门大动干戈。

LoRA为什么比Adapter好

LoRA相比Adapter的核心优势在于:不增加推理延迟。

Adapter在模型层之间插入了额外的网络层,推理时必须顺序经过这些层,增加了计算耗时。而LoRA的增量矩阵 BA 在部署时可以直接合并到原始权重中:

1
W_merged = W0 + B * A

合并后的权重矩阵维度和原始的一模一样,推理过程没有任何变化,零额外延迟。这是LoRA设计中最精妙的地方——训练时是旁路结构,部署时是合并结构,兼得了灵活性和效率。

LoRA的核心优势总结

第一,参数效率极高。GPT-3 175B全参数微调需要训练1750亿参数,LoRA只需训练约1870万参数(0.01%),GPU显存降低3倍。

第二,训练完成后,LoRA适配器可以与原始权重合并,推理时零额外开销。

第三,一个预训练模型可以搭载多个不同的LoRA适配器,实现多任务低成本切换——就像手机上的App,操作系统是共享的,每个App只占很小的空间。

第四,LoRA与其他方法正交,可以和Prefix Tuning等方法组合使用。

四、动手实践:用LlamaFactory跑通微调

理论聊了这么多,终究要落地。LlamaFactory是目前最流行的微调框架之一,它把微调流程中的数据处理、训练配置、模型合并等环节都做了清晰的封装,支持从SFT到DPO、从全参数微调到LoRA的多种方案,还提供了WebUI界面让初学者也能快速上手。

数据准备

微调的第一步是准备数据。LlamaFactory支持Alpaca和ShareGPT两种数据格式。

Alpaca格式适合简单的指令微调场景,每条数据包含instruction(人类指令)、input(可选的补充输入)、output(模型回答)三个核心字段。一个典型的SFT数据样例长这样:

1
2
3
4
5
{
"instruction": "计算这些物品的总费用。",
"input": "汽车 - $3000,衣服 - $100,书 - $20。",
"output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
}

训练时,instruction和input会拼接在一起作为模型输入,output作为目标回答。如果有多轮对话,可以通过history字段补充上下文。此外还可以加system字段指定系统提示词。多轮对话的数据样例如下:

1
2
3
4
5
6
7
8
9
10
{
"instruction": "今天的天气怎么样?",
"input": "",
"output": "今天的天气不错,是晴天。",
"system": "你是一个有帮助的助手。",
"history": [
["今天会下雨吗?", "今天不会下雨,是个好天气。"],
["今天适合出去玩吗?", "非常适合,空气质量很好。"]
]
}

如果是偏好训练(如DPO),则需要提供chosen(优质回答)和rejected(劣质回答)字段,让模型学会区分回答的好坏。样例如下:

1
2
3
4
5
6
{
"instruction": "老虎会吃草还是树叶?",
"input": "",
"chosen": "老虎是食肉动物,通常不吃草或树叶。它们的饮食主要包括大型有蹄动物、小型哺乳动物和鸟类。",
"rejected": "老虎会选择吃草。"
}

ShareGPT格式更适合多角色对话场景,支持human、gpt、function_call、observation等多种角色类型,通过conversations字段组织对话流。如果你的训练数据包含工具调用等复杂交互,ShareGPT格式会更灵活。一个带工具调用的样例如下:

1
2
3
4
5
6
7
8
9
10
{
"conversations": [
{ "from": "human", "value": "我出生于1990年5月15日,请告诉我我今年几岁?" },
{ "from": "function_call", "value": "{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}" },
{ "from": "observation", "value": "{\"age\": 36}" },
{ "from": "gpt", "value": "根据计算,您今年36岁。" }
],
"system": "你是一个有帮助的助手。",
"tools": "[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\"}}, \"required\": [\"birthdate\"]}}]"
}

可以看到,ShareGPT格式天然支持工具调用链路:用户提问 → 模型调用工具 → 观察到工具返回结果 → 模型给出最终回答,整个交互链条清晰完整。

准备好数据文件后,需要在LlamaFactory的data/dataset_info.json中注册数据集,写明文件名和字段映射关系。注册数据集相当于告诉框架我使用的数据集格式是什么样子的,例如注册一个Alpaca格式的SFT数据集:

1
2
3
4
5
6
7
8
9
10
"my_dataset": {
"file_name": "my_data.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system",
"history": "history"
}
}

配置与启动训练

数据就绪后,编写训练配置。LlamaFactory使用YAML配置文件,下面以Qwen3-4B的LoRA微调为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
### 模型配置
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507 # 在线用模型名称,离线用本地路径
trust_remote_code: true # 是否信任远程代码,默认false

### 训练阶段与方法
stage: sft # 训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO
do_train: true # true为训练,false为推理
finetuning_type: lora # 微调方式,可选: lora, full(全参数微调), freeze(冻结部分层)
lora_rank: 8 # LoRA秩 r,影响参数效率
lora_target: all # LoRA应用的目标模块,设为all表示对所有可训练层都加LoRA

### 数据集
dataset: identity,alpaca_en_demo # 数据集名称,对应dataset_info.json中注册的条目,多个数据集用逗号分隔
template: qwen3_nothink # 对话模板,必须与模型匹配——不同模型的提示词格式不同,选错模板会导致模型学歪
cutoff_len: 2048 # 训练样本的最大长度,超过部分会被截断
max_samples: 1000 # 最大训练样本数

### 输出与日志
output_dir: saves/qwen3-4b/lora/sft # 输出目录,训练完成后会保存模型、日志等文件
logging_steps: 10 # 日志记录间隔,单位为训练步数
save_steps: 500 # 模型保存间隔,单位为训练步数
plot_loss: true # 是否绘制loss曲线图
overwrite_output_dir: true # 是否覆盖已存在的输出目录,默认false

### 训练超参数
per_device_train_batch_size: 1 # 每个GPU的训练batch_size,等效batch_size为per_device_train_batch_size * gradient_accumulation_steps
gradient_accumulation_steps: 8 # 梯度累积步数,当显存不够调大batch_size时,可以通过累积多步的梯度再更新参数来模拟大batch训练
learning_rate: 1.0e-4 # 学习率,LoRA微调中通常设为1e-4到5e-4之间,比全参数微调的学习率要高,因为可训练参数少了,需要更大的学习率来推动变化
num_train_epochs: 3.0 # 训练轮数,即训练数据集的遍历次数,一般设为3-5轮
lr_scheduler_type: cosine # 学习率调度类型,可选: linear, cosine
warmup_ratio: 0.1 # 预热轮数占比,即在训练开始时,学习率从0线性增加到learning_rate,预热轮数为num_train_epochs * warmup_ratio步
bf16: true # 是否使用半精度训练,默认false

配置完成后,一行命令启动训练:

1
llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml

训练过程中,模型会在output_dir下定期保存checkpoint,并在训练结束后生成loss曲线图(plot_loss: true时)。

模型保存与LoRA合并

训练完成后,output_dir中保存的是LoRA适配器,还不是可以直接独立使用的完整模型。要部署推理,有两种选择:

方式一:推理时分别加载基础模型和适配器。这种方式灵活,切换任务只需换适配器,但加载流程稍繁琐。

方式二:将LoRA适配器合并到基础模型中,导出完整模型。合并后的模型和全参数微调后的模型在结构上没有区别,直接用 transformers 加载即可,推理时零额外开销。

合并同样通过LlamaFactory完成,编写合并配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
### 模型配置
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507 # 在线用模型名称,离线用本地路径
trust_remote_code: true # 是否信任远程代码,默认false

### LoRA合并配置
adapter_name_or_path: saves/qwen3-4b/lora/sft # LoRA适配器路径,训练时保存的模型路径
template: qwen3_nothink # 对话模板,必须与模型匹配——不同模型的提示词格式不同,选错模板会导致模型学歪
trust_remote_code: true # 是否信任远程代码,默认false

### 导出配置
export_dir: saves/qwen3_sft_merged # 导出目录,合并后的模型会保存在该路径下
export_size: 5 # 导出模型的大小,单位为GB
export_device: cpu # 导出时使用的设备,默认cpu
export_legacy_format: false # 是否导出为旧版格式,默认false,建议设为true

执行合并:

1
llamafactory-cli export examples/merge_lora/qwen3_lora_sft.yaml

合并后的模型会保存在export_dir指定的路径中。需要注意:合并LoRA时不能使用量化后的模型——必须用未量化的原始模型进行合并。

可选的量化

合并后的完整模型体积不小(4B参数约8GB),如果部署环境对存储和内存敏感,可以进一步量化。LlamaFactory支持GPTQ、AWQ等后训练量化方法,将模型从FP16压缩到4-bit,体积缩小到约四分之一,推理速度也有提升。

量化配置示例:

1
2
3
4
5
6
7
8
9
10
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
template: qwen3_nothink
trust_remote_code: true

export_dir: saves/qwen3_gptq # 导出目录,量化后的模型会保存在该路径下
export_quantization_bit: 4 # 量化位宽,4表示4-bit量化
export_quantization_dataset: data/c4_demo.json # 校准数据集,量化过程需要一小批数据来校准精度损失,确保4-bit表示尽量贴近原始高精度数值
export_size: 2 # 导出模型的大小,单位为GB
export_device: cpu # 导出时使用的设备,默认cpu
export_legacy_format: false # 是否导出为旧版格式,默认false,建议设为true

还有一种是QLoRA方式:训练时就在4-bit量化模型上做LoRA微调。这种方式把训练阶段的显存需求进一步压低,适合显存极为有限的场景。不过QLoRA训练完成后,合并时仍需使用未量化的原始模型,这一点务必注意。

模型推理

模型训练(以及可选的合并、量化)完成后,下一步就是实际使用了。LlamaFactory提供了多种推理方式。

最简单的方式是交互式对话。编写推理配置文件,用一行命令即可启动:

1
llamafactory-cli chat examples/inference/qwen3_lora_sft.yaml

推理配置文件只需指定模型路径和模板。如果用的是LoRA微调后的模型(未合并),还需要加上适配器路径和微调类型:

1
2
3
4
5
6
7
### 微调模型推理配置
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
template: qwen3_nothink
finetuning_type: lora
infer_backend: huggingface
trust_remote_code: true

如果已经把LoRA合并导出了完整模型,那就不需要adapter_name_or_path和finetuning_type了,直接指向合并后的模型路径即可。

如果不想在终端里交互,也可以用webchat方式启动一个网页界面的对话:

1
llamafactory-cli webchat examples/inference/qwen3_lora_sft.yaml

当你需要用大规模数据集批量跑推理结果时,LlamaFactory支持vllm推理引擎来加速。只需在配置中把infer_backend改为vllm,或直接用脚本:

1
python scripts/vllm_infer.py --model_name_or_path saves/qwen3_sft_merged --dataset alpaca_en_demo

此外,LlamaFactory还支持以API服务的形式部署模型,这样其他应用就可以通过OpenAI兼容的接口来调用:

1
API_PORT=8000 CUDA_VISIBLE_DEVICES=0 llamafactory-cli api examples/inference/qwen3_lora_sft.yaml

启动后,用标准的OpenAI SDK就能调用:

1
2
3
4
5
6
from openai import OpenAI

client = OpenAI(api_key="0", base_url="http://0.0.0.0:8000/v1")
messages = [{"role": "user", "content": "你是谁?"}]
result = client.chat.completions.create(messages=messages, model="Qwen/Qwen3-4B-Instruct-2507")
print(result.choices[0].message)

模型评估

训练完模型、跑出推理结果,怎么知道微调效果好不好?LlamaFactory内置了两种评估方式。

通用能力评估,使用标准基准测试来衡量模型在知识问答、阅读理解等方面的表现。目前支持MMLU(英文综合知识)、C-Eval(中文综合能力)、CMMLU(中文多领域)等基准。配置如下:

1
2
3
4
5
6
7
8
9
10
11
### 评估配置
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
finetuning_type: lora
template: fewshot

task: mmlu_test # 评估任务,可选 mmlu_test、ceval_validation、cmmlu_test
lang: en # 语言,en 或 zh
n_shot: 5 # few-shot 样本数
batch_size: 4 # 评估批次大小
save_dir: saves/qwen3-4b/lora/eval

运行评估:

1
llamafactory-cli eval examples/train_lora/qwen3_lora_eval.yaml

其中task指定评估基准,lang指定语言,n_shot控制给模型几个示例再让它答题(类似考试前的例题演示)。评估结果会保存在save_dir中。

生成质量评估,用于衡量模型生成文本与参考答案的匹配程度,计算BLEU和ROUGE等指标。这类评估需要在SFT数据集上运行预测,对比模型输出和标准答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
### NLG评估配置
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
stage: sft
do_predict: true
finetuning_type: lora
eval_dataset: alpaca_en_demo
template: qwen3_nothink
cutoff_len: 2048
max_samples: 50
output_dir: saves/qwen3-4b/lora/predict
predict_with_generate: true
per_device_eval_batch_size: 1

运行:

1
llamafactory-cli train examples/extras/nlg_eval/qwen3_lora_predict.yaml

predict_with_generate设为true表示让模型自回归生成文本(而非只算loss),这样才能拿到实际的生成结果来和参考答案比对。

两种评估各有侧重:通用能力评估看的是模型在标准化考试中的”综合成绩”,生成质量评估看的是模型在你的具体任务上”答题有多准”。实际项目中,两者结合使用能更全面地判断微调效果。

写在最后

从SFT的”手把手教”、到RLHF的”教模型明辨好坏”、再到RAG的”开卷考试”,三种方法各有侧重,组合使用效果更佳。在微调算法层面,全参数微调效果上限最高但资源消耗大,LoRA等部分参数微调方法以极低的参数量实现了接近全参数微调的效果,是目前性价比最高的选择。LoRA的核心洞察——权重变化量具有低秩性质——看似一个数学假设,却被实验反复验证,r=4这样的小数值就已经足以应对大多数微调场景。

工具层面,LlamaFactory把从数据准备到模型导出的完整流程都封装好了,配合WebUI界面,即使是微调新手也能快速上手。理论理解加工具熟练,大模型微调这道门,其实并没有想象中那么难迈。

参考资料