MultiRC
Tests whether a model can answer questions that need information from several sentences, where more than one option can be correct.
At a glance
What it tests
Most reading-comprehension sets can be gamed by finding the one sentence that answers the question. MultiRC was filtered so that every question needs at least two sentences, and instead of one correct option there are several candidates of which any subset may be right.
A model therefore makes a yes/no call for every candidate, and a question only counts as solved (EM) if every call is right. F1a treats each candidate as a separate binary prediction and is the softer headline number.
GPT-3 reported 75.4 F1a but only 30.5 EM few-shot — a good illustration of how much harder 'get every option right' is than 'get most options right'.
Examples
Items from the dataset (or representative items where the originals are not freely redistributable).
Reported results
Scores reported on this benchmark, with the evaluation setting each one used.
| Setting | Reported | Context |
|---|---|---|
| Few-shot (32 examples), SuperGLUE | 75.4 F1a / 30.5 EM | Zero-shot 72.9 / 13.6; fine-tuned SOTA then 88.2 / 63.0 |
State of the art
Source: arxiv.org ↗ · checked October 2026.
Quickstart
Load the benchmark and score a Hugging Face causal LM on it in a few lines.
pip install -U datasets transformers evaluate lm-eval sacrebleu rouge-score scikit-learn
paragraph, question, answer (candidate), label (0 false · 1 true), idx (paragraph/question/answer ids — group by question for EM)
from datasets import load_dataset ds = load_dataset("aps/super_glue", "multirc", split="validation") print(ds) # columns: paragraph, question, answer (candidate), label (0 false · 1 true), idx (paragraph/question print(ds[0])
Two helpers cover every benchmark in this collection: loglik for anything multiple-choice (score each option, pick the highest) and generate for anything free-form. Swap MODEL for whatever you are evaluating.
import torch from transformers import AutoTokenizer, AutoModelForCausalLM MODEL = "gpt2" # or "Qwen/Qwen2.5-1.5B", "meta-llama/Llama-3.2-1B", … tok = AutoTokenizer.from_pretrained(MODEL); model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.bfloat16).eval().to("cuda") @torch.no_grad() def loglik(context, continuation): """Sum of log-probs of `continuation` tokens given `context` — the standard multiple-choice scorer.""" ids = tok(context + continuation, return_tensors="pt").input_ids.to(model.device) n_ctx = len(tok(context).input_ids) logp = model(ids).logits.log_softmax(-1)[0, :-1] return logp.gather(1, ids[0, 1:, None])[n_ctx - 1:].sum().item() @torch.no_grad() def generate(prompt, max_new_tokens=32, stop=None): ids = tok(prompt, return_tensors="pt").input_ids.to(model.device) out = model.generate(ids, max_new_tokens=max_new_tokens, do_sample=False, pad_token_id=tok.eos_token_id) text = tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True) return text.split(stop)[0] if stop else text
from collections import defaultdict by_q = defaultdict(list) # group rows by question for EM for ex in ds: p = f"{ex['paragraph']}\nQuestion: {ex['question']}\nCandidate answer: {ex['answer']}\nIs the candidate correct? yes or no?\nAnswer:" pred = int(loglik(p, " yes") > loglik(p, " no")) by_q[(ex["idx"]["paragraph"], ex["idx"]["question"])].append((pred, ex["label"])) em = sum(all(p == g for p, g in v) for v in by_q.values()) / len(by_q) preds = [p for v in by_q.values() for p, _ in v]; golds = [g for v in by_q.values() for _, g in v] from sklearn.metrics import f1_score print("F1a", f1_score(golds, preds), "EM", em)
Task name(s): multirc. The harness reproduces the GPT-3 prompt formats and reports the standard metric.
lm_eval --model hf --model_args pretrained=gpt2,dtype=bfloat16 \
--tasks multirc --num_fewshot 0 --batch_size auto --output_path results/Pitfalls
- Each row is one candidate; group rows by idx.question to compute EM.
- Report both F1a and EM; they tell very different stories.
- Candidate answers are not spans — they are free text written by annotators, so lexical matching is weak.
References
- Paper (NAACL 2018)https://aclanthology.org/N18-1023/
- Dataset pagehttps://cogcomp.seas.upenn.edu/multirc/
- Hugging Face (super_glue/multirc)https://huggingface.co/datasets/aps/super_glue