跳转至

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测试方法

评论 #