MultiRC

Multi-Sentence Reading Comprehension

Tests whether a model can answer questions that need information from several sentences, where more than one option can be correct.

Released Jun 2018 Metric SuperGLUE test SOTA 89.6 F1a / 65.8 EM · ST-MoE-32B (2022)
01

At a glance

Task
Label each (question, candidate answer) pair true/false
Size
~10k questions, ~27k answer options, 871 paragraphs
Metric
F1 over all answer options (F1a) and exact match per question (EM)
Source
News, fiction, science, travel guides, Wikipedia — 7 domains
Part of
SuperGLUE
Looking Beyond the Surface: A Challenge Set for Reading Comprehension over Multiple Sentences
Khashabi, Chaturvedi, Roth, Upadhyay, Roth · NAACL 2018
Read the paper ↗ Hugging Face ↗
02

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'.

03

Examples

Items from the dataset (or representative items where the originals are not freely redistributable).

Paragraph (excerpt)
Susan wanted to have a birthday party. She called all of her friends. She has five friends. Her mom said that Susan can invite them all to the party. Her first friend could not go to the party because she was sick. Her second friend was going out of town. Her third friend was not so sure if her parents would let her…
Question
Did Susan's sick friend recover?
Candidates
'Yes, she recovered' · 'No' · 'Yes' · 'No, she didn't recover' · 'Yes, she was at Susan's party'
AnswerTrue: 'Yes', 'Yes, she recovered', 'Yes, she was at Susan's party' · False: the two 'No' options
04

Reported results

Scores reported on this benchmark, with the evaluation setting each one used.

SettingReportedContext
Few-shot (32 examples), SuperGLUE75.4 F1a / 30.5 EMZero-shot 72.9 / 13.6; fine-tuned SOTA then 88.2 / 63.0
05

State of the art

Best known · SuperGLUE test
89.6 F1a / 65.8 EM
✓ saturated · at or above human level
Model
ST-MoE-32B
2022
Human baseline
81.8 / 51.9

Source: arxiv.org ↗ · checked October 2026.

06

Quickstart

Load the benchmark and score a Hugging Face causal LM on it in a few lines.

1Install
shell
pip install -U datasets transformers evaluate lm-eval sacrebleu rouge-score scikit-learn
2Load the data

paragraph, question, answer (candidate), label (0 false · 1 true), idx (paragraph/question/answer ids — group by question for EM)

python · load
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])
3Score a model

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.

python · helpers
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
python · evaluate
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)
4Or use lm-evaluation-harness

Task name(s): multirc. The harness reproduces the GPT-3 prompt formats and reports the standard metric.

shell
lm_eval --model hf --model_args pretrained=gpt2,dtype=bfloat16 \
        --tasks multirc --num_fewshot 0 --batch_size auto --output_path results/
07

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.
08

References