Skip to content

模型评估

科学度量模型能力与训练效果

🎯 评估维度

来源:RLHF之PPO、DPO详解

模型评估流程LLM 训练与评估流程

评估目标

维度评估内容关键指标
语言能力理解、生成、推理Perplexity、BLEU
知识水平事实准确性基准测试得分
指令遵循按要求完成任务任务完成率
安全性有害内容、偏见安全评分
实用性人类满意度人工评估

评估时机

阶段评估重点方法
预训练语言建模能力Perplexity、下游任务零样本
SFT 后指令遵循能力任务完成率、BLEU/ROUGE
RLHF 后人类偏好对齐人工评估、奖励模型得分
部署前安全性、幻觉红队测试、TruthfulQA

📊 自动评估指标

语言质量

python
from evaluate import load

# 1. Perplexity - 困惑度
perplexity = load("perplexity")
results = perplexity.compute(
    predictions=["生成的文本"],
    model_id="gpt2"
)
print(f"Perplexity: {results['mean_perplexity']}")

# 2. BLEU - 机器翻译质量
bleu = load("bleu")
results = bleu.compute(
    predictions=["生成的翻译"],
    references=[["参考翻译1", "参考翻译2"]]
)
print(f"BLEU: {results['bleu']}")

# 3. ROUGE - 摘要质量
rouge = load("rouge")
results = rouge.compute(
    predictions=["生成的摘要"],
    references=["参考摘要"]
)
print(f"ROUGE-L: {results['rougeL']}")

生成质量

指标评估内容适用场景
Perplexity语言模型困惑度语言流畅性
BLEUn-gram精确匹配翻译、问答
ROUGE召回率导向摘要
BERTScore语义相似度通用文本生成
METEOR词干匹配+同义词翻译
python
# BERTScore - 语义相似度
from bert_score import score

P, R, F1 = score(
    cands=["生成的文本"],
    refs=["参考文本"],
    lang="zh"
)
print(f"BERTScore F1: {F1.mean()}")

🏆 基准测试

基准测试分类

┌─────────────────────────────────────────────────────────────┐
│                      LLM 评估基准                            │
├─────────────────┬─────────────────┬─────────────────────────┤
│   知识理解       │   推理能力       │   安全与对齐             │
├─────────────────┼─────────────────┼─────────────────────────┤
│  MMLU/C-Eval    │  GSM8K/MATH     │  TruthfulQA             │
│  CMMLU/GAOKAO   │  ARC/HellaSwag  │  红队测试               │
│  TriviaQA       │  BBH            │  偏见检测               │
└─────────────────┴─────────────────┴─────────────────────────┘

中文基准

基准评估内容说明难度
C-Eval中文综合能力52 个学科,1.4 万题中高
CMMLU中文多任务67 个主题
GAOKAO高考题目真实考试场景
AGIEval人类考试法考、公务员等

英文基准

基准评估内容说明难度
MMLU多任务理解57 个学科中高
HellaSwag常识推理完成句子
ARC科学推理小学科学题
TruthfulQA真实性抗幻觉能力
GSM8K数学推理小学数学题
HumanEval代码生成编程能力
MATH数学竞赛高难度数学极高

使用lm-evaluation-harness

bash
# 安装
pip install lm-eval

# 运行评估
lm_eval --model hf \
    --model_args pretrained=meta-llama/Llama-2-7b-hf \
    --tasks mmlu,hellaswag,arc_easy \
    --batch_size 8 \
    --output_path ./results
python
# Python API
from lm_eval import evaluator

results = evaluator.simple_evaluate(
    model="hf",
    model_args="pretrained=meta-llama/Llama-2-7b-hf",
    tasks=["mmlu", "hellaswag"],
    batch_size=8
)

print(results["results"])

👥 人工评估

为什么需要人工评估

问题说明
自动指标局限BLEU/ROUGE 与人类判断相关性有限
主观性任务创意写作、对话质量难以量化
安全性检测有害内容需人工判断
偏好对齐验证RLHF 效果需人类反馈

