LLM评估
1. LLM基准测试
1.1 知识与推理基准
| 基准 | 评估内容 | 数据规模 | 评估方式 |
|---|---|---|---|
| MMLU | 57个学科的多选题知识 | ~16K题 | 准确率 |
| MMLU-Pro | MMLU升级版,10选1,更难 | ~12K题 | 准确率 |
| ARC | 小学科学推理 | ~7.8K题 | 准确率 |
| HellaSwag | 常识推理(句子补全) | ~10K题 | 准确率 |
| Winogrande | 常识推理(代词消解) | ~1.3K题 | 准确率 |
| TruthfulQA | 真实性评估(抗幻觉) | ~817题 | 真实性+信息量 |
1.2 数学与编程基准
| 基准 | 评估内容 | 数据规模 | 评估方式 |
|---|---|---|---|
| GSM8K | 小学数学应用题 | 8.5K题 | 准确率 |
| MATH | 高中/竞赛数学 | 12.5K题 | 准确率 |
| HumanEval | Python代码生成 | 164题 | Pass@K |
| MBPP | Python代码生成(简单) | 974题 | Pass@K |
| SWE-bench | 真实软件工程任务 | 2294题 | 解决率 |
1.3 综合评估平台
HELM (Holistic Evaluation of Language Models)
评估维度:
- 准确性 (Accuracy)
- 校准性 (Calibration)
- 鲁棒性 (Robustness)
- 公平性 (Fairness)
- 偏见 (Bias)
- 毒性 (Toxicity)
- 效率 (Efficiency)
覆盖场景:
- 问答、摘要、翻译、分类等42个场景
- 59个指标
Chatbot Arena
评估方式:
- 用户与两个匿名模型同时对话
- 用户投票选择更好的回答
- 使用Elo评分系统排名
优势:
- 反映真实用户偏好
- 持续更新排名
- 覆盖开放式对话能力
1.4 基准测试的局限
- 数据污染: 训练数据可能包含测试集
- Goodhart定律: 针对基准优化不等于真正能力提升
- 覆盖不足: 基准可能不反映实际应用需求
- 静态性: 基准不随时间更新
2. 评估方法
2.1 基于参考的评估 (Reference-Based)
BLEU
from nltk.translate.bleu_score import sentence_bleu
reference = [["the", "cat", "sat", "on", "the", "mat"]]
candidate = ["the", "cat", "is", "on", "the", "mat"]
score = sentence_bleu(reference, candidate)
- 基于n-gram重叠度
- 适用: 翻译评估
- 局限: 与人类判断相关性有限
ROUGE
from rouge_score import rouge_scorer
scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'])
scores = scorer.score(
"The cat sat on the mat",
"The cat is on the mat"
)
- ROUGE-1: 单词重叠
- ROUGE-2: 二元组重叠
- ROUGE-L: 最长公共子序列
- 适用: 摘要评估
BERTScore
from bert_score import score
P, R, F1 = score(
cands=["The cat is on the mat"],
refs=["The cat sat on the mat"],
lang="en"
)
- 基于BERT嵌入的语义相似度
- 比BLEU/ROUGE更好地捕捉语义等价
2.2 无参考评估 (Reference-Free)
LLM-as-Judge
使用强模型(如GPT-4)评估其他模型的输出:
judge_prompt = """
请评估以下AI助手的回答质量。
用户问题:{question}
AI回答:{answer}
请从以下维度评分(1-5分):
1. 相关性:回答是否针对问题
2. 准确性:信息是否准确
3. 完整性:是否覆盖问题的各个方面
4. 清晰度:表达是否清晰易懂
5. 有用性:对用户是否有实际帮助
请以JSON格式输出:
{
"relevance": <score>,
"accuracy": <score>,
"completeness": <score>,
"clarity": <score>,
"helpfulness": <score>,
"overall": <score>,
"reasoning": "<评分理由>"
}
"""
LLM-as-Judge的偏差:
- 位置偏差: 倾向于选择第一个回答
- 冗长偏差: 倾向于偏好更长的回答
- 自我偏好: 模型倾向于偏好自己的输出
- 缓解方法: 随机化顺序、多次评估取平均
Pairwise Comparison
comparison_prompt = """
以下是两个AI助手对同一问题的回答,请判断哪个更好。
问题:{question}
回答A:{answer_a}
回答B:{answer_b}
请选择:
- A更好
- B更好
- 两者差不多
理由:
"""
2.3 人工评估 (Human Evaluation)
评估流程:
1. 准备评估数据集(100-500条)
2. 设计评估标准和打分量表
3. 培训标注团队
4. 多人独立评估(至少2-3人)
5. 计算评估者间一致性(Cohen's Kappa)
6. 汇总和分析结果
评估维度:
| 维度 | 1分 | 3分 | 5分 |
|---|---|---|---|
| 流畅性 | 不通顺 | 基本通顺 | 自然流畅 |
| 相关性 | 完全偏题 | 部分相关 | 高度相关 |
| 准确性 | 多处错误 | 部分正确 | 完全正确 |
| 有用性 | 无帮助 | 有些帮助 | 非常有帮助 |
3. 自动评估Pipeline
3.1 评估流水线设计
class LLMEvaluationPipeline:
def __init__(self):
self.metrics = {
"reference_based": [BleuMetric(), RougeMetric(), BertScoreMetric()],
"reference_free": [LLMJudgeMetric(), CoherenceMetric()],
"safety": [ToxicityMetric(), BiasMetric(), HallucinationMetric()],
"performance": [LatencyMetric(), ThroughputMetric(), CostMetric()],
}
def evaluate(self, test_set, model_output):
results = {}
for category, metrics in self.metrics.items():
results[category] = {}
for metric in metrics:
score = metric.compute(test_set, model_output)
results[category][metric.name] = score
return results
def generate_report(self, results):
"""生成评估报告"""
report = {
"timestamp": datetime.now(),
"model": self.model_name,
"results": results,
"summary": self.summarize(results),
"recommendations": self.recommend(results),
}
return report
3.2 持续评估
# 定期评估(每日/每周)
schedule.every().day.at("02:00").do(run_evaluation)
def run_evaluation():
# 1. 从生产日志中采样
samples = sample_production_logs(n=500)
# 2. 运行评估
results = pipeline.evaluate(samples)
# 3. 与基线对比
baseline = load_baseline()
regression = detect_regression(results, baseline)
# 4. 告警
if regression:
alert(f"Performance regression detected: {regression}")
# 5. 记录结果
log_results(results)
4. 领域特定评估
4.1 医疗领域
评估维度:
- 医学准确性(与临床指南一致性)
- 安全性(不提供有害建议)
- 免责声明(建议就医)
- 隐私保护(不泄露患者信息)
4.2 法律领域
评估维度:
- 法律准确性(法规引用正确性)
- 管辖适用性(正确识别适用法律)
- 时效性(法规是否最新)
- 风险提示(明确说明不构成法律建议)
4.3 教育领域
评估维度:
- 知识准确性
- 解释清晰度(适合目标年龄层)
- 教学方法(引导式vs直接给答案)
- 鼓励性(积极正面的反馈)
4.4 代码生成
# 代码生成评估
class CodeEvaluator:
def evaluate(self, generated_code, test_cases):
results = {
"pass_rate": self.run_tests(generated_code, test_cases),
"syntax_valid": self.check_syntax(generated_code),
"style_score": self.check_style(generated_code), # PEP 8等
"security_issues": self.security_scan(generated_code),
"complexity": self.calculate_complexity(generated_code),
}
return results
5. 评估最佳实践
5.1 评估数据集设计
- 多样性: 覆盖不同难度、主题、长度
- 代表性: 反映实际生产流量分布
- 边界案例: 包含已知的困难案例
- 持续更新: 根据新发现的失败案例更新
- 避免污染: 确保评估数据不在训练集中
5.2 多维评估
不要只看单一指标!
好的评估 =
质量指标(准确性、相关性、完整性)
+ 安全指标(幻觉率、毒性、偏见)
+ 性能指标(延迟、吞吐量)
+ 成本指标(每查询成本)
+ 用户指标(满意度、留存率)
5.3 评估陷阱
- 过度拟合基准: 在基准上表现好不等于实际好用
- 忽略分布: 平均分高不代表没有严重失败
- 忽略安全: 质量高但不安全的模型是危险的
- 评估成本: LLM-as-Judge也有成本,需要权衡
6. 总结
| 方法 | 成本 | 速度 | 准确性 | 适用阶段 |
|---|---|---|---|---|
| BLEU/ROUGE | 极低 | 极快 | 低 | 快速筛选 |
| BERTScore | 低 | 快 | 中 | 语义评估 |
| LLM-as-Judge | 中 | 中 | 中高 | 常规评估 |
| 人工评估 | 高 | 慢 | 高 | 关键决策 |
| Chatbot Arena | 中 | 慢 | 最高 | 模型排名 |
推荐组合:
- 日常开发: 自动指标 + LLM-as-Judge
- 版本发布: + 人工评估 + A/B测试
- 模型选型: + 基准测试 + 领域评估
参考资料
- Hendrycks et al., "Measuring Massive Multitask Language Understanding", 2021
- Chen et al., "Evaluating Large Language Models Trained on Code", 2021 (HumanEval)
- Liang et al., "Holistic Evaluation of Language Models", 2023 (HELM)
- Zheng et al., "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena", 2023
- 基准测试 — Agent评估基准
- AB测试与上线 — A/B测试方法