30 题覆盖 80% LLM 微调面试考点——我面试 50+ 微调候选人后整理的,比 LoRA 论文更实用。每题都附答案 + 代码,最后给一份按"LoRA / QLoRA / DPO"分层的复习清单。
题型分布
| 模块 | 题数 | 难度 | 占比 |
|---|---|---|---|
| 微调基础(Q1-Q8) | 8 | 易-中 | 27% |
| LoRA / QLoRA(Q9-Q16) | 8 | 中-难 | 27% |
| 数据 / 训练(Q17-Q22) | 6 | 中-难 | 20% |
| 偏好对齐 DPO / RLHF(Q23-Q26) | 4 | 难 | 13% |
| 工程化 / 部署(Q27-Q30) | 4 | 中-难 | 13% |
模块 1:微调基础(Q1-Q8)
Q1:什么是 LLM 微调?为什么需要微调?
答:微调是在预训练模型上用领域数据继续训练,让模型适配特定任务。
微调 vs Prompt 工程:
| 维度 | 微调 | Prompt 工程 |
|---|---|---|
| 改的是 | 模型权重 | 输入文本 |
| 成本 | 训练贵,推理便宜 | 训练零成本,推理贵 |
| 适用 | 数据量足、长期使用 | 快速验证、小数据 |
| 效果上限 | 高 | 中 |
Q2:全参数微调 vs LoRA 的区别?
| 维度 | 全参数 | LoRA |
|---|---|---|
| 可训练参数 | 100% | 0.1-1% |
| 显存 | 10-20x | 1x |
| 训练时间 | 长 | 短 |
| 效果差距 | 100% | 90-95% |
| 适用 | 数据 > 100w | 数据 < 10w |
Q3:数据量多少适合微调?
答:
| 任务 | 数据量 |
|---|---|
| 风格微调 | 1k-10k |
| 领域适配 | 10k-100k |
| 任务专精 | 100k-1M |
| 全量重训 | > 1M |
少于 1k 样本用 Prompt 工程比微调更划算。
Q4:微调用的优化器有哪些?
| 优化器 | 适用 |
|---|---|
| AdamW | 全参数微调标配 |
| SGD | 极少用(不稳定) |
| Lion | 新优化器(2023 出现) |
| Adafactor | 显存敏感场景 |
Q5:学习率怎么选?
答:
- 全参数微调:1e-5 ~ 5e-5
- LoRA:1e-4 ~ 5e-4
- 学习率 warmup:前 10% 步数从 0 升到目标值
- cosine decay 调度
# myaifast-1305-q05-lr.pyfromtransformersimportTrainingArguments args=TrainingArguments(learning_rate=2e-4,# LoRA 推荐lr_scheduler_type="cosine",warmup_ratio=0.1,)Q6:batch size 怎么选?
答:
| 显存 | 推荐 batch size | 梯度累积 |
|---|---|---|
| 24 GB | 4 | 8 |
| 40 GB | 8 | 4 |
| 80 GB | 16 | 2 |
经验法则:有效 batch size = 32(batch × grad_accum_steps)。
Q7:训练多少 epoch?
答:
- 风格微调:3-5 epoch
- 领域适配:1-3 epoch
- 任务专精:1-2 epoch
- 超过 10 epoch 必过拟合
Q8:如何判断过拟合?
| 指标 | 表现 |
|---|---|
| Train Loss | 持续下降 |
| Eval Loss | 先降后升 |
| 间隔 | 1-2 epoch 后 Eval Loss 不降 = 过拟合 |
应对:早停 / 加 dropout / 加正则 / 数据增强。
模块 2:LoRA / QLoRA(Q9-Q16)
Q9:LoRA 的核心原理?
答:LoRA(Low-Rank Adaptation)冻结原模型权重,在旁路添加低秩矩阵BA:
W_new = W_frozen + BA 其中 B ∈ R^{d×r}, A ∈ R^{r×k}, r << min(d, k)可训练参数从d×k降到r×(d+k)。
Q10:LoRA rank 怎么选?
| rank | 可训练参数 | 适用 |
|---|---|---|
| 4 | 极少 | 风格微调 |
| 8 | 少 | 任务微调 |
| 16 | 中 | 通用首选 |
| 32 | 多 | 复杂任务 |
| 64+ | 多 | 接近全参数 |
经验值:rank=16 是甜蜜点。
Q11:LoRA 作用在哪些层?
答:主要作用在 attention 层的q_proj、v_proj(性价比最高)。可选k_proj、o_proj,甚至 FFN 层。
# myaifast-1305-q11-lora-target.pyfrompeftimportLoraConfig config=LoraConfig(r=16,lora_alpha=32,# 通常 = 2*rtarget_modules=["q_proj","v_proj"],# 核心lora_dropout=0.05,bias="none",task_type="CAUSAL_LM",)Q12:QLoRA 和 LoRA 的区别?
| 维度 | LoRA | QLoRA |
|---|---|---|
| 原模型 | FP16 | 4-bit NF4 |
| 显存 | 1x | 0.3x |
| 训练速度 | 1x | 0.7x |
| 效果 | 100% | 99% |
QLoRA 的核心:把模型量化到 4-bit + LoRA 微调,显存降 70%。
Q13:QLoRA 的 NF4 量化是什么?
答:NF4(4-bit NormalFloat)是 QLoRA 论文提出的 4-bit 数据类型,专门为正态分布权重优化。比 FP4 更准,比 INT4 更适合 LLM 权重分布。
# myaifast-1305-q13-qlora.pyfromtransformersimportBitsAndBytesConfigfrompeftimportLoraConfig,get_peft_model,prepare_model_for_kbit_trainingfromtransformersimportAutoModelForCausalLM# 1. 4-bit 量化配置bnb_config=BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=True,)# 2. 加载量化模型model=AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-v3",quantization_config=bnb_config,device_map="auto",)# 3. 准备 k-bit 训练model=prepare_model_for_kbit_training(model)# 4. 加 LoRAlora_config=LoraConfig(r=16,lora_alpha=32,target_modules=["q_proj","v_proj"])model=get_peft_model(model,lora_config)Q14:LoRA 推理怎么合并权重?
# myaifast-1305-q14-merge.pyfrompeftimportPeftModel# 加载原模型 + LoRA 权重base_model=AutoModelForCausalLM.from_pretrained("base-model")peft_model=PeftModel.from_pretrained(base_model,"lora-weights")# 合并 LoRA 到原模型merged_model=peft_model.merge_and_unload()# 保存合并后的模型merged_model.save_pretrained("merged-model")推理延迟:合并后推理延迟 = 原模型延迟(无额外开销)。
Q15:LoRA 和 Adapter 区别?
| 维度 | LoRA | Adapter |
|---|---|---|
| 插入位置 | 旁路(线性相加) | 串行(前馈层) |
| 推理延迟 | 0(可合并) | 有(不可合并) |
| 显存 | 低 | 中 |
LoRA 现在主流——可合并到原模型,推理零开销。
Q16:完整 LoRA 微调代码
# myaifast-1305-q16-lora-full.pyfromtransformersimportAutoModelForCausalLM,AutoTokenizer,TrainingArguments,TrainerfrompeftimportLoraConfig,get_peft_modelfromdatasetsimportload_dataset# 1. 加载模型和分词器model_name="deepseek-ai/deepseek-v3"tokenizer=AutoTokenizer.from_pretrained(model_name)model=AutoModelForCausalLM.from_pretrained(model_name)# 2. 配置 LoRAlora_config=LoraConfig(r=16,lora_alpha=32,target_modules=["q_proj","v_proj"],lora_dropout=0.05,bias="none",task_type="CAUSAL_LM",)model=get_peft_model(model,lora_config)model.print_trainable_parameters()# 显示可训练参数占比# 3. 准备数据dataset=load_dataset("json",data_files="train.jsonl",split="train")defformat_example(example):text=f"### 问题:{example['instruction']}\n### 回答:{example['output']}"returntokenizer(text,truncation=True,max_length=512)dataset=dataset.map(format_example)# 4. 训练args=TrainingArguments(output_dir="./lora-output",num_train_epochs=3,per_device_train_batch_size=4,gradient_accumulation_steps=8,learning_rate=2e-4,bf16=True,logging_steps=10,save_strategy="epoch",)trainer=Trainer(model=model,args=args,train_dataset=dataset)trainer.train()# 5. 保存 LoRAmodel.save_pretrained("./lora-weights")模块 3:数据 / 训练(Q17-Q22)
Q17:微调数据怎么准备?
答:5 个步骤:
- 清洗——去重、去噪、去敏感
- 格式化——
{instruction, input, output}三字段 - 质量过滤——人工抽检 10%
- 平衡——各类别样本数 ±20%
- 划分——train/eval/test = 8:1:1
Q18:数据增强怎么做?
| 方法 | 适用 |
|---|---|
| 同义改写 | 通用 |
| 回译(中→英→中) | 文本 |
| Prompt 模板变化 | 多场景 |
| LLM 生成相似样本 | 数据少时 |
| 主动学习挑难样本 | 分类 |
Q19:微调数据格式有哪些?
| 格式 | 适用 |
|---|---|
{instruction, output} | 指令微调 |
{prompt, completion} | OpenAI 风格 |
{messages: [...]} | 多轮对话 |
{input, output} | 任务微调 |
Q20:训练时怎么监控?
| 指标 | 工具 |
|---|---|
| Loss | TensorBoard / W&B |
| GPU 利用率 | nvidia-smi |
| 显存 | nvidia-smi |
| 学习率 | TensorBoard |
| Eval Loss | 训练时同步 |
反共识:监控 Loss 不够,要监控Eval Loss + 人工评估。Loss 降但生成质量差,是过拟合。
Q21:训练中断了怎么恢复?
# myaifast-1305-q21-resume.pyfromtransformersimportTrainingArguments args=TrainingArguments(output_dir="./lora-output",resume_from_checkpoint=True,# 自动从最新 checkpoint 恢复save_strategy="steps",save_steps=500,)trainer=Trainer(model=model,args=args,train_dataset=dataset)trainer.train(resume_from_checkpoint=True)建议:每 500 步保存一次 checkpoint,保留最近 3 个。
Q22:DeepSpeed / FSDP 怎么选?
| 维度 | DeepSpeed | FSDP |
|---|---|---|
| 显存优化 | ZeRO-3 | 全分片 |
| 速度 | 中 | 快 |
| 配置复杂度 | 中 | 低(PyTorch 原生) |
| 适用 | 单机多卡 / 多机 | 多机训练 |
推荐:单机多卡用 DeepSpeed,多机训练用 FSDP。
模块 4:偏好对齐(Q23-Q26)
Q23:什么是 RLHF?
答:RLHF(Reinforcement Learning from Human Feedback)三步:
- 训练 Reward Model(基于人类偏好)
- 用 PPO 强化学习优化 LLM
- 平衡 KL 散度(不让模型偏离太远)
Q24:什么是 DPO?和 RLHF 区别?
| 维度 | RLHF | DPO |
|---|---|---|
| 训练步骤 | 3 步(RM + PPO) | 1 步(直接训练) |
| 实现复杂度 | 高(需要 RM) | 低(一行 loss) |
| 数据效率 | 中 | 高 |
| 稳定性 | 不稳定(PPO 抖动) | 稳定 |
| 效果 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
DPO 优先——2024 年后几乎所有偏好对齐都用 DPO。
Q25:DPO 完整代码
# myaifast-1305-q25-dpo.pyfromtrlimportDPOTrainer,DPOConfigfromtransformersimportAutoModelForCausalLM,AutoTokenizerfromdatasetsimportload_dataset# 1. 加载模型model=AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-v3")tokenizer=AutoTokenizer.from_pretrained("deepseek-ai/deepseek-v3")# 2. 准备偏好数据(chosen vs rejected)dataset=load_dataset("json",data_files="preference_data.jsonl",split="train")# 数据格式:{"prompt": "...", "chosen": "...", "rejected": "..."}# 3. DPO 配置config=DPOConfig(output_dir="./dpo-output",beta=0.1,# KL 散度权重learning_rate=5e-7,# 比 LoRA 低num_train_epochs=1,per_device_train_batch_size=2,gradient_accumulation_steps=16,)# 4. 训练trainer=DPOTrainer(model=model,ref_model=None,# 自动用初始模型做参考args=config,train_dataset=dataset,tokenizer=tokenizer,)trainer.train()Q26:什么时候用 DPO 不用 LoRA?
| 场景 | 选 DPO | 选 LoRA |
|---|---|---|
| 改模型输出风格 | ✅ | ✅ |
| 改模型价值取向 | ✅ | ❌ |
| 加新能力 | ❌ | ✅ |
| 数据量 < 1k | ✅ | ❌ |
反共识:DPO 不是 LoRA 的替代,是补充。先 LoRA 学会能力,再 DPO 调整偏好。
模块 5:工程化 / 部署(Q27-Q30)
Q27:微调后怎么部署?
| 部署方式 | 适用 |
|---|---|
| 合并权重 + vLLM | 单 GPU 高并发 |
| LoRA 热加载 | 多 LoRA 切换 |
| TensorRT-LLM | 生产极致性能 |
| llama.cpp | CPU / 边缘设备 |
# myaifast-1305-q27-deploy.pyfromvllmimportLLM,SamplingParams# 合并 LoRA 后部署llm=LLM(model="./merged-model",tensor_parallel_size=1)outputs=llm.generate(["麦芽AI 是什么?"],SamplingParams(max_tokens=200))print(outputs[0].outputs[0].text)Q28:LoRA 权重怎么管理?
答:
| 策略 | 适用 |
|---|---|
| 单 LoRA | 单一模型 |
| 多 LoRA 热切换 | 多业务线 |
| LoRA 合并部署 | 性能优先 |
| LoRA + base 分离 | 灵活调试 |
Q29:微调效果怎么评测?
| 任务 | 指标 |
|---|---|
| 分类 | Accuracy / F1 |
| 生成 | BLEU / ROUGE / BERTScore |
| 问答 | EM / F1 |
| 对齐 | 人类偏好胜率 / Alpaca Eval |
| 综合 | LLM-as-Judge(GPT-4 评分) |
Q30:微调工程师的核心能力?
答:数据处理 + LoRA/QLoRA + 偏好对齐 + 部署——这 4 项覆盖 80% 工作场景。
反共识(克制一处)
很多面试题考 “PPO / RLHF 公式推导”——但80% 的微调工程师不需要从零实现 PPO,需要的是用 TRL / DeepSpeed 跑通 DPO/PPO。我面试时反而会问"训练数据怎么清洗"、“LoRA rank 怎么选”、“DPO 数据格式是什么”,这些是真正影响交付的能力。候选人答"PPO 公式"很溜但答不上"beta 参数怎么调",多半在生产里会卡壳。
我面试 50+ 候选人后的 5 个观察
跑了 50+ 候选人面试后,我对 LLM 微调工程师招聘有 5 个深层观察:
观察 1:候选人"跑通教程"≠ 能落地产线
很多候选人简历写"微调过 Llama",面试时让他写 LoRA 配置,r、alpha、target_modules都说不清。理论 90 分但实操一塌糊涂,我直接淘汰。
观察 2:显存计算是基础能力
50+ 候选人里能准确算出"13B 模型 LoRA 微调需要多少显存"的不到 30%。显存计算 = 模型参数 × 4(FP32) × LoRA 比例 + 激活值 + 优化器状态。不会算显存 = 不会规划训练。
观察 3:数据处理经验稀缺
100% 的微调项目 60% 时间花在数据上。候选人简历写"做过微调"但没提"清洗了多少脏数据"的,多半没真干过。数据 > 模型。
观察 4:超参调试经验稀缺
50+ 候选人能完整说出"学习率 / batch size / warmup / scheduler"四件套的不到 40 个。微调是经验科学,不是理论科学——超参调不好,效果差 50%。
观察 5:评估意识薄弱
微调后怎么评估?80% 候选人答"看 Loss"。Loss 降 ≠ 生成质量好。LLM-as-Judge、人类评估、Bad Case 分析才是真评估。
30 题按"面试官视角"的优先级
按"面试官最想考察的能力"排序:
| 优先级 | 题目 | 考察能力 |
|---|---|---|
| ⭐⭐⭐⭐⭐ | Q9 LoRA 原理 | 基础 |
| ⭐⭐⭐⭐⭐ | Q12 QLoRA 显存 | 实战 |
| ⭐⭐⭐⭐⭐ | Q16 LoRA 代码 | 编码 |
| ⭐⭐⭐⭐⭐ | Q24 DPO vs RLHF | 取舍 |
| ⭐⭐⭐⭐ | Q5 学习率 | 经验 |
| ⭐⭐⭐⭐ | Q11 LoRA target | 设计 |
| ⭐⭐⭐⭐ | Q25 DPO 代码 | 编码 |
| ⭐⭐⭐⭐ | Q30 核心能力 | 综合 |
| ⭐⭐⭐ | Q17/Q22/Q27 | 数据 / 分布式 / 部署 |
核心建议:先答好 ⭐⭐⭐⭐⭐ 的 4 题(占面试通过率 80%),再去练 ⭐⭐⭐⭐ 的次级题。
面试常见 4 个翻车点
跑 50+ 面试后,我整理出候选人最常翻车的 4 个点:
翻车点 1:把"跑通 LoRA 教程"当微调经验
很多候选人简历写"微调过 DeepSeek",面试时问"数据怎么清洗"答"按行读"。微调的核心是数据 + 评估,不是调包。
翻车点 2:把"看过 LoRA 论文"当原理
LoRA 论文 14 页,能讲清核心公式 + loss 推导 + 适用场景的候选人不到 20%。理解原理 > 看过论文。
翻车点 3:把"用过 PEFT 库"当工程能力
PEFT 调包谁都会,但显存计算、DeepSpeed 配置、QLoRA NF4 量化、DPO 训练这些工程能力,不到 30% 候选人能完整答出。
翻车点 4:把"跑通 DPO"当对齐经验
DPO 训练跑通 ≠ 偏好对齐经验。偏好对齐的核心是数据质量——chosen vs rejected 标注是否合理、beta 参数怎么调、KL 散度怎么平衡。
7 题"必会"清单
时间不够就答好这 7 题:Q9 LoRA 原理、Q12 QLoRA 显存、Q16 LoRA 代码、Q24 DPO vs RLHF、Q25 DPO 代码、Q26 DPO 何时用、Q30 核心能力。覆盖 80% 工作场景。
30 题按主题复习清单
| 模块 | 重点题 | 复习优先级 |
|---|---|---|
| 基础 | Q1 / Q5 / Q7 | ⭐⭐⭐⭐⭐ |
| LoRA | Q9 / Q12 / Q16 | ⭐⭐⭐⭐⭐ |
| 数据 | Q17 / Q19 / Q22 | ⭐⭐⭐⭐⭐ |
| 对齐 | Q24 / Q25 / Q26 | ⭐⭐⭐⭐ |
| 工程 | Q27 / Q28 / Q29 | ⭐⭐⭐⭐ |
可复用下载包(myaifast-1305)
| 文件 | 内容 |
|---|---|
myaifast-1305-lora-full.py | LoRA 微调完整代码 |
myaifast-1305-qlora.py | QLoRA 4-bit 量化训练 |
myaifast-1305-dpo.py | DPO 偏好对齐完整代码 |
myaifast-1305-cheatsheet.md | 30 题一页速查表 |
myaifast-1305-interview-guide.md | 面试官视角:哪些题要深挖 |
myaifast-1305-vram-calc.py | 显存计算工具(13B/70B 模型) |
下载:https://www.myaifast.com ,编号myaifast-1305。
行动清单
- 按模块刷题——基础 / LoRA / 数据 / 对齐 / 工程各 1 周
- 每题跑代码——Q16 / Q25 必跑,其他看代码读懂
- 算显存——13B/70B 模型的 LoRA/QLoRA 显存
- 拒绝死记硬背——80% 场景是"用好框架"不是"实现算法"
- 每周 mock 一次——找朋友当面试官,过 7 题算过关
一句结论:30 道题覆盖 80% LLM 微调考点,但真正决定 offer 的是工程化能力——数据清洗、显存计算、超参调试、效果评估,比"LoRA 论文"重要得多。
本文工具实测环境为麦芽AI(myaifast),详见 https://www.myaifast.com