评估维度

维度评分标准说明
相关性1-5分回答是否切题
准确性1-5分信息是否正确
流畅性1-5分表达是否自然
有帮助性1-5分是否解决问题
安全性是/否是否存在有害内容
一致性1-5分多轮对话是否连贯

对比评估(A/B Test)

python
def pairwise_comparison(response_a: str, response_b: str, prompt: str):
    """让评估者选择更好的回答"""
    evaluation_prompt = f"""
请比较以下两个回答,选择更好的一个:

问题:{prompt}

回答A:{response_a}

回答B:{response_b}

请输出 "A" 或 "B" 或 "平手",并说明理由。
"""
    return evaluation_prompt

使用LLM作为评估者

python
def llm_as_judge(response: str, reference: str, criteria: str):
    """使用LLM评估响应质量"""
    prompt = f"""请根据以下标准评估回答质量,给出1-10分:

评估标准:{criteria}

参考答案:{reference}

待评估回答:{response}

请输出:
分数:[1-10]
理由:[简要说明]
"""
    return llm.generate(prompt)

📈 训练监控指标

训练曲线

python
# 关键监控指标
training_metrics = {
    "train_loss": "训练损失,应持续下降",
    "eval_loss": "验证损失,关注是否过拟合",
    "learning_rate": "学习率变化",
    "grad_norm": "梯度范数,检测梯度爆炸",
    "reward": "RLHF 阶段的奖励信号",
    "kl_divergence": "策略与参考模型的 KL 散度",
}

# TensorBoard可视化
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("./logs")
writer.add_scalar("train/loss", loss, step)
writer.add_scalar("eval/loss", eval_loss, step)

过拟合检测

训练损失验证损失状态建议
✅ 正常学习继续训练
❌ 过拟合早停、正则化、减少 epoch
⚠️ 学习停滞调大学习率、检查数据
❌ 训练失败减小学习率、检查梯度

SFT 特有监控

指标说明正常范围
Loss交叉熵损失持续下降,最终 1.5-2.5
Perplexity困惑度5-15(取决于任务)
Token AccuracyToken 级准确率逐步提升
Generation Quality生成样本质量定期人工检查

🔄 评估流程

┌─────────────────────────────────────────────────────┐
│                  评估流程                            │
├─────────────────┬─────────────────┬─────────────────┤
│   自动评估       │   基准测试       │   人工评估       │
├─────────────────┼─────────────────┼─────────────────┤
│  BLEU/ROUGE     │  MMLU/C-Eval    │  A/B对比        │
│  BERTScore      │  GSM8K          │  多维度打分      │
│  Perplexity     │  HellaSwag      │  LLM-as-Judge   │
└─────────────────┴─────────────────┴─────────────────┘

🔍 LLM-as-Judge 详解

为什么使用 LLM 作为评估者

方法优点缺点
人工评估最准确成本高、速度慢
自动指标快速、可复现与人类判断相关性低
LLM-as-Judge平衡成本与质量可能有偏见

常见评估模式

python
# 1. 单点评分(Point-wise)
def pointwise_eval(response, criteria):
    prompt = f"""请根据以下标准评估回答,给出 1-10 分:
    
标准:{criteria}
回答:{response}

输出格式:
分数:[1-10]
理由:[简要说明]"""
    return llm.generate(prompt)

# 2. 对比评估(Pairwise)
def pairwise_eval(response_a, response_b, question):
    prompt = f"""比较以下两个回答,选择更好的一个:
    
问题:{question}
回答A:{response_a}
回答B:{response_b}

输出:A 或 B 或 平手"""
    return llm.generate(prompt)

# 3. 参考对比(Reference-guided)
def reference_eval(response, reference, criteria):
    prompt = f"""参考标准答案评估回答质量:
    
标准答案:{reference}
待评估:{response}
评估标准:{criteria}"""
    return llm.generate(prompt)

🔗 相关阅读

相关文章

外部资源

基于 VitePress 构建