跳转至

第22章 · LLM Evaluation 方法学 · 阶段测试题答案


一 · 单选 (8 题)

1.1 B - BLEU 是 n-gram Precision。

1.2 A - MMLU 多学科知识。

1.3 B - LMSYS Arena 用 Bradley-Terry。

1.4 D - Position/Verbosity/Self-Bias 三大 bias。

1.5 C - Data Contamination 测试集泄露。

1.6 B - HELM 是 Stanford CRFM。

1.7 B - lm-evaluation-harness EleutherAI。

1.8 A - Benchmark Saturation 失效。


二 · 多选 (4 题)

2.1 ABCD - 都是传统 NLP 指标。

2.2 AB - Bradley-Terry 用于 Arena + 偏好。

2.3 ABC - LLM-as-Judge 3 种模式。

2.4 ABCDE - Harness 5 大支柱。


三 · 简答 (5 题)

3.1 BLEU vs BERTScore

  • BLEU: n-gram Precision, 不考虑语义
  • BERTScore: BERT 上下文 embedding 余弦相似度, 考虑语义
  • BERTScore 在开放式任务(摘要/翻译)更接近人类, BLEU 在精确匹配(代码)仍有优势

3.2 Construct Validity

答: Benchmark 真的在测它声称测的能力 例子: GSM8K 测数学推理, 但模型可能"死记"训练数据中相似题, 高分 ≠ 真推理 检测: 用 paraphrase 改写测试, 分数大幅下降说明没真推理

3.3 LLM-as-Judge Prompt 模板

You are evaluating two answers.
Question: {q}
Answer A: {a}
Answer B: {b}

Rate on:
1. Correctness (0-5)
2. Reasoning (0-5)
3. Clarity (0-5)

CoT: [step by step]

Output JSON: {"winner": "A/B/TIE", "scores_a": [...], "scores_b": [...]}

要素: 维度 + Few-shot + CoT + JSON 输出

3.4 5 大 Benchmark 互补

Benchmark 能力
MMLU 多学科知识
GSM8K 多步数学
HumanEval 代码生成
HellaSwag 常识推理
TruthfulQA 真实性

5 个互补覆盖: 知识 + 数学 + 代码 + 常识 + 真实

3.5 评测框架对比

框架 出品 特色
lm-evaluation-harness EleutherAI 通用 200+
OpenCompass 上海AI Lab 中文 + 多模态
HELM Stanford 7 维 × 16 场景

四 · 编程 (2 题)

4.1 Pairwise Judge (消除 Position Bias)

def pairwise_judge(judge_llm, answer_a, answer_b, prompt):
    v1 = judge_llm(f"{prompt}\nA: {answer_a}\nB: {answer_b}")
    v2 = judge_llm(f"{prompt}\nA: {answer_b}\nB: {answer_a}")
    # 转换 v2
    v2_inv = "A" if v2 == "B" else "B" if v2 == "A" else "TIE"
    return v1 if v1 == v2_inv else "TIE"

4.2 Contamination 检测

def detect_contamination(train_texts, test_texts, n=13):
    train_ngrams = set()
    for text in train_texts:
        tokens = text.split()
        for i in range(len(tokens) - n + 1):
            train_ngrams.add(tuple(tokens[i:i+n]))

    contaminated = 0
    for text in test_texts:
        tokens = text.split()
        if any(tuple(tokens[i:i+n]) in train_ngrams
               for i in range(len(tokens) - n + 1)):
            contaminated += 1
    return contaminated / len(test_texts)