主题
📏 模型评估与测试
微调完了怎么知道好不好?——科学的评估方法让结果有说服力
为什么要评估
微调后的模型可能:
- 背下了训练数据但遇到新问题就崩(过拟合)
- 在某个方面变好了但其他能力退化了(灾难性遗忘)
- 看起来输出变好了但用评估指标一测其实是幻觉
不评估的微调等于盲调。
评估方法
1. 自动评估(量化指标)
python
from evaluate import load
# BLEU(翻译质量)
bleu = load("bleu")
predictions = ["审查结果显示该条款存在三项风险"]
references = [["该条款存在三项风险需要修改"]]
print(bleu.compute(predictions=predictions, references=references))
# ROUGE(摘要质量)
rouge = load("rouge")
print(rouge.compute(predictions=predictions, references=references))| 指标 | 用途 | 范围 |
|---|---|---|
| BLEU | 翻译/生成质量 | 0-1,越高越好 |
| ROUGE-L | 摘要/生成覆盖度 | 0-1,越高越好 |
| Perplexity | 语言流畅度 | 越低越好 |
| Accuracy | 分类/判断准确率 | 0-1,越高越好 |
自动评估有局限——同样的语义不同措辞可能得分低。所以不能全靠自动指标。
2. 人工评估
构建 50-100 条测试样本,每条对比微调前后的输出:
测试样本 #1:
输入:审查:合同约定违约金为日千分之五
微调前:每日千分之五的违约金比例...
微调后:[风险等级] 高 | 日千分之五折合年化 182.5%,超出法定 24% 上限...人工判断维度:
- 准确性:答案对吗
- 完整性:漏了关键信息吗
- 格式:输出结构符合要求吗
- 流畅度:读起来通顺吗
3. 基准测试
用公开数据集做标准化对比:
python
# 用 MMLU 测通用知识
# 用 C-Eval 测中文能力
# 用 HumanEval 测代码能力
# 或用 lm-evaluation-harness 一键评测
# pip install lm-eval
lm_eval --model hf \
--model_args pretrained=./qwen-contract-merged \
--tasks mmlu,ceval-valid \
--batch_size auto微调效果检查清单
- [ ] 训练 loss 稳定下降
- [ ] 验证 loss 不反弹(不反弹 = 不过拟合)
- [ ] 测试集自动指标不低于微调前
- [ ] 人工评估 50 条通过率 >80%
- [ ] 通用能力没有明显退化(随便问几个微调领域外的问题)
- [ ] 没有生成重复/乱码(检查 20 条输出)
- [ ] 输出格式符合要求(如包含"风险等级""建议"等字段)
常见问题
验证 loss 一直涨
过拟合了。解法:
- 减少 epoch 数
- 加大 lora_dropout
- 增加训练数据
微调后通用能力严重退化
灾难性遗忘。解法:
- 训练数据里混入 10% 通用数据
- 降低学习率
- 减少 epoch 数
输出格式化不稳定
模型没学会固定输出格式。解法:
- 训练数据里 format 要高度一致
- instruction 里加上格式要求:"请按【风险等级】【分析】【建议】三段式输出"
法眼场景评估示例
构建 50 份合同审查测试集:
| 能力维度 | 测试样本数 | 通过标准 |
|---|---|---|
| 违约金识别 | 15 | 正确识别异常比例 |
| 免责条款分析 | 10 | 指出不公平条款 |
| 保密协议审查 | 10 | 识别范围过宽 |
| 格式规范性 | 15 | 输出含三段式结构 |
目标:通过率 85% 以上才算达标。
🎯 本章要点
- 评估三件套:自动指标(BLEU/ROUGE)+ 人工评估 + 基准测试
- 验证 loss 不反弹是最基本的过拟合检测
- 灾难性遗忘解法:混 10% 通用数据、降学习率、减 epoch
- 格式稳定靠统一训练数据格式 + instruction 里明确输出要求
加载练习题中...