extractbench-eval
ExtractBench: A Benchmark and Evaluation Methodology for Complex Structured Extraction — Ferguson et al. (2026) (arXiv:2602.12247, 2026)
What this evaluates
Evaluates LLMs on complex, schema-driven PDF-to-JSON structured extraction, testing their ability to handle nested objects, arrays, heterogeneous field types, and strict correctness criteria across enterprise-scale documents.
Datasets
Metrics
Pass Rate (primary) — range: percent
- Field-level pass rate where invalid extractions contribute 0. Computed as the fraction of fields that pass their schema-defined metric.
Valid JSON — range: percent
- Fraction of model outputs that are parseable and conform to the provided JSON Schema.
Acc (Valid) — range: percent
- Pass rate conditioned only on extractions that produced valid JSON.
string_semantic — range: [0, 1]
- LLM-based equivalence metric for free text, allowing domain-specific instructions for acceptable variations.
number_tolerance — range: [0, 1]
- Numeric comparison within a specified margin (e.g., 0.1%).
array_llm — range: percent
- Semantic alignment of object arrays using an LLM judge to map matched pairs, missed gold items, and spurious predictions, then computing precision, recall, and F1.
Input / output format
Input: PDF documents paired with a JSON Schema that defines the target extraction structure and per-field evaluation configurations.
Output: A JSON object containing extracted fields matching the schema structure. Must be parseable and schema-conforming to be considered valid.
Scoring recipe
def evaluate(gold, pred, schema):
if not is_valid_json(pred, schema):
return {"valid_json": False, "pass_rate": 0.0}
scores = []
for field in schema.fields:
g_val = gold.get(field.name)
p_val = pred.get(field.name)
if g_val is None and p_val is None:
scores.append(True)
elif g_val is None and p_val is not None:
scores.append(False) # hallucination
elif g_val is not None and p_val is None:
scores.append(False) # omission
else:
scores.append(field.metric(g_val, p_val, field.config))
return {"valid_json": True, "pass_rate": sum(scores)/len(scores)}
Common pitfalls
- Applying a single global metric (e.g., exact match) across all fields ignores heterogeneous correctness criteria like numeric tolerance or semantic equivalence.
- Ignoring the three-way missing value distinction (present, null, MISSING) conflates omissions with hallucinations and structural errors.
- Using position-based matching for arrays fails when models reorder, omit, or duplicate items, leading to artificially low scores.
Evidence (verbatim from paper)
Pass Rate: field-level pass rate (invalid extractions contribute 0). Acc (Valid): pass rate conditioned on valid extraction only.
Citation
@misc{ferguson2026extractbench,
title={ExtractBench: A Benchmark and Evaluation Methodology for Complex Structured Extraction},
author={Ferguson et al. (2026)},
year={2026},
note={arXiv:2602.12247}
}
1---2name: extractbench-eval3description: Evaluates LLMs on complex, schema-driven PDF-to-JSON structured extraction, testing their ability to handle nested objects, arrays, heterogeneous field types, and strict correctness criteria across enterprise-scale documents. Use when the user wants to benchmark on ExtractBench, or asks about evaluating this task. Reports Pass Rate.4---56# extractbench-eval78> ExtractBench: A Benchmark and Evaluation Methodology for Complex Structured Extraction — Ferguson et al. (2026) (arXiv:2602.12247, 2026)910## What this evaluates1112Evaluates LLMs on complex, schema-driven PDF-to-JSON structured extraction, testing their ability to handle nested objects, arrays, heterogeneous field types, and strict correctness criteria across enterprise-scale documents.1314## Datasets1516- **ExtractBench** — total 35; splits: benchmark (35); repo https://github.com/ContextualAI/extract-bench1718## Metrics1920- `Pass Rate` **(primary)** — range: percent21 - Field-level pass rate where invalid extractions contribute 0. Computed as the fraction of fields that pass their schema-defined metric.22- `Valid JSON` — range: percent23 - Fraction of model outputs that are parseable and conform to the provided JSON Schema.24- `Acc (Valid)` — range: percent25 - Pass rate conditioned only on extractions that produced valid JSON.26- `string_semantic` — range: [0, 1]27 - LLM-based equivalence metric for free text, allowing domain-specific instructions for acceptable variations.28- `number_tolerance` — range: [0, 1]29 - Numeric comparison within a specified margin (e.g., 0.1%).30- `array_llm` — range: percent31 - Semantic alignment of object arrays using an LLM judge to map matched pairs, missed gold items, and spurious predictions, then computing precision, recall, and F1.3233## Input / output format3435**Input**: PDF documents paired with a JSON Schema that defines the target extraction structure and per-field evaluation configurations.3637**Output**: A JSON object containing extracted fields matching the schema structure. Must be parseable and schema-conforming to be considered valid.3839## Scoring recipe4041```python42def evaluate(gold, pred, schema):43 if not is_valid_json(pred, schema):44 return {"valid_json": False, "pass_rate": 0.0}45 scores = []46 for field in schema.fields:47 g_val = gold.get(field.name)48 p_val = pred.get(field.name)49 if g_val is None and p_val is None:50 scores.append(True)51 elif g_val is None and p_val is not None:52 scores.append(False) # hallucination53 elif g_val is not None and p_val is None:54 scores.append(False) # omission55 else:56 scores.append(field.metric(g_val, p_val, field.config))57 return {"valid_json": True, "pass_rate": sum(scores)/len(scores)}58```5960## Common pitfalls6162- Applying a single global metric (e.g., exact match) across all fields ignores heterogeneous correctness criteria like numeric tolerance or semantic equivalence.63- Ignoring the three-way missing value distinction (present, null, MISSING) conflates omissions with hallucinations and structural errors.64- Using position-based matching for arrays fails when models reorder, omit, or duplicate items, leading to artificially low scores.6566## Evidence (verbatim from paper)6768> Pass Rate: field-level pass rate (invalid extractions contribute 0). Acc (Valid): pass rate conditioned on valid extraction only.6970## Citation7172```bibtex73@misc{ferguson2026extractbench,74 title={ExtractBench: A Benchmark and Evaluation Methodology for Complex Structured Extraction},75 author={Ferguson et al. (2026)},76 year={2026},77 note={arXiv:2602.12247}78}79```8081- arXiv: 2602.12247