开篇:微调一时爽,评测火葬场
前两篇文章我们学会了 LoRA 和 QLoRA 微调,把通用大模型变成了”专属小助手”。但有一个灵魂拷问始终绕不过去——微调完之后,怎么知道它真的变好了?
只看 Loss 曲线下降就高兴得太早了。我见过很多人微调后模型反而变笨了——原来会的问题不会了,原来能写的代码写不出来了。这种现象叫灾难性遗忘(Catastrophic Forgetting)。
所以,评估不是微调的锦上添花,而是验收标准。这篇给你一套完整的评估工具箱,从自动指标到人工评测,每一步都能落地。
1. 第一道防线:Loss 和 Perplexity
最基础的评估看两个数字:
- Loss(损失值)——训练过程中持续下降就说明模型在学习。但 Loss 低≠效果好,因为模型可能只是死记硬背了训练数据。
- Perplexity(困惑度,PPL)——模型对文本的”困惑程度”,越低越好。公式是
exp(Loss),直观理解:PPL=10 意味着模型平均每次预测在 10 个词里猜。
这两个指标只在同一个模型的同一份测试集上做对比才有意义。不同模型的 PPL 不能直接比。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "Qwen/Qwen2.5-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
test_text = "今天天气真不错,我们去公园"
inputs = tokenizer(test_text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, labels=inputs["input_ids"])
loss = outputs.loss
ppl = torch.exp(loss)
print(f"Loss: {loss.item():.4f}")
print(f"Perplexity: {ppl.item():.2f}")
2. 基准评测:用标准化考试打分
更可靠的方式是用公开基准(Benchmark)——就像给模型做标准化考试。
主流 Benchmarks
| Benchmark | 测什么 | 题型 | 适用场景 |
|---|---|---|---|
| MMLU | 57 个学科的知识广度 | 四选一 | 通用知识评测 |
| C-Eval | 中文综合知识 | 选择题 | 中文模型必测 |
| GSM8K | 小学数学推理 | 问答题 | 推理能力评测 |
| HumanEval | Python 代码生成 | 编程题 | 代码能力评测 |
| CMMLU | 中文多领域知识 | 选择题 | 中文模型必测 |
用 lm-eval-harness 一键评测
EleutherAI 开发的 lm-eval-harness 是目前最主流的评测框架,一条命令跑完:
# 安装
pip install lm-eval
# 评测 HuggingFace 模型
lm_eval --model hf \
--model_args pretrained=Qwen/Qwen2.5-7B-Instruct \
--tasks mmlu,ceval-valid \
--device cuda:0 \
--batch_size auto \
--output_path ./eval_results
还可以评测微调后的 adapter:
lm_eval --model hf \
--model_args pretrained=Qwen/Qwen2.5-7B-Instruct,peft=./qwen-lora-adapter \
--tasks mmlu \
--device cuda:0 \
--batch_size auto
跑完后会自动生成 JSON 报告,对比微调前后的分数变化,一目了然。
3. 业务评估:针对你的真实场景
公开 Benchmarks 测的是”通识能力”,但你的业务场景可能需要定制化评估。
3.1 对比评测(A/B Test)
准备 50-100 条你真实业务场景的问题,让微调前和微调后的模型分别回答:
# 对比评测模板
test_cases = [
{"question": "我们的退货政策是多久?", "expected_keywords": ["30天", "无条件"]},
{"question": "如何重置密码?", "expected_keywords": ["邮箱", "验证码", "链接"]},
]
def evaluate(model, tokenizer, test_cases):
total, passed = 0, 0
for case in test_cases:
inputs = tokenizer(case["question"], return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=128)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 检查关键词
if all(kw in answer for kw in case["expected_keywords"]):
passed += 1
total += 1
return passed / total
3.2 多维度评分卡
单一指标不够用。建议至少从以下维度打分(每项 1-5 分):
| 维度 | 说明 | 评分方法 |
|---|---|---|
| 准确性 | 回答是否事实正确 | 人工核对(或让强模型做裁判) |
| 相关性 | 回答是否切题 | 检查与问题的语义匹配度 |
| 完整性 | 是否遗漏关键信息 | 检查预设信息点的覆盖度 |
| 安全性 | 是否输出有害内容 | 用安全分类器筛查 |
| 风格匹配 | 语气是否符合预期 | 人工判断(主观但重要) |
4. 进阶:用 LLM 做裁判(LLM-as-a-Judge)
人工评分太慢,纯规则太死板。一个流行的折中方案是用 GPT-4 或 DeepSeek 等高阶模型做打分裁判:
import openai
def judge(response, expected, criteria):
prompt = f"""
你是一个公正的 AI 评分员。请根据以下标准对模型回答评分(1-5分)。
标准:{criteria}
预期回答:{expected}
模型回答:{response}
请只输出分数,不要解释。
"""
client = openai.OpenAI()
result = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": prompt}]
)
return int(result.choices[0].message.content.strip())
这种方法的好处是可批量、可复现,200 条测试用例 5 分钟跑完。开源的裁判 LLM 方案包括 Prometheus(来自韩国科学技术院 KAIST)和 JudgeLM(来自清华大学),它们本身就是为打分任务训练的小模型。
5. 评估流程全景图
把上面的方法串成一个流程:
- 微调前:在公开 Benchmark(MMLU、C-Eval)上记录 baseline 分数
- 微调中:监控验证集 Loss 和 Perplexity,避免过拟合
- 微调后第一步:跑同样的 Benchmark,对比 baseline → 确认通识能力没下降
- 微调后第二步:跑业务场景 A/B 测试 → 确认专业能力有提升
- 最终决断:人工抽样 20-50 条做多维度评分卡
如果 Benchmark 分数下降但业务测试分数提升——说明模型更专精了,这是正常的。但如果 Benchmark 和业务测试都下降了,说明微调出了问题(数据质量、学习率、过拟合)。
结尾
评估是对微调最后的尊重。没有评估的微调就像闭着眼睛开车——你以为在前进,其实可能已经偏到沟里了。
这五步流程用起来:基准测试保底 → 业务测试看效果 → 自动化评分提效率 → 人工抽查保质量。不需要每次都跑全流程——常规迭代跑 Benchmarks + 业务测试就够了,只有关键节点才加人工评测。
下期预告:多轮对话与 Chat Template — 我们系列里所有微调样例都是单轮问答。但现实中的对话是多轮、有上下文的。下一篇教你如何构建多轮对话数据集,以及 HuggingFace Chat Template 的正确用法,让你的模型真正学会”聊天”。
参考资料
- EleutherAI lm-evaluation-harness:https://github.com/EleutherAI/lm-evaluation-harness
- MMLU 论文:Measuring Massive Multitask Language Understanding — Hendrycks et al., 2020
- C-Eval 中文评测:https://cevalbenchmark.com/
- CMMLU 中文多领域评测:https://github.com/haonan-li/CMMLU
- GSM8K:Training Verifiers to Solve Math Word Problems — Cobbe et al., 2021
- Prometheus 裁判 LLM:https://github.com/kaistAI/prometheus
- JudgeLM:https://github.com/THUDM/JudgeLM
- Qwen2.5 官方评测说明:https://huggingface.co/Qwen/Qwen2.5-7B-Instruct
转载请注明:Falost的小窝 » 模型评测工具箱:微调后怎么知道模型变好了还是变差了



