数据截至 (上游 commit dd417662e5bd)
03 · 四种请求类型与执行
这一章讲什么: 分数语义的核心——一道题怎么变成发给模型的请求,模型的回答怎么变回 0/1。读完你会明白「MMLU 55 分」里的「分」到底是哪个量,以及为什么这套分数几乎不含随机性。
1. 它要解决的小问题
benchmark 题型千差万别:选择题(ARC)、续写判对错(LAMBADA)、整文流畅度(WikiText perplexity)、自由生成后抽答案(GSM8K)。如果每种题型一套执行逻辑,框架会被题型数量拖垮。
harness 的归约:题型只有四种,对应四种请求。所有任务必须把自己的「答题」表达成这四种之一:
output_type | 模型要做什么 | 典型任务 |
|---|---|---|
loglikelihood | 给 (context, continuation) 算 continuation 的 log 概率 | LAMBADA(预测最后一个词) |
multiple_choice | 对每个选项算 log 概率,比大小 | ARC、MMLU、HellaSwag |
loglikelihood_rolling | 给整篇文本算 log 概率(滑动窗口) | WikiText、Pile perplexity |
generate_until | 自由生成,直到停止符 | GSM8K、HumanEval |
第一直觉:能把「答题」变成「算概率」,就绝不让模型「生成」。生成有温度、有停止符、有格式漂移;算概率是纯函数——同一个模型、同一份输入,永远得到同一个数。这是 harness 分数可复现的根基。
2. Instance:请求的统一容器
四种请求共享一个 dataclass(lm_eval/api/instance.py:11):
# 摘自 lm_eval/api/instance.py:10-25(字段全览)
@dataclass
class Instance:
request_type: OutputType # 四种之一
doc: dict # 原始题目(判分时还要用)
arguments: tuple # 发给模型的参数,形状随类型变
idx: int # 同一 doc 扇出多条时的序号
metadata: Tuple[...] # (task_name, doc_id, repeats)
resps: list # 模型响应,执行后由 evaluator 填
filtered_resps: dict # 每条 filter 流水线处理后的响应
两个设计点:
doc跟着请求走。 判分(process_results)需要原始题目(比如 gold 答案),所以请求自带 doc,执行端不需要回查数据集。resps/filtered_resps是「回收站」。 请求发出去后,响应按顺序塞回同一个 Instance(lm_eval/evaluator.py:603-604),判分阶段再从 Instance 上取——请求与响应通过对象身份对齐,不靠 ID 匹配。
arguments 的形状由类型决定(construct_requests,lm_eval/api/task.py:1362):
| 类型 | arguments |
|---|---|
loglikelihood | (ctx, doc_to_target(doc)) |
multiple_choice | 每个选项一条 (ctx, " 选项文本") |
loglikelihood_rolling | (doc_to_target(doc),)——只有全文,没有 context |
generate_until | (ctx, generation_kwargs dict) |
3. 扇出:一道 multiple_choice 题变成 N 条请求
multiple_choice 是理解整套机制的最佳样本。看 construct_requests 的分派(lm_eval/api/task.py:1374-1390):
# 摘自 lm_eval/api/task.py:1374-1390(multiple_choice 分支)
choices = self.doc_to_choice(doc)
target_delimiter = self.config.target_delimiter
...
arguments = [(ctx, f"{target_delimiter}{cont}") for cont in choices]
四个选项 = 四条 loglikelihood 请求,idx 从 0 到 3,最后统一建 Instance(lm_eval/api/task.py:1433-1445)。所以 multiple_choice 根本不存在于执行层——到模型那只有 loglikelihood。