第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)