Dataset
Invoice extraction by three low cost LLMs
288 raw model responses, 24 script generated invoices with their ground truth, four levels of degradation. Test conducted on 2026-08-10.
This page describes one dataset, published in full. It is the raw material behind our measurement of silent extraction errors: 24 supplier invoices, four levels of text degradation, three low cost models, and the 288 responses those models actually returned.
Everything on this page comes from that one run. Nothing is estimated.
What it measures, and what it does not prove
It measures one thing precisely: how often an extraction is wrong, silent, and
plausible. Wrong, meaning at least one of seven fields does not match the ground
truth. Silent, meaning the model filled no warning in the notes field it was
explicitly offered. Plausible, meaning subtotal + tax = total_due still holds, so
the cheapest available check does not fire.
What it does not prove, stated plainly, because a dataset quoted without its limits does more harm than no dataset at all:
- The input is text, not scanned images. It says nothing about OCR character errors, which can only make results worse.
- The corpus is built by script, not collected. No real invoice, no real supplier.
- 24 invoices. A test on 24 cases is a test on 24 cases.
- One run per combination, at temperature 0. Gaps of one or two points between models are not significant here. The shape of the errors is what holds.
- English only, one page per invoice.
- Three entry level models. Nothing here says what more expensive ones would do.
The corpus is built, and here is what that means
The 24 invoices were generated by script with the fixed seed 20260810. That is a
deliberate trade, and it cuts both ways.
What it buys: the ground truth is known without argument, and anyone can regenerate the exact same corpus and disagree with our reading of it. What it costs: these are not real documents, and the layouts a real supplier produces are more varied than anything a generator invents.
Four difficulties were inserted, each of them resolved by the document itself so that a single defensible answer exists: a deposit already paid and deducted, a discount applied before tax, an ambiguous currency symbol resolved in words, and an ambiguous date format resolved on the next line.
Test conducted on 2026-08-10. This page was published on 2026-08-13. The extractions were run by the automated testing pipeline of this site: the corpus, the model calls and the analysis are scripts, and all of them are in the archive below.
Raw figures
Invoices fully correct, out of 24
| Model | N1 clean | N2 columns lost | N3 totals shuffled | N4 labels lost |
|---|---|---|---|---|
| openai/gpt-4o-mini | 24/24 | 24/24 | 21/24 | 14/24 |
| google/gemini-2.5-flash-lite | 24/24 | 24/24 | 18/24 | 19/24 |
| anthropic/claude-haiku-4.5 | 24/24 | 24/24 | 12/24 | 18/24 |
| All models | 72/72 | 72/72 | 51/72 | 51/72 |
Silent failure
| Level | Wrong extractions | Wrong with no warning | Share |
|---|---|---|---|
| N1 clean | 0 | 0 | not applicable |
| N2 columns lost | 0 | 0 | not applicable |
| N3 totals shuffled | 21 | 3 | 14.3 percent |
| N4 labels lost | 21 | 10 | 47.6 percent |
The arithmetic check, subtotal + tax = total due
| Level | Wrong ones caught | Catch rate | Correct ones flagged wrongly | False alarm rate |
|---|---|---|---|---|
| N1 clean | 0 | not applicable | 18 | 25.0 percent |
| N2 columns lost | 0 | not applicable | 18 | 25.0 percent |
| N3 totals shuffled | 10 | 47.6 percent | 6 | 11.8 percent |
| N4 labels lost | 15 | 71.4 percent | 12 | 23.5 percent |
Which field breaks
| Field | N1 | N2 | N3 | N4 |
|---|---|---|---|---|
| invoice_number, invoice_date, due_date, currency | 0 | 0 | 0 | 0 |
| subtotal | 0 | 0 | 0 | 17 |
| tax | 0 | 0 | 0 | 3 |
| total_due | 0 | 0 | 21 | 10 |
Run totals
| Quantity | Value |
|---|---|
| Extractions | 288 |
| Technical failures | 0 |
| Invalid JSON responses | 0 |
| Total API cost | 0.11951 USD |
| Wrong, silent and passing the arithmetic check | 8 |
What the archive contains
Seven files, 393777 bytes uncompressed. The inventory is here so you know what you are downloading before you download it.
| File | What it holds | Size |
|---|---|---|
generer-corpus.py |
the corpus generator, fixed seed 20260810 | 7.2 KiB |
corpus.json |
the 24 invoices and their ground truth | 28.6 KiB |
degrader.py |
the four degradation levels | 2.6 KiB |
conduire-test.py |
the model calls and the field by field comparison | 6.6 KiB |
resultats-bruts.json |
the 288 responses, raw, with the prompt used | 326.7 KiB |
analyser.py |
the computation of every figure on this page | 4.6 KiB |
chiffres.json |
the computed figures | 8.4 KiB |
The scripts and their comments are in French, which is the working language behind this site. The API key is read from an environment variable and appears in none of these files.
Rerun it
The generator uses a fixed seed, so the corpus you produce is the corpus we used.
unzip 2026-08-invoice-extraction.zip
cd 2026-08-invoice-extraction
python3 generer-corpus.py --sortie corpus.json
python3 conduire-test.py --corpus corpus.json --sortie resultats-bruts.json \
--niveaux 1 2 3 4 \
--modeles openai/gpt-4o-mini google/gemini-2.5-flash-lite anthropic/claude-haiku-4.5
python3 analyser.py --resultats resultats-bruts.json --sortie chiffres.jsonEach raw response is one line of resultats-bruts.json, with the fields the model
returned, which of them matched, whether it warned about anything, and whether the
arithmetic check passed:
{"modele": "openai/gpt-4o-mini", "facture": "F04", "niveau": 3,
"json_valide": true, "nb_champs_justes": 6, "tous_les_champs_justes": false,
"a_signale_quelque_chose": false, "controle_arithmetique_passe": true}Verify what you downloaded before you trust it:
shasum -a 256 2026-08-invoice-extraction.zip
# 8d8982b037ddb6b0a1c6c420375024e6d63bfc9aff8852c49c8a22766ecddd84How to cite this dataset
Copy one of the two forms below. The reference points at this page, which is the stable address of this dataset; the archive is what that address serves.
Think AI First (2026). Invoice extraction by three low cost LLMs, 288 raw responses.
Think AI First. Test conducted 2026-08-10, published 2026-08-13.
https://think-ai-first.com/datasets/invoice-extraction-2026-08. Licensed CC BY 4.0.@dataset{thinkaifirst2026invoice,
author = {{Think AI First}},
title = {Invoice extraction by three low cost LLMs, 288 raw responses},
year = {2026},
publisher = {Think AI First},
url = {https://think-ai-first.com/datasets/invoice-extraction-2026-08},
note = {Test conducted 2026-08-10. Licensed CC BY 4.0. Archive SHA-256 8d8982b037ddb6b0a1c6c420375024e6d63bfc9aff8852c49c8a22766ecddd84}
}Licence and reuse
Published under CC BY 4.0. Use it, quote it, contradict it. If you rerun this and get something different, tell us through the contact form: corrections are published on the article itself, dated.
Download the dataset (zip, 27.8 KiB, 7 files)
Other datasets published here
Each one is a separate test, with its own corpus, its own raw responses and its own archive.
- Contact list deduplication by three low cost LLMs, 96 raw responses, test conducted 2026-08-17.
- Meeting action item extraction by three low cost LLMs, 96 raw responses, test conducted 2026-08-18.