aditya0103 commited on
Commit
bc61ea7
Β·
1 Parent(s): 81f6090

eval: multi-model benchmark - nano is Pareto-optimal (0.896 micro F1 at 0.0116/doc)

Browse files
Files changed (23) hide show
  1. README.md +38 -4
  2. evaluation/benchmarks/20260705T064740Z/comparison.csv +4 -0
  3. evaluation/benchmarks/20260705T064740Z/comparison.json +52 -0
  4. evaluation/benchmarks/20260705T064740Z/comparison.md +14 -0
  5. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_per_record.csv +71 -0
  6. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_summary.json +312 -0
  7. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_summary.md +40 -0
  8. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_per_record.csv +44 -0
  9. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_summary.json +240 -0
  10. evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_summary.md +33 -0
  11. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_per_record.csv +71 -0
  12. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_summary.json +312 -0
  13. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_summary.md +40 -0
  14. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_per_record.csv +34 -0
  15. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_summary.json +240 -0
  16. evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_summary.md +30 -0
  17. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_per_record.csv +71 -0
  18. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_summary.json +312 -0
  19. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_summary.md +40 -0
  20. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_per_record.csv +43 -0
  21. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_summary.json +240 -0
  22. evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_summary.md +32 -0
  23. scripts/run_multimodel_benchmark.py +213 -0
README.md CHANGED
@@ -39,7 +39,7 @@ Enterprise doc extraction is one of the highest-demand LLM use cases in 2026. Th
39
  - Schema-driven extraction with **OpenAI structured outputs** + Pydantic validation
40
  - **Vision-language handling** for scanned/image PDFs (GPT-5 nano vision)
41
  - **Long-document handling** for 10-K / 10-Q filings (400K context, minimal chunking)
42
- - **Multi-model benchmarking** β€” quantifies GPT-5 nano vs GPT-5.4 vs GPT-5.5 cost/quality tradeoffs
43
  - **Evaluation harness** with precision / recall / F1 on public ground truth (SROIE, CORD)
44
  - **Cost + latency observability** β€” every extraction logs tokens and $
45
  - Full-stack: **FastAPI** backend, **React + Motion + R3F** UI, **Docker**, GitHub Actions **CI**
@@ -99,8 +99,42 @@ python scripts/run_eval.py \
99
  --reasoning-effort minimal
100
  ```
101
 
102
- Next: multi-model benchmark (nano vs mini vs full gpt-5.4), then real image
103
- PDFs from the SROIE test split for a stricter, OCR-inclusive number.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  ## Architecture
106
 
@@ -129,7 +163,7 @@ PDFs from the SROIE test split for a stricter, OCR-inclusive number.
129
 
130
  | Layer | Choice | Why |
131
  |-------|--------|-----|
132
- | LLM | OpenAI GPT-5 nano (default) + benchmarking against GPT-5.4 / GPT-5.5 | 400K context, vision, structured outputs, ~50x cheaper than GPT-4o |
133
  | Schema | Pydantic v2 | Runtime validation + JSON schema for OpenAI |
134
  | PDF text | pdfplumber, PyMuPDF | Fast, robust, handles most layouts |
135
  | PDF images | pdf2image + Pillow | For scanned/image-heavy PDFs β†’ vision model |
 
39
  - Schema-driven extraction with **OpenAI structured outputs** + Pydantic validation
40
  - **Vision-language handling** for scanned/image PDFs (GPT-5 nano vision)
41
  - **Long-document handling** for 10-K / 10-Q filings (400K context, minimal chunking)
42
+ - **Multi-model benchmarking** β€” empirically compared gpt-5-nano vs gpt-5-mini vs gpt-5 on the same 10-record eval; nano is Pareto-optimal (micro F1 0.896 at $0.012/doc)
43
  - **Evaluation harness** with precision / recall / F1 on public ground truth (SROIE, CORD)
44
  - **Cost + latency observability** β€” every extraction logs tokens and $
45
  - Full-stack: **FastAPI** backend, **React + Motion + R3F** UI, **Docker**, GitHub Actions **CI**
 
99
  --reasoning-effort minimal
100
  ```
101
 
102
+ ### Multi-model comparison (2026-07-05)
103
+
104
+ Same 10 records, same prompts, same schemas β€” only the model changes. All runs
105
+ use `reasoning_effort="minimal"`. Reports land under `evaluation/benchmarks/<timestamp>/`.
106
+
107
+ | Model | Micro F1 | Macro F1 | Doc-exact | Latency | Cost / doc |
108
+ |---------------|-----------|-----------|-----------|----------|------------|
109
+ | `gpt-5-nano` | **0.896** | 0.885 | 40 % | 5.1 s | **$0.0116** |
110
+ | `gpt-5-mini` | 0.864 | 0.927 | 40 % | 6.1 s | $0.0127 |
111
+ | `gpt-5` | 0.884 | **0.939** | 30 % | 5.4 s | $0.0118 |
112
+
113
+ **Read the numbers:**
114
+ - **`gpt-5-nano` is Pareto-optimal on this workload** β€” highest micro F1 at the
115
+ lowest cost and lowest latency. Bigger tiers don't buy quality on high-support
116
+ fields.
117
+ - **`gpt-5` and `gpt-5-mini` lead on macro F1** β€” they're measurably better on
118
+ the rarer fields (macro weights every field equally regardless of support).
119
+ If your extraction schema is long-tailed, the ~7 % macro-F1 lift may be worth
120
+ the small extra spend.
121
+ - **Doc-exact stays 30-40 % across all three** β€” an artifact of a strict metric
122
+ and a schema with many optional fields. Micro F1 tracks real quality here.
123
+ - **Total benchmark spend: $0.36** to definitively answer "which model should
124
+ ship in prod?" β€” this is the kind of question worth measuring instead of
125
+ guessing at, and it's cheap enough to re-run whenever the prompt or schema
126
+ moves.
127
+
128
+ Reproduce:
129
+
130
+ ```bash
131
+ python scripts/run_multimodel_benchmark.py
132
+ # or with a custom matrix:
133
+ python scripts/run_multimodel_benchmark.py gpt-5-nano:minimal gpt-5-mini:minimal gpt-4o-mini
134
+ ```
135
+
136
+ Next: real image PDFs from the SROIE test split for a stricter, OCR-inclusive
137
+ number, then the SEC 10-K schema for the long-doc / dual-domain story.
138
 
139
  ## Architecture
140
 
 
163
 
164
  | Layer | Choice | Why |
165
  |-------|--------|-----|
166
+ | LLM | OpenAI GPT-5 nano (default) + benchmarked vs GPT-5 mini + GPT-5 full | 400K context, vision, structured outputs, ~50x cheaper than GPT-4o |
167
  | Schema | Pydantic v2 | Runtime validation + JSON schema for OpenAI |
168
  | PDF text | pdfplumber, PyMuPDF | Fast, robust, handles most layouts |
169
  | PDF images | pdf2image + Pillow | For scanned/image-heavy PDFs β†’ vision model |
evaluation/benchmarks/20260705T064740Z/comparison.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ model,reasoning_effort,micro_f1,macro_f1,doc_exact_match,mean_latency_ms,mean_cost_usd,total_cost_usd,wall_time_s,n_docs,errors
2
+ gpt-5-nano,minimal,0.8963,0.8852,0.4,5098.0,0.011635,0.1164,51.0,10,0
3
+ gpt-5-mini,minimal,0.8639,0.9274,0.4,6115.0,0.012694,0.1269,61.16,10,0
4
+ gpt-5,minimal,0.8843,0.9393,0.3,5377.0,0.011822,0.1183,53.78,10,0
evaluation/benchmarks/20260705T064740Z/comparison.json ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:50:39.328401+00:00",
3
+ "matrix": [
4
+ {
5
+ "model": "gpt-5-nano",
6
+ "reasoning_effort": "minimal"
7
+ },
8
+ {
9
+ "model": "gpt-5-mini",
10
+ "reasoning_effort": "minimal"
11
+ },
12
+ {
13
+ "model": "gpt-5",
14
+ "reasoning_effort": "minimal"
15
+ }
16
+ ],
17
+ "results": {
18
+ "gpt-5-nano@minimal": {
19
+ "n_docs": 10,
20
+ "errors": 0,
21
+ "micro_f1": 0.8963,
22
+ "macro_f1": 0.8852,
23
+ "doc_exact_match": 0.4,
24
+ "mean_latency_ms": 5098.0,
25
+ "mean_cost_usd": 0.011635,
26
+ "total_cost_usd": 0.1164,
27
+ "wall_time_s": 51.0
28
+ },
29
+ "gpt-5-mini@minimal": {
30
+ "n_docs": 10,
31
+ "errors": 0,
32
+ "micro_f1": 0.8639,
33
+ "macro_f1": 0.9274,
34
+ "doc_exact_match": 0.4,
35
+ "mean_latency_ms": 6115.0,
36
+ "mean_cost_usd": 0.012694,
37
+ "total_cost_usd": 0.1269,
38
+ "wall_time_s": 61.16
39
+ },
40
+ "gpt-5@minimal": {
41
+ "n_docs": 10,
42
+ "errors": 0,
43
+ "micro_f1": 0.8843,
44
+ "macro_f1": 0.9393,
45
+ "doc_exact_match": 0.3,
46
+ "mean_latency_ms": 5377.0,
47
+ "mean_cost_usd": 0.011822,
48
+ "total_cost_usd": 0.1183,
49
+ "wall_time_s": 53.78
50
+ }
51
+ }
52
+ }
evaluation/benchmarks/20260705T064740Z/comparison.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Multi-model benchmark
2
+
3
+ _Generated: 2026-07-05T06:50:39+00:00_
4
+
5
+ 10 receipts (5 SROIE + 5 CORD), synthetic text derived from public ground truth.
6
+ All runs use the same prompts, schemas, and post-processing β€” the only variable is the model.
7
+
8
+ | Model | Effort | Micro F1 | Macro F1 | Doc-exact | Latency (ms) | Cost / doc | Total cost |
9
+ |---|---|---:|---:|---:|---:|---:|---:|
10
+ | `gpt-5-nano` | minimal | 0.896 | 0.885 | 40% | 5098 | $0.01163 | $0.1164 |
11
+ | `gpt-5-mini` | minimal | 0.864 | 0.927 | 40% | 6115 | $0.01269 | $0.1269 |
12
+ | `gpt-5` | minimal | 0.884 | 0.939 | 30% | 5377 | $0.01182 | $0.1183 |
13
+
14
+ _Field-level breakdowns live in each combo's per-run report under `evaluation/reports/`._
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_per_record.csv ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ cord_sample_001,currency,exact,KRW,KRW,TP,1.0,7314.9,0.013705
3
+ cord_sample_001,line_items[0].description,text,Iced Americano,Iced Americano,TP,1.0,7314.9,0.013705
4
+ cord_sample_001,line_items[0].quantity,number,1,1,TP,1.0,7314.9,0.013705
5
+ cord_sample_001,line_items[0].total,money,4500,4500,TP,1.0,7314.9,0.013705
6
+ cord_sample_001,line_items[0].unit_price,money,4500,4500,TP,1.0,7314.9,0.013705
7
+ cord_sample_001,line_items[1].description,text,Choco Chip Muffin,Choco Chip Muffin,TP,1.0,7314.9,0.013705
8
+ cord_sample_001,line_items[1].quantity,number,1,1,TP,1.0,7314.9,0.013705
9
+ cord_sample_001,line_items[1].total,money,3800,3800,TP,1.0,7314.9,0.013705
10
+ cord_sample_001,line_items[1].unit_price,money,3800,3800,TP,1.0,7314.9,0.013705
11
+ cord_sample_001,line_items[],number,2,2,TP,1.0,7314.9,0.013705
12
+ cord_sample_001,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,7314.9,0.013705
13
+ cord_sample_001,subtotal,money,8300,8300,TP,1.0,7314.9,0.013705
14
+ cord_sample_001,tax,money,830,830,TP,1.0,7314.9,0.013705
15
+ cord_sample_001,total,money,9130,9130,TP,1.0,7314.9,0.013705
16
+ cord_sample_002,currency,exact,KRW,KRW,TP,1.0,7341.9,0.014632
17
+ cord_sample_002,line_items[0].description,text,Bibimbap Set,Bibimbap Set,TP,1.0,7341.9,0.014632
18
+ cord_sample_002,line_items[0].quantity,number,2,2,TP,1.0,7341.9,0.014632
19
+ cord_sample_002,line_items[0].total,money,,24000,FN,0.0,7341.9,0.014632
20
+ cord_sample_002,line_items[0].unit_price,money,24000,12000,MISMATCH,0.0,7341.9,0.014632
21
+ cord_sample_002,line_items[1].description,text,Miso Soup,Miso Soup,TP,1.0,7341.9,0.014632
22
+ cord_sample_002,line_items[1].quantity,number,2,2,TP,1.0,7341.9,0.014632
23
+ cord_sample_002,line_items[1].total,money,,5000,FN,0.0,7341.9,0.014632
24
+ cord_sample_002,line_items[1].unit_price,money,5000,2500,MISMATCH,0.0,7341.9,0.014632
25
+ cord_sample_002,line_items[],number,2,2,TP,1.0,7341.9,0.014632
26
+ cord_sample_002,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,7341.9,0.014632
27
+ cord_sample_002,subtotal,money,29000,29000,TP,1.0,7341.9,0.014632
28
+ cord_sample_002,tax,money,2900,2900,TP,1.0,7341.9,0.014632
29
+ cord_sample_002,total,money,31900,31900,TP,1.0,7341.9,0.014632
30
+ cord_sample_003,currency,exact,KRW,KRW,TP,1.0,5556.7,0.011397
31
+ cord_sample_003,line_items[0].description,text,Latte,Latte,TP,1.0,5556.7,0.011397
32
+ cord_sample_003,line_items[0].quantity,number,1,1,TP,1.0,5556.7,0.011397
33
+ cord_sample_003,line_items[0].total,money,5000,5000,TP,1.0,5556.7,0.011397
34
+ cord_sample_003,line_items[0].unit_price,money,5000,5000,TP,1.0,5556.7,0.011397
35
+ cord_sample_003,line_items[],number,1,1,TP,1.0,5556.7,0.011397
36
+ cord_sample_003,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,5556.7,0.011397
37
+ cord_sample_003,subtotal,money,5000,5000,TP,1.0,5556.7,0.011397
38
+ cord_sample_003,tax,money,500,500,TP,1.0,5556.7,0.011397
39
+ cord_sample_003,total,money,5500,5500,TP,1.0,5556.7,0.011397
40
+ cord_sample_004,currency,exact,KRW,KRW,TP,1.0,7191.9,0.014805
41
+ cord_sample_004,line_items[0].description,text,Kimchi Fried Rice,Kimchi Fried Rice,TP,1.0,7191.9,0.014805
42
+ cord_sample_004,line_items[0].quantity,number,1,1,TP,1.0,7191.9,0.014805
43
+ cord_sample_004,line_items[0].total,money,9500,9500,TP,1.0,7191.9,0.014805
44
+ cord_sample_004,line_items[0].unit_price,money,,9500,FN,0.0,7191.9,0.014805
45
+ cord_sample_004,line_items[1].description,text,Egg Roll,Egg Roll,TP,1.0,7191.9,0.014805
46
+ cord_sample_004,line_items[1].quantity,number,1,1,TP,1.0,7191.9,0.014805
47
+ cord_sample_004,line_items[1].total,money,3500,3500,TP,1.0,7191.9,0.014805
48
+ cord_sample_004,line_items[1].unit_price,money,,3500,FN,0.0,7191.9,0.014805
49
+ cord_sample_004,line_items[2].description,text,Soft Drink,Soft Drink,TP,1.0,7191.9,0.014805
50
+ cord_sample_004,line_items[2].quantity,number,2,2,TP,1.0,7191.9,0.014805
51
+ cord_sample_004,line_items[2].total,money,4000,4000,TP,1.0,7191.9,0.014805
52
+ cord_sample_004,line_items[2].unit_price,money,,2000,FN,0.0,7191.9,0.014805
53
+ cord_sample_004,line_items[],number,3,3,TP,1.0,7191.9,0.014805
54
+ cord_sample_004,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,7191.9,0.014805
55
+ cord_sample_004,subtotal,money,17000,17000,TP,1.0,7191.9,0.014805
56
+ cord_sample_004,tax,money,1700,1700,TP,1.0,7191.9,0.014805
57
+ cord_sample_004,total,money,18700,18700,TP,1.0,7191.9,0.014805
58
+ cord_sample_005,currency,exact,KRW,KRW,TP,1.0,5980.1,0.01317
59
+ cord_sample_005,line_items[0].description,text,Espresso,Espresso,TP,1.0,5980.1,0.01317
60
+ cord_sample_005,line_items[0].quantity,number,1,1,TP,1.0,5980.1,0.01317
61
+ cord_sample_005,line_items[0].total,money,3500,3500,TP,1.0,5980.1,0.01317
62
+ cord_sample_005,line_items[0].unit_price,money,3500,3500,TP,1.0,5980.1,0.01317
63
+ cord_sample_005,line_items[1].description,text,Cheesecake Slice,Cheesecake Slice,TP,1.0,5980.1,0.01317
64
+ cord_sample_005,line_items[1].quantity,number,1,1,TP,1.0,5980.1,0.01317
65
+ cord_sample_005,line_items[1].total,money,6500,6500,TP,1.0,5980.1,0.01317
66
+ cord_sample_005,line_items[1].unit_price,money,6500,6500,TP,1.0,5980.1,0.01317
67
+ cord_sample_005,line_items[],number,2,2,TP,1.0,5980.1,0.01317
68
+ cord_sample_005,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,5980.1,0.01317
69
+ cord_sample_005,subtotal,money,10000,10000,TP,1.0,5980.1,0.01317
70
+ cord_sample_005,tax,money,1000,1000,TP,1.0,5980.1,0.01317
71
+ cord_sample_005,total,money,11000,11000,TP,1.0,5980.1,0.01317
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_summary.json ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:49:41.326652+00:00",
3
+ "summary": {
4
+ "model": "gpt-5-mini_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.9333,
9
+ "macro_f1": 0.888,
10
+ "doc_exact_match": 0.6,
11
+ "mean_latency_ms": 6677.1,
12
+ "mean_cost_usd": 0.013542,
13
+ "total_cost_usd": 0.0677,
14
+ "wall_time_s": 33.39
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 0.9692,
18
+ "micro_recall": 0.9,
19
+ "micro_f1": 0.9333,
20
+ "macro_f1": 0.888
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[0].description": {
36
+ "field": "line_items[0].description",
37
+ "field_type": "text",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "line_items[0].quantity": {
48
+ "field": "line_items[0].quantity",
49
+ "field_type": "number",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "line_items[0].total": {
60
+ "field": "line_items[0].total",
61
+ "field_type": "money",
62
+ "tp": 4,
63
+ "fp": 0,
64
+ "fn": 1,
65
+ "tn": 0,
66
+ "support": 5,
67
+ "precision": 1.0,
68
+ "recall": 0.8,
69
+ "f1": 0.8889
70
+ },
71
+ "line_items[0].unit_price": {
72
+ "field": "line_items[0].unit_price",
73
+ "field_type": "money",
74
+ "tp": 3,
75
+ "fp": 1,
76
+ "fn": 2,
77
+ "tn": 0,
78
+ "support": 5,
79
+ "precision": 0.75,
80
+ "recall": 0.6,
81
+ "f1": 0.6667
82
+ },
83
+ "line_items[1].description": {
84
+ "field": "line_items[1].description",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 0,
88
+ "fn": 0,
89
+ "tn": 0,
90
+ "support": 4,
91
+ "precision": 1.0,
92
+ "recall": 1.0,
93
+ "f1": 1.0
94
+ },
95
+ "line_items[1].quantity": {
96
+ "field": "line_items[1].quantity",
97
+ "field_type": "number",
98
+ "tp": 4,
99
+ "fp": 0,
100
+ "fn": 0,
101
+ "tn": 0,
102
+ "support": 4,
103
+ "precision": 1.0,
104
+ "recall": 1.0,
105
+ "f1": 1.0
106
+ },
107
+ "line_items[1].total": {
108
+ "field": "line_items[1].total",
109
+ "field_type": "money",
110
+ "tp": 3,
111
+ "fp": 0,
112
+ "fn": 1,
113
+ "tn": 0,
114
+ "support": 4,
115
+ "precision": 1.0,
116
+ "recall": 0.75,
117
+ "f1": 0.8571
118
+ },
119
+ "line_items[1].unit_price": {
120
+ "field": "line_items[1].unit_price",
121
+ "field_type": "money",
122
+ "tp": 2,
123
+ "fp": 1,
124
+ "fn": 2,
125
+ "tn": 0,
126
+ "support": 4,
127
+ "precision": 0.6667,
128
+ "recall": 0.5,
129
+ "f1": 0.5714
130
+ },
131
+ "line_items[]": {
132
+ "field": "line_items[]",
133
+ "field_type": "number",
134
+ "tp": 5,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 0,
138
+ "support": 5,
139
+ "precision": 1.0,
140
+ "recall": 1.0,
141
+ "f1": 1.0
142
+ },
143
+ "merchant": {
144
+ "field": "merchant",
145
+ "field_type": "text",
146
+ "tp": 5,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 0,
150
+ "support": 5,
151
+ "precision": 1.0,
152
+ "recall": 1.0,
153
+ "f1": 1.0
154
+ },
155
+ "merchant_phone": {
156
+ "field": "merchant_phone",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "payment_method": {
168
+ "field": "payment_method",
169
+ "field_type": "exact",
170
+ "tp": 0,
171
+ "fp": 0,
172
+ "fn": 0,
173
+ "tn": 5,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "receipt_number": {
180
+ "field": "receipt_number",
181
+ "field_type": "exact",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "subtotal": {
192
+ "field": "subtotal",
193
+ "field_type": "money",
194
+ "tp": 5,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 0,
198
+ "support": 5,
199
+ "precision": 1.0,
200
+ "recall": 1.0,
201
+ "f1": 1.0
202
+ },
203
+ "tax": {
204
+ "field": "tax",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "tip": {
216
+ "field": "tip",
217
+ "field_type": "money",
218
+ "tp": 0,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 5,
222
+ "support": 0,
223
+ "precision": 0.0,
224
+ "recall": 0.0,
225
+ "f1": 0.0
226
+ },
227
+ "total": {
228
+ "field": "total",
229
+ "field_type": "money",
230
+ "tp": 5,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 0,
234
+ "support": 5,
235
+ "precision": 1.0,
236
+ "recall": 1.0,
237
+ "f1": 1.0
238
+ },
239
+ "transaction_date": {
240
+ "field": "transaction_date",
241
+ "field_type": "date",
242
+ "tp": 0,
243
+ "fp": 0,
244
+ "fn": 0,
245
+ "tn": 5,
246
+ "support": 0,
247
+ "precision": 0.0,
248
+ "recall": 0.0,
249
+ "f1": 0.0
250
+ },
251
+ "transaction_time": {
252
+ "field": "transaction_time",
253
+ "field_type": "time",
254
+ "tp": 0,
255
+ "fp": 0,
256
+ "fn": 0,
257
+ "tn": 5,
258
+ "support": 0,
259
+ "precision": 0.0,
260
+ "recall": 0.0,
261
+ "f1": 0.0
262
+ },
263
+ "line_items[2].description": {
264
+ "field": "line_items[2].description",
265
+ "field_type": "text",
266
+ "tp": 1,
267
+ "fp": 0,
268
+ "fn": 0,
269
+ "tn": 0,
270
+ "support": 1,
271
+ "precision": 1.0,
272
+ "recall": 1.0,
273
+ "f1": 1.0
274
+ },
275
+ "line_items[2].quantity": {
276
+ "field": "line_items[2].quantity",
277
+ "field_type": "number",
278
+ "tp": 1,
279
+ "fp": 0,
280
+ "fn": 0,
281
+ "tn": 0,
282
+ "support": 1,
283
+ "precision": 1.0,
284
+ "recall": 1.0,
285
+ "f1": 1.0
286
+ },
287
+ "line_items[2].total": {
288
+ "field": "line_items[2].total",
289
+ "field_type": "money",
290
+ "tp": 1,
291
+ "fp": 0,
292
+ "fn": 0,
293
+ "tn": 0,
294
+ "support": 1,
295
+ "precision": 1.0,
296
+ "recall": 1.0,
297
+ "f1": 1.0
298
+ },
299
+ "line_items[2].unit_price": {
300
+ "field": "line_items[2].unit_price",
301
+ "field_type": "money",
302
+ "tp": 0,
303
+ "fp": 0,
304
+ "fn": 1,
305
+ "tn": 0,
306
+ "support": 1,
307
+ "precision": 0.0,
308
+ "recall": 0.0,
309
+ "f1": 0.0
310
+ }
311
+ }
312
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_cord/receipt_gpt-5-mini_re-minimal_summary.md ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5-mini_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:49:41+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.9333** |
12
+ | **Macro F1** | **0.8880** |
13
+ | Doc exact-match rate| 60.00% |
14
+ | Mean latency | 6677 ms |
15
+ | Mean cost / doc | $0.013542 |
16
+ | Total cost | $0.0677 |
17
+ | Wall time | 33.39 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[0].description` | text | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `line_items[0].quantity` | number | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `subtotal` | money | 5 | 1.000 | 1.000 | 1.000 |
29
+ | `tax` | money | 5 | 1.000 | 1.000 | 1.000 |
30
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
31
+ | `line_items[0].total` | money | 5 | 1.000 | 0.800 | 0.889 |
32
+ | `line_items[0].unit_price` | money | 5 | 0.750 | 0.600 | 0.667 |
33
+ | `line_items[1].description` | text | 4 | 1.000 | 1.000 | 1.000 |
34
+ | `line_items[1].quantity` | number | 4 | 1.000 | 1.000 | 1.000 |
35
+ | `line_items[1].total` | money | 4 | 1.000 | 0.750 | 0.857 |
36
+ | `line_items[1].unit_price` | money | 4 | 0.667 | 0.500 | 0.571 |
37
+ | `line_items[2].description` | text | 1 | 1.000 | 1.000 | 1.000 |
38
+ | `line_items[2].quantity` | number | 1 | 1.000 | 1.000 | 1.000 |
39
+ | `line_items[2].total` | money | 1 | 1.000 | 1.000 | 1.000 |
40
+ | `line_items[2].unit_price` | money | 1 | 0.000 | 0.000 | 0.000 |
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_per_record.csv ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ sroie_sample_001,currency,exact,SGD,SGD,TP,1.0,7493.9,0.01319
3
+ sroie_sample_001,line_items[],number,0,0,TP,1.0,7493.9,0.01319
4
+ sroie_sample_001,merchant,text,TAN WOON YANN,TAN WOON YANN,TP,1.0,7493.9,0.01319
5
+ sroie_sample_001,merchant_address.city,text,JOHOR BAHRU,,FP,0.0,7493.9,0.01319
6
+ sroie_sample_001,merchant_address.line1,text,"789 KING STREET, TAMAN DAYA","789 KING STREET, TAMAN DAYA, 81100 JOHOR BAHRU",TP,0.898,7493.9,0.01319
7
+ sroie_sample_001,merchant_address.postal_code,exact,81100,,FP,0.0,7493.9,0.01319
8
+ sroie_sample_001,total,money,72,72,TP,1.0,7493.9,0.01319
9
+ sroie_sample_001,transaction_date,date,2018-06-25,2018-06-25,TP,1.0,7493.9,0.01319
10
+ sroie_sample_002,currency,exact,SGD,SGD,TP,1.0,5550.8,0.011973
11
+ sroie_sample_002,line_items[],number,0,0,TP,1.0,5550.8,0.011973
12
+ sroie_sample_002,merchant,text,SANYU STATIONERY SHOP,SANYU STATIONERY SHOP,TP,1.0,5550.8,0.011973
13
+ sroie_sample_002,merchant_address.city,text,SHAH ALAM,,FP,0.0,5550.8,0.011973
14
+ sroie_sample_002,merchant_address.country,exact,MY,,FP,0.0,5550.8,0.011973
15
+ sroie_sample_002,merchant_address.line1,text,"NO. 31G&33G, JALAN SETIA INDAH X, U13/X","NO. 31G&33G, JALAN SETIA INDAH X, U13/X 40170 SHAH ALAM",TP,1.0,5550.8,0.011973
16
+ sroie_sample_002,merchant_address.postal_code,exact,40170,,FP,0.0,5550.8,0.011973
17
+ sroie_sample_002,total,money,16.3,16.3,TP,1.0,5550.8,0.011973
18
+ sroie_sample_002,transaction_date,date,2018-02-19,2018-02-19,TP,1.0,5550.8,0.011973
19
+ sroie_sample_003,currency,exact,SGD,SGD,TP,1.0,5937.9,0.01279
20
+ sroie_sample_003,line_items[],number,0,0,TP,1.0,5937.9,0.01279
21
+ sroie_sample_003,merchant,text,KEDAI PAPAN YEW CHUAN,KEDAI PAPAN YEW CHUAN,TP,1.0,5937.9,0.01279
22
+ sroie_sample_003,merchant_address.city,text,DENGKIL,,FP,0.0,5937.9,0.01279
23
+ sroie_sample_003,merchant_address.country,exact,MY,,FP,0.0,5937.9,0.01279
24
+ sroie_sample_003,merchant_address.line1,text,LOT 276 JALAN BANTING,"LOT 276 JALAN BANTING, 43800 DENGKIL, SELANGOR",MISMATCH,0.765,5937.9,0.01279
25
+ sroie_sample_003,merchant_address.postal_code,exact,43800,,FP,0.0,5937.9,0.01279
26
+ sroie_sample_003,merchant_address.region,text,SELANGOR,,FP,0.0,5937.9,0.01279
27
+ sroie_sample_003,total,money,110,110,TP,1.0,5937.9,0.01279
28
+ sroie_sample_003,transaction_date,date,2018-05-10,2018-05-10,TP,1.0,5937.9,0.01279
29
+ sroie_sample_004,currency,exact,SGD,SGD,TP,1.0,5446.5,0.01243
30
+ sroie_sample_004,line_items[],number,0,0,TP,1.0,5446.5,0.01243
31
+ sroie_sample_004,merchant,text,OJC MARKETING SDN BHD,OJC MARKETING SDN BHD,TP,1.0,5446.5,0.01243
32
+ sroie_sample_004,merchant_address.city,text,MASAI,,FP,0.0,5446.5,0.01243
33
+ sroie_sample_004,merchant_address.country,exact,MY,,FP,0.0,5446.5,0.01243
34
+ sroie_sample_004,merchant_address.line1,text,"NO 2 & 4, JALAN BAYU 4","NO 2 & 4, JALAN BAYU 4, BANDAR SERI ALAM, 81750 MASAI",TP,0.952,5446.5,0.01243
35
+ sroie_sample_004,merchant_address.line2,text,BANDAR SERI ALAM,,FP,0.0,5446.5,0.01243
36
+ sroie_sample_004,merchant_address.postal_code,exact,81750,,FP,0.0,5446.5,0.01243
37
+ sroie_sample_004,total,money,48.15,48.15,TP,1.0,5446.5,0.01243
38
+ sroie_sample_004,transaction_date,date,2018-04-17,2018-04-17,TP,1.0,5446.5,0.01243
39
+ sroie_sample_005,currency,exact,SGD,SGD,TP,1.0,3337.9,0.008842
40
+ sroie_sample_005,line_items[],number,0,0,TP,1.0,3337.9,0.008842
41
+ sroie_sample_005,merchant,text,AEON CO. (M) BHD,AEON CO. (M) BHD,TP,1.0,3337.9,0.008842
42
+ sroie_sample_005,merchant_address.line1,text,"3RD FLR, AEON TAMAN MALURI SHOPPING CENTRE","3RD FLR, AEON TAMAN MALURI SHOPPING CENTRE",TP,1.0,3337.9,0.008842
43
+ sroie_sample_005,total,money,39.2,39.2,TP,1.0,3337.9,0.008842
44
+ sroie_sample_005,transaction_date,date,2018-11-30,2018-11-30,TP,1.0,3337.9,0.008842
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_summary.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:49:06.034616+00:00",
3
+ "summary": {
4
+ "model": "gpt-5-mini_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.7945,
9
+ "macro_f1": 0.9667,
10
+ "doc_exact_match": 0.2,
11
+ "mean_latency_ms": 5553.4,
12
+ "mean_cost_usd": 0.011845,
13
+ "total_cost_usd": 0.0592,
14
+ "wall_time_s": 27.77
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 0.6744,
18
+ "micro_recall": 0.9667,
19
+ "micro_f1": 0.7945,
20
+ "macro_f1": 0.9667
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[]": {
36
+ "field": "line_items[]",
37
+ "field_type": "number",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "merchant": {
48
+ "field": "merchant",
49
+ "field_type": "text",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "merchant_address.city": {
60
+ "field": "merchant_address.city",
61
+ "field_type": "text",
62
+ "tp": 0,
63
+ "fp": 4,
64
+ "fn": 0,
65
+ "tn": 1,
66
+ "support": 0,
67
+ "precision": 0.0,
68
+ "recall": 0.0,
69
+ "f1": 0.0
70
+ },
71
+ "merchant_address.country": {
72
+ "field": "merchant_address.country",
73
+ "field_type": "exact",
74
+ "tp": 0,
75
+ "fp": 3,
76
+ "fn": 0,
77
+ "tn": 2,
78
+ "support": 0,
79
+ "precision": 0.0,
80
+ "recall": 0.0,
81
+ "f1": 0.0
82
+ },
83
+ "merchant_address.line1": {
84
+ "field": "merchant_address.line1",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 1,
88
+ "fn": 1,
89
+ "tn": 0,
90
+ "support": 5,
91
+ "precision": 0.8,
92
+ "recall": 0.8,
93
+ "f1": 0.8
94
+ },
95
+ "merchant_address.line2": {
96
+ "field": "merchant_address.line2",
97
+ "field_type": "text",
98
+ "tp": 0,
99
+ "fp": 1,
100
+ "fn": 0,
101
+ "tn": 4,
102
+ "support": 0,
103
+ "precision": 0.0,
104
+ "recall": 0.0,
105
+ "f1": 0.0
106
+ },
107
+ "merchant_address.postal_code": {
108
+ "field": "merchant_address.postal_code",
109
+ "field_type": "exact",
110
+ "tp": 0,
111
+ "fp": 4,
112
+ "fn": 0,
113
+ "tn": 1,
114
+ "support": 0,
115
+ "precision": 0.0,
116
+ "recall": 0.0,
117
+ "f1": 0.0
118
+ },
119
+ "merchant_address.region": {
120
+ "field": "merchant_address.region",
121
+ "field_type": "text",
122
+ "tp": 0,
123
+ "fp": 1,
124
+ "fn": 0,
125
+ "tn": 4,
126
+ "support": 0,
127
+ "precision": 0.0,
128
+ "recall": 0.0,
129
+ "f1": 0.0
130
+ },
131
+ "merchant_phone": {
132
+ "field": "merchant_phone",
133
+ "field_type": "exact",
134
+ "tp": 0,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 5,
138
+ "support": 0,
139
+ "precision": 0.0,
140
+ "recall": 0.0,
141
+ "f1": 0.0
142
+ },
143
+ "payment_method": {
144
+ "field": "payment_method",
145
+ "field_type": "exact",
146
+ "tp": 0,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 5,
150
+ "support": 0,
151
+ "precision": 0.0,
152
+ "recall": 0.0,
153
+ "f1": 0.0
154
+ },
155
+ "receipt_number": {
156
+ "field": "receipt_number",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "subtotal": {
168
+ "field": "subtotal",
169
+ "field_type": "money",
170
+ "tp": 0,
171
+ "fp": 0,
172
+ "fn": 0,
173
+ "tn": 5,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "tax": {
180
+ "field": "tax",
181
+ "field_type": "money",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "tip": {
192
+ "field": "tip",
193
+ "field_type": "money",
194
+ "tp": 0,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 5,
198
+ "support": 0,
199
+ "precision": 0.0,
200
+ "recall": 0.0,
201
+ "f1": 0.0
202
+ },
203
+ "total": {
204
+ "field": "total",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "transaction_date": {
216
+ "field": "transaction_date",
217
+ "field_type": "date",
218
+ "tp": 5,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 0,
222
+ "support": 5,
223
+ "precision": 1.0,
224
+ "recall": 1.0,
225
+ "f1": 1.0
226
+ },
227
+ "transaction_time": {
228
+ "field": "transaction_time",
229
+ "field_type": "time",
230
+ "tp": 0,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 5,
234
+ "support": 0,
235
+ "precision": 0.0,
236
+ "recall": 0.0,
237
+ "f1": 0.0
238
+ }
239
+ }
240
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5-mini_minimal_sroie/receipt_gpt-5-mini_re-minimal_summary.md ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5-mini_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:49:06+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.7945** |
12
+ | **Macro F1** | **0.9667** |
13
+ | Doc exact-match rate| 20.00% |
14
+ | Mean latency | 5553 ms |
15
+ | Mean cost / doc | $0.011845 |
16
+ | Total cost | $0.0592 |
17
+ | Wall time | 27.77 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `transaction_date` | date | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `merchant_address.line1` | text | 5 | 0.800 | 0.800 | 0.800 |
29
+ | `merchant_address.city` | text | 0 | 0.000 | 0.000 | 0.000 |
30
+ | `merchant_address.country` | exact | 0 | 0.000 | 0.000 | 0.000 |
31
+ | `merchant_address.line2` | text | 0 | 0.000 | 0.000 | 0.000 |
32
+ | `merchant_address.postal_code` | exact | 0 | 0.000 | 0.000 | 0.000 |
33
+ | `merchant_address.region` | text | 0 | 0.000 | 0.000 | 0.000 |
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_per_record.csv ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ cord_sample_001,currency,exact,KRW,KRW,TP,1.0,4681.8,0.010535
3
+ cord_sample_001,line_items[0].description,text,Iced Americano,Iced Americano,TP,1.0,4681.8,0.010535
4
+ cord_sample_001,line_items[0].quantity,number,1,1,TP,1.0,4681.8,0.010535
5
+ cord_sample_001,line_items[0].total,money,4500,4500,TP,1.0,4681.8,0.010535
6
+ cord_sample_001,line_items[0].unit_price,money,4500,4500,TP,1.0,4681.8,0.010535
7
+ cord_sample_001,line_items[1].description,text,Choco Chip Muffin,Choco Chip Muffin,TP,1.0,4681.8,0.010535
8
+ cord_sample_001,line_items[1].quantity,number,1,1,TP,1.0,4681.8,0.010535
9
+ cord_sample_001,line_items[1].total,money,3800,3800,TP,1.0,4681.8,0.010535
10
+ cord_sample_001,line_items[1].unit_price,money,3800,3800,TP,1.0,4681.8,0.010535
11
+ cord_sample_001,line_items[],number,2,2,TP,1.0,4681.8,0.010535
12
+ cord_sample_001,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,4681.8,0.010535
13
+ cord_sample_001,subtotal,money,8300,8300,TP,1.0,4681.8,0.010535
14
+ cord_sample_001,tax,money,830,830,TP,1.0,4681.8,0.010535
15
+ cord_sample_001,total,money,9130,9130,TP,1.0,4681.8,0.010535
16
+ cord_sample_002,currency,exact,KRW,KRW,TP,1.0,3868.6,0.010943
17
+ cord_sample_002,line_items[0].description,text,Bibimbap Set,Bibimbap Set,TP,1.0,3868.6,0.010943
18
+ cord_sample_002,line_items[0].quantity,number,2,2,TP,1.0,3868.6,0.010943
19
+ cord_sample_002,line_items[0].total,money,48000,24000,MISMATCH,0.0,3868.6,0.010943
20
+ cord_sample_002,line_items[0].unit_price,money,24000,12000,MISMATCH,0.0,3868.6,0.010943
21
+ cord_sample_002,line_items[1].description,text,Miso Soup,Miso Soup,TP,1.0,3868.6,0.010943
22
+ cord_sample_002,line_items[1].quantity,number,2,2,TP,1.0,3868.6,0.010943
23
+ cord_sample_002,line_items[1].total,money,10000,5000,MISMATCH,0.0,3868.6,0.010943
24
+ cord_sample_002,line_items[1].unit_price,money,5000,2500,MISMATCH,0.0,3868.6,0.010943
25
+ cord_sample_002,line_items[],number,2,2,TP,1.0,3868.6,0.010943
26
+ cord_sample_002,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,3868.6,0.010943
27
+ cord_sample_002,subtotal,money,29000,29000,TP,1.0,3868.6,0.010943
28
+ cord_sample_002,tax,money,2900,2900,TP,1.0,3868.6,0.010943
29
+ cord_sample_002,total,money,31900,31900,TP,1.0,3868.6,0.010943
30
+ cord_sample_003,currency,exact,KRW,KRW,TP,1.0,3646.5,0.010388
31
+ cord_sample_003,line_items[0].description,text,Latte,Latte,TP,1.0,3646.5,0.010388
32
+ cord_sample_003,line_items[0].quantity,number,1,1,TP,1.0,3646.5,0.010388
33
+ cord_sample_003,line_items[0].total,money,5000,5000,TP,1.0,3646.5,0.010388
34
+ cord_sample_003,line_items[0].unit_price,money,5000,5000,TP,1.0,3646.5,0.010388
35
+ cord_sample_003,line_items[],number,1,1,TP,1.0,3646.5,0.010388
36
+ cord_sample_003,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,3646.5,0.010388
37
+ cord_sample_003,subtotal,money,5000,5000,TP,1.0,3646.5,0.010388
38
+ cord_sample_003,tax,money,500,500,TP,1.0,3646.5,0.010388
39
+ cord_sample_003,total,money,5500,5500,TP,1.0,3646.5,0.010388
40
+ cord_sample_004,currency,exact,KRW,KRW,TP,1.0,7969.6,0.015105
41
+ cord_sample_004,line_items[0].description,text,Kimchi Fried Rice,Kimchi Fried Rice,TP,1.0,7969.6,0.015105
42
+ cord_sample_004,line_items[0].quantity,number,1,1,TP,1.0,7969.6,0.015105
43
+ cord_sample_004,line_items[0].total,money,95,9500,MISMATCH,0.01,7969.6,0.015105
44
+ cord_sample_004,line_items[0].unit_price,money,95,9500,MISMATCH,0.01,7969.6,0.015105
45
+ cord_sample_004,line_items[1].description,text,Egg Roll,Egg Roll,TP,1.0,7969.6,0.015105
46
+ cord_sample_004,line_items[1].quantity,number,1,1,TP,1.0,7969.6,0.015105
47
+ cord_sample_004,line_items[1].total,money,3.5,3500,MISMATCH,0.001,7969.6,0.015105
48
+ cord_sample_004,line_items[1].unit_price,money,3.5,3500,MISMATCH,0.001,7969.6,0.015105
49
+ cord_sample_004,line_items[2].description,text,Soft Drink,Soft Drink,TP,1.0,7969.6,0.015105
50
+ cord_sample_004,line_items[2].quantity,number,2,2,TP,1.0,7969.6,0.015105
51
+ cord_sample_004,line_items[2].total,money,8,4000,MISMATCH,0.002,7969.6,0.015105
52
+ cord_sample_004,line_items[2].unit_price,money,4,2000,MISMATCH,0.002,7969.6,0.015105
53
+ cord_sample_004,line_items[],number,3,3,TP,1.0,7969.6,0.015105
54
+ cord_sample_004,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,7969.6,0.015105
55
+ cord_sample_004,subtotal,money,17000,17000,TP,1.0,7969.6,0.015105
56
+ cord_sample_004,tax,money,1700,1700,TP,1.0,7969.6,0.015105
57
+ cord_sample_004,total,money,18700,18700,TP,1.0,7969.6,0.015105
58
+ cord_sample_005,currency,exact,KRW,KRW,TP,1.0,3988.3,0.01101
59
+ cord_sample_005,line_items[0].description,text,Espresso,Espresso,TP,1.0,3988.3,0.01101
60
+ cord_sample_005,line_items[0].quantity,number,1,1,TP,1.0,3988.3,0.01101
61
+ cord_sample_005,line_items[0].total,money,3500,3500,TP,1.0,3988.3,0.01101
62
+ cord_sample_005,line_items[0].unit_price,money,3500,3500,TP,1.0,3988.3,0.01101
63
+ cord_sample_005,line_items[1].description,text,Cheesecake Slice,Cheesecake Slice,TP,1.0,3988.3,0.01101
64
+ cord_sample_005,line_items[1].quantity,number,1,1,TP,1.0,3988.3,0.01101
65
+ cord_sample_005,line_items[1].total,money,6500,6500,TP,1.0,3988.3,0.01101
66
+ cord_sample_005,line_items[1].unit_price,money,6500,6500,TP,1.0,3988.3,0.01101
67
+ cord_sample_005,line_items[],number,2,2,TP,1.0,3988.3,0.01101
68
+ cord_sample_005,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,3988.3,0.01101
69
+ cord_sample_005,subtotal,money,10000,10000,TP,1.0,3988.3,0.01101
70
+ cord_sample_005,tax,money,1000,1000,TP,1.0,3988.3,0.01101
71
+ cord_sample_005,total,money,11000,11000,TP,1.0,3988.3,0.01101
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_summary.json ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:48:36.320979+00:00",
3
+ "summary": {
4
+ "model": "gpt-5-nano_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.8571,
9
+ "macro_f1": 0.7889,
10
+ "doc_exact_match": 0.6,
11
+ "mean_latency_ms": 4830.9,
12
+ "mean_cost_usd": 0.011596,
13
+ "total_cost_usd": 0.058,
14
+ "wall_time_s": 24.16
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 0.8571,
18
+ "micro_recall": 0.8571,
19
+ "micro_f1": 0.8571,
20
+ "macro_f1": 0.7889
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[0].description": {
36
+ "field": "line_items[0].description",
37
+ "field_type": "text",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "line_items[0].quantity": {
48
+ "field": "line_items[0].quantity",
49
+ "field_type": "number",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "line_items[0].total": {
60
+ "field": "line_items[0].total",
61
+ "field_type": "money",
62
+ "tp": 3,
63
+ "fp": 2,
64
+ "fn": 2,
65
+ "tn": 0,
66
+ "support": 5,
67
+ "precision": 0.6,
68
+ "recall": 0.6,
69
+ "f1": 0.6
70
+ },
71
+ "line_items[0].unit_price": {
72
+ "field": "line_items[0].unit_price",
73
+ "field_type": "money",
74
+ "tp": 3,
75
+ "fp": 2,
76
+ "fn": 2,
77
+ "tn": 0,
78
+ "support": 5,
79
+ "precision": 0.6,
80
+ "recall": 0.6,
81
+ "f1": 0.6
82
+ },
83
+ "line_items[1].description": {
84
+ "field": "line_items[1].description",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 0,
88
+ "fn": 0,
89
+ "tn": 0,
90
+ "support": 4,
91
+ "precision": 1.0,
92
+ "recall": 1.0,
93
+ "f1": 1.0
94
+ },
95
+ "line_items[1].quantity": {
96
+ "field": "line_items[1].quantity",
97
+ "field_type": "number",
98
+ "tp": 4,
99
+ "fp": 0,
100
+ "fn": 0,
101
+ "tn": 0,
102
+ "support": 4,
103
+ "precision": 1.0,
104
+ "recall": 1.0,
105
+ "f1": 1.0
106
+ },
107
+ "line_items[1].total": {
108
+ "field": "line_items[1].total",
109
+ "field_type": "money",
110
+ "tp": 2,
111
+ "fp": 2,
112
+ "fn": 2,
113
+ "tn": 0,
114
+ "support": 4,
115
+ "precision": 0.5,
116
+ "recall": 0.5,
117
+ "f1": 0.5
118
+ },
119
+ "line_items[1].unit_price": {
120
+ "field": "line_items[1].unit_price",
121
+ "field_type": "money",
122
+ "tp": 2,
123
+ "fp": 2,
124
+ "fn": 2,
125
+ "tn": 0,
126
+ "support": 4,
127
+ "precision": 0.5,
128
+ "recall": 0.5,
129
+ "f1": 0.5
130
+ },
131
+ "line_items[]": {
132
+ "field": "line_items[]",
133
+ "field_type": "number",
134
+ "tp": 5,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 0,
138
+ "support": 5,
139
+ "precision": 1.0,
140
+ "recall": 1.0,
141
+ "f1": 1.0
142
+ },
143
+ "merchant": {
144
+ "field": "merchant",
145
+ "field_type": "text",
146
+ "tp": 5,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 0,
150
+ "support": 5,
151
+ "precision": 1.0,
152
+ "recall": 1.0,
153
+ "f1": 1.0
154
+ },
155
+ "merchant_phone": {
156
+ "field": "merchant_phone",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "payment_method": {
168
+ "field": "payment_method",
169
+ "field_type": "exact",
170
+ "tp": 0,
171
+ "fp": 0,
172
+ "fn": 0,
173
+ "tn": 5,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "receipt_number": {
180
+ "field": "receipt_number",
181
+ "field_type": "exact",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "subtotal": {
192
+ "field": "subtotal",
193
+ "field_type": "money",
194
+ "tp": 5,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 0,
198
+ "support": 5,
199
+ "precision": 1.0,
200
+ "recall": 1.0,
201
+ "f1": 1.0
202
+ },
203
+ "tax": {
204
+ "field": "tax",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "tip": {
216
+ "field": "tip",
217
+ "field_type": "money",
218
+ "tp": 0,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 5,
222
+ "support": 0,
223
+ "precision": 0.0,
224
+ "recall": 0.0,
225
+ "f1": 0.0
226
+ },
227
+ "total": {
228
+ "field": "total",
229
+ "field_type": "money",
230
+ "tp": 5,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 0,
234
+ "support": 5,
235
+ "precision": 1.0,
236
+ "recall": 1.0,
237
+ "f1": 1.0
238
+ },
239
+ "transaction_date": {
240
+ "field": "transaction_date",
241
+ "field_type": "date",
242
+ "tp": 0,
243
+ "fp": 0,
244
+ "fn": 0,
245
+ "tn": 5,
246
+ "support": 0,
247
+ "precision": 0.0,
248
+ "recall": 0.0,
249
+ "f1": 0.0
250
+ },
251
+ "transaction_time": {
252
+ "field": "transaction_time",
253
+ "field_type": "time",
254
+ "tp": 0,
255
+ "fp": 0,
256
+ "fn": 0,
257
+ "tn": 5,
258
+ "support": 0,
259
+ "precision": 0.0,
260
+ "recall": 0.0,
261
+ "f1": 0.0
262
+ },
263
+ "line_items[2].description": {
264
+ "field": "line_items[2].description",
265
+ "field_type": "text",
266
+ "tp": 1,
267
+ "fp": 0,
268
+ "fn": 0,
269
+ "tn": 0,
270
+ "support": 1,
271
+ "precision": 1.0,
272
+ "recall": 1.0,
273
+ "f1": 1.0
274
+ },
275
+ "line_items[2].quantity": {
276
+ "field": "line_items[2].quantity",
277
+ "field_type": "number",
278
+ "tp": 1,
279
+ "fp": 0,
280
+ "fn": 0,
281
+ "tn": 0,
282
+ "support": 1,
283
+ "precision": 1.0,
284
+ "recall": 1.0,
285
+ "f1": 1.0
286
+ },
287
+ "line_items[2].total": {
288
+ "field": "line_items[2].total",
289
+ "field_type": "money",
290
+ "tp": 0,
291
+ "fp": 1,
292
+ "fn": 1,
293
+ "tn": 0,
294
+ "support": 1,
295
+ "precision": 0.0,
296
+ "recall": 0.0,
297
+ "f1": 0.0
298
+ },
299
+ "line_items[2].unit_price": {
300
+ "field": "line_items[2].unit_price",
301
+ "field_type": "money",
302
+ "tp": 0,
303
+ "fp": 1,
304
+ "fn": 1,
305
+ "tn": 0,
306
+ "support": 1,
307
+ "precision": 0.0,
308
+ "recall": 0.0,
309
+ "f1": 0.0
310
+ }
311
+ }
312
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_cord/receipt_gpt-5-nano_re-minimal_summary.md ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5-nano_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:48:36+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.8571** |
12
+ | **Macro F1** | **0.7889** |
13
+ | Doc exact-match rate| 60.00% |
14
+ | Mean latency | 4831 ms |
15
+ | Mean cost / doc | $0.011596 |
16
+ | Total cost | $0.0580 |
17
+ | Wall time | 24.16 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[0].description` | text | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `line_items[0].quantity` | number | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `subtotal` | money | 5 | 1.000 | 1.000 | 1.000 |
29
+ | `tax` | money | 5 | 1.000 | 1.000 | 1.000 |
30
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
31
+ | `line_items[0].total` | money | 5 | 0.600 | 0.600 | 0.600 |
32
+ | `line_items[0].unit_price` | money | 5 | 0.600 | 0.600 | 0.600 |
33
+ | `line_items[1].description` | text | 4 | 1.000 | 1.000 | 1.000 |
34
+ | `line_items[1].quantity` | number | 4 | 1.000 | 1.000 | 1.000 |
35
+ | `line_items[1].total` | money | 4 | 0.500 | 0.500 | 0.500 |
36
+ | `line_items[1].unit_price` | money | 4 | 0.500 | 0.500 | 0.500 |
37
+ | `line_items[2].description` | text | 1 | 1.000 | 1.000 | 1.000 |
38
+ | `line_items[2].quantity` | number | 1 | 1.000 | 1.000 | 1.000 |
39
+ | `line_items[2].total` | money | 1 | 0.000 | 0.000 | 0.000 |
40
+ | `line_items[2].unit_price` | money | 1 | 0.000 | 0.000 | 0.000 |
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_per_record.csv ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ sroie_sample_001,currency,exact,SGD,SGD,TP,1.0,7118.2,0.00999
3
+ sroie_sample_001,line_items[],number,0,0,TP,1.0,7118.2,0.00999
4
+ sroie_sample_001,merchant,text,TAN WOON YANN,TAN WOON YANN,TP,1.0,7118.2,0.00999
5
+ sroie_sample_001,merchant_address.line1,text,"789 KING STREET, TAMAN DAYA, 81100 JOHOR BAHRU","789 KING STREET, TAMAN DAYA, 81100 JOHOR BAHRU",TP,1.0,7118.2,0.00999
6
+ sroie_sample_001,subtotal,money,72,,FP,0.0,7118.2,0.00999
7
+ sroie_sample_001,total,money,72,72,TP,1.0,7118.2,0.00999
8
+ sroie_sample_001,transaction_date,date,2018-06-25,2018-06-25,TP,1.0,7118.2,0.00999
9
+ sroie_sample_002,currency,exact,SGD,SGD,TP,1.0,5640.9,0.013383
10
+ sroie_sample_002,line_items[],number,0,0,TP,1.0,5640.9,0.013383
11
+ sroie_sample_002,merchant,text,SANYU STATIONERY SHOP,SANYU STATIONERY SHOP,TP,1.0,5640.9,0.013383
12
+ sroie_sample_002,merchant_address.line1,text,"NO. 31G&33G, JALAN SETIA INDAH X, U13/X","NO. 31G&33G, JALAN SETIA INDAH X, U13/X 40170 SHAH ALAM",TP,1.0,5640.9,0.013383
13
+ sroie_sample_002,merchant_address.line2,text,40170 SHAH ALAM,,FP,0.0,5640.9,0.013383
14
+ sroie_sample_002,total,money,16.3,16.3,TP,1.0,5640.9,0.013383
15
+ sroie_sample_002,transaction_date,date,2018-02-19,2018-02-19,TP,1.0,5640.9,0.013383
16
+ sroie_sample_003,currency,exact,SGD,SGD,TP,1.0,5609.3,0.01324
17
+ sroie_sample_003,line_items[],number,0,0,TP,1.0,5609.3,0.01324
18
+ sroie_sample_003,merchant,text,KEDAI PAPAN YEW CHUAN,KEDAI PAPAN YEW CHUAN,TP,1.0,5609.3,0.01324
19
+ sroie_sample_003,merchant_address.line1,text,"LOT 276 JALAN BANTING, 43800 DENGKIL, SELANGOR","LOT 276 JALAN BANTING, 43800 DENGKIL, SELANGOR",TP,1.0,5609.3,0.01324
20
+ sroie_sample_003,total,money,110,110,TP,1.0,5609.3,0.01324
21
+ sroie_sample_003,transaction_date,date,2018-05-10,2018-05-10,TP,1.0,5609.3,0.01324
22
+ sroie_sample_004,currency,exact,SGD,SGD,TP,1.0,5265.1,0.01281
23
+ sroie_sample_004,line_items[],number,0,0,TP,1.0,5265.1,0.01281
24
+ sroie_sample_004,merchant,text,OJC MARKETING SDN BHD,OJC MARKETING SDN BHD,TP,1.0,5265.1,0.01281
25
+ sroie_sample_004,merchant_address.line1,text,"NO 2 & 4, JALAN BAYU 4, BANDAR SERI ALAM","NO 2 & 4, JALAN BAYU 4, BANDAR SERI ALAM, 81750 MASAI",TP,0.928,5265.1,0.01281
26
+ sroie_sample_004,merchant_address.line2,text,81750 MASAI,,FP,0.0,5265.1,0.01281
27
+ sroie_sample_004,total,money,48.15,48.15,TP,1.0,5265.1,0.01281
28
+ sroie_sample_004,transaction_date,date,2018-04-17,2018-04-17,TP,1.0,5265.1,0.01281
29
+ sroie_sample_005,currency,exact,SGD,SGD,TP,1.0,3196.2,0.008943
30
+ sroie_sample_005,line_items[],number,0,0,TP,1.0,3196.2,0.008943
31
+ sroie_sample_005,merchant,text,AEON CO. (M) BHD,AEON CO. (M) BHD,TP,1.0,3196.2,0.008943
32
+ sroie_sample_005,merchant_address.line1,text,,"3RD FLR, AEON TAMAN MALURI SHOPPING CENTRE",FN,0.0,3196.2,0.008943
33
+ sroie_sample_005,total,money,39.2,39.2,TP,1.0,3196.2,0.008943
34
+ sroie_sample_005,transaction_date,date,2018-11-30,2018-11-30,TP,1.0,3196.2,0.008943
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_summary.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:48:10.302997+00:00",
3
+ "summary": {
4
+ "model": "gpt-5-nano_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.9355,
9
+ "macro_f1": 0.9815,
10
+ "doc_exact_match": 0.2,
11
+ "mean_latency_ms": 5365.9,
12
+ "mean_cost_usd": 0.011673,
13
+ "total_cost_usd": 0.0584,
14
+ "wall_time_s": 26.84
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 0.9062,
18
+ "micro_recall": 0.9667,
19
+ "micro_f1": 0.9355,
20
+ "macro_f1": 0.9815
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[]": {
36
+ "field": "line_items[]",
37
+ "field_type": "number",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "merchant": {
48
+ "field": "merchant",
49
+ "field_type": "text",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "merchant_address.city": {
60
+ "field": "merchant_address.city",
61
+ "field_type": "text",
62
+ "tp": 0,
63
+ "fp": 0,
64
+ "fn": 0,
65
+ "tn": 5,
66
+ "support": 0,
67
+ "precision": 0.0,
68
+ "recall": 0.0,
69
+ "f1": 0.0
70
+ },
71
+ "merchant_address.country": {
72
+ "field": "merchant_address.country",
73
+ "field_type": "exact",
74
+ "tp": 0,
75
+ "fp": 0,
76
+ "fn": 0,
77
+ "tn": 5,
78
+ "support": 0,
79
+ "precision": 0.0,
80
+ "recall": 0.0,
81
+ "f1": 0.0
82
+ },
83
+ "merchant_address.line1": {
84
+ "field": "merchant_address.line1",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 0,
88
+ "fn": 1,
89
+ "tn": 0,
90
+ "support": 5,
91
+ "precision": 1.0,
92
+ "recall": 0.8,
93
+ "f1": 0.8889
94
+ },
95
+ "merchant_address.line2": {
96
+ "field": "merchant_address.line2",
97
+ "field_type": "text",
98
+ "tp": 0,
99
+ "fp": 2,
100
+ "fn": 0,
101
+ "tn": 3,
102
+ "support": 0,
103
+ "precision": 0.0,
104
+ "recall": 0.0,
105
+ "f1": 0.0
106
+ },
107
+ "merchant_address.postal_code": {
108
+ "field": "merchant_address.postal_code",
109
+ "field_type": "exact",
110
+ "tp": 0,
111
+ "fp": 0,
112
+ "fn": 0,
113
+ "tn": 5,
114
+ "support": 0,
115
+ "precision": 0.0,
116
+ "recall": 0.0,
117
+ "f1": 0.0
118
+ },
119
+ "merchant_address.region": {
120
+ "field": "merchant_address.region",
121
+ "field_type": "text",
122
+ "tp": 0,
123
+ "fp": 0,
124
+ "fn": 0,
125
+ "tn": 5,
126
+ "support": 0,
127
+ "precision": 0.0,
128
+ "recall": 0.0,
129
+ "f1": 0.0
130
+ },
131
+ "merchant_phone": {
132
+ "field": "merchant_phone",
133
+ "field_type": "exact",
134
+ "tp": 0,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 5,
138
+ "support": 0,
139
+ "precision": 0.0,
140
+ "recall": 0.0,
141
+ "f1": 0.0
142
+ },
143
+ "payment_method": {
144
+ "field": "payment_method",
145
+ "field_type": "exact",
146
+ "tp": 0,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 5,
150
+ "support": 0,
151
+ "precision": 0.0,
152
+ "recall": 0.0,
153
+ "f1": 0.0
154
+ },
155
+ "receipt_number": {
156
+ "field": "receipt_number",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "subtotal": {
168
+ "field": "subtotal",
169
+ "field_type": "money",
170
+ "tp": 0,
171
+ "fp": 1,
172
+ "fn": 0,
173
+ "tn": 4,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "tax": {
180
+ "field": "tax",
181
+ "field_type": "money",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "tip": {
192
+ "field": "tip",
193
+ "field_type": "money",
194
+ "tp": 0,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 5,
198
+ "support": 0,
199
+ "precision": 0.0,
200
+ "recall": 0.0,
201
+ "f1": 0.0
202
+ },
203
+ "total": {
204
+ "field": "total",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "transaction_date": {
216
+ "field": "transaction_date",
217
+ "field_type": "date",
218
+ "tp": 5,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 0,
222
+ "support": 5,
223
+ "precision": 1.0,
224
+ "recall": 1.0,
225
+ "f1": 1.0
226
+ },
227
+ "transaction_time": {
228
+ "field": "transaction_time",
229
+ "field_type": "time",
230
+ "tp": 0,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 5,
234
+ "support": 0,
235
+ "precision": 0.0,
236
+ "recall": 0.0,
237
+ "f1": 0.0
238
+ }
239
+ }
240
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5-nano_minimal_sroie/receipt_gpt-5-nano_re-minimal_summary.md ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5-nano_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:48:10+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.9355** |
12
+ | **Macro F1** | **0.9815** |
13
+ | Doc exact-match rate| 20.00% |
14
+ | Mean latency | 5366 ms |
15
+ | Mean cost / doc | $0.011673 |
16
+ | Total cost | $0.0584 |
17
+ | Wall time | 26.84 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `transaction_date` | date | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `merchant_address.line1` | text | 5 | 1.000 | 0.800 | 0.889 |
29
+ | `merchant_address.line2` | text | 0 | 0.000 | 0.000 | 0.000 |
30
+ | `subtotal` | money | 0 | 0.000 | 0.000 | 0.000 |
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_per_record.csv ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ cord_sample_001,currency,exact,KRW,KRW,TP,1.0,6031.0,0.012625
3
+ cord_sample_001,line_items[0].description,text,Iced Americano,Iced Americano,TP,1.0,6031.0,0.012625
4
+ cord_sample_001,line_items[0].quantity,number,1,1,TP,1.0,6031.0,0.012625
5
+ cord_sample_001,line_items[0].total,money,4500,4500,TP,1.0,6031.0,0.012625
6
+ cord_sample_001,line_items[0].unit_price,money,4500,4500,TP,1.0,6031.0,0.012625
7
+ cord_sample_001,line_items[1].description,text,Choco Chip Muffin,Choco Chip Muffin,TP,1.0,6031.0,0.012625
8
+ cord_sample_001,line_items[1].quantity,number,1,1,TP,1.0,6031.0,0.012625
9
+ cord_sample_001,line_items[1].total,money,3800,3800,TP,1.0,6031.0,0.012625
10
+ cord_sample_001,line_items[1].unit_price,money,3800,3800,TP,1.0,6031.0,0.012625
11
+ cord_sample_001,line_items[],number,2,2,TP,1.0,6031.0,0.012625
12
+ cord_sample_001,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,6031.0,0.012625
13
+ cord_sample_001,subtotal,money,8300,8300,TP,1.0,6031.0,0.012625
14
+ cord_sample_001,tax,money,830,830,TP,1.0,6031.0,0.012625
15
+ cord_sample_001,total,money,9130,9130,TP,1.0,6031.0,0.012625
16
+ cord_sample_002,currency,exact,KRW,KRW,TP,1.0,4906.3,0.011983
17
+ cord_sample_002,line_items[0].description,text,Bibimbap Set,Bibimbap Set,TP,1.0,4906.3,0.011983
18
+ cord_sample_002,line_items[0].quantity,number,2,2,TP,1.0,4906.3,0.011983
19
+ cord_sample_002,line_items[0].total,money,24000,24000,TP,1.0,4906.3,0.011983
20
+ cord_sample_002,line_items[0].unit_price,money,,12000,FN,0.0,4906.3,0.011983
21
+ cord_sample_002,line_items[1].description,text,Miso Soup,Miso Soup,TP,1.0,4906.3,0.011983
22
+ cord_sample_002,line_items[1].quantity,number,2,2,TP,1.0,4906.3,0.011983
23
+ cord_sample_002,line_items[1].total,money,5000,5000,TP,1.0,4906.3,0.011983
24
+ cord_sample_002,line_items[1].unit_price,money,,2500,FN,0.0,4906.3,0.011983
25
+ cord_sample_002,line_items[],number,2,2,TP,1.0,4906.3,0.011983
26
+ cord_sample_002,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,4906.3,0.011983
27
+ cord_sample_002,subtotal,money,29000,29000,TP,1.0,4906.3,0.011983
28
+ cord_sample_002,tax,money,2900,2900,TP,1.0,4906.3,0.011983
29
+ cord_sample_002,total,money,31900,31900,TP,1.0,4906.3,0.011983
30
+ cord_sample_003,currency,exact,KRW,KRW,TP,1.0,4453.5,0.011678
31
+ cord_sample_003,line_items[0].description,text,Latte,Latte,TP,1.0,4453.5,0.011678
32
+ cord_sample_003,line_items[0].quantity,number,1,1,TP,1.0,4453.5,0.011678
33
+ cord_sample_003,line_items[0].total,money,5000,5000,TP,1.0,4453.5,0.011678
34
+ cord_sample_003,line_items[0].unit_price,money,5000,5000,TP,1.0,4453.5,0.011678
35
+ cord_sample_003,line_items[],number,1,1,TP,1.0,4453.5,0.011678
36
+ cord_sample_003,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,4453.5,0.011678
37
+ cord_sample_003,subtotal,money,5000,5000,TP,1.0,4453.5,0.011678
38
+ cord_sample_003,tax,money,500,500,TP,1.0,4453.5,0.011678
39
+ cord_sample_003,total,money,5500,5500,TP,1.0,4453.5,0.011678
40
+ cord_sample_004,currency,exact,KRW,KRW,TP,1.0,5115.1,0.012975
41
+ cord_sample_004,line_items[0].description,text,Kimchi Fried Rice,Kimchi Fried Rice,TP,1.0,5115.1,0.012975
42
+ cord_sample_004,line_items[0].quantity,number,1,1,TP,1.0,5115.1,0.012975
43
+ cord_sample_004,line_items[0].total,money,9500,9500,TP,1.0,5115.1,0.012975
44
+ cord_sample_004,line_items[0].unit_price,money,,9500,FN,0.0,5115.1,0.012975
45
+ cord_sample_004,line_items[1].description,text,Egg Roll,Egg Roll,TP,1.0,5115.1,0.012975
46
+ cord_sample_004,line_items[1].quantity,number,1,1,TP,1.0,5115.1,0.012975
47
+ cord_sample_004,line_items[1].total,money,3500,3500,TP,1.0,5115.1,0.012975
48
+ cord_sample_004,line_items[1].unit_price,money,,3500,FN,0.0,5115.1,0.012975
49
+ cord_sample_004,line_items[2].description,text,Soft Drink,Soft Drink,TP,1.0,5115.1,0.012975
50
+ cord_sample_004,line_items[2].quantity,number,2,2,TP,1.0,5115.1,0.012975
51
+ cord_sample_004,line_items[2].total,money,4000,4000,TP,1.0,5115.1,0.012975
52
+ cord_sample_004,line_items[2].unit_price,money,,2000,FN,0.0,5115.1,0.012975
53
+ cord_sample_004,line_items[],number,3,3,TP,1.0,5115.1,0.012975
54
+ cord_sample_004,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,5115.1,0.012975
55
+ cord_sample_004,subtotal,money,17000,17000,TP,1.0,5115.1,0.012975
56
+ cord_sample_004,tax,money,1700,1700,TP,1.0,5115.1,0.012975
57
+ cord_sample_004,total,money,18700,18700,TP,1.0,5115.1,0.012975
58
+ cord_sample_005,currency,exact,KRW,KRW,TP,1.0,5599.3,0.01259
59
+ cord_sample_005,line_items[0].description,text,Espresso,Espresso,TP,1.0,5599.3,0.01259
60
+ cord_sample_005,line_items[0].quantity,number,1,1,TP,1.0,5599.3,0.01259
61
+ cord_sample_005,line_items[0].total,money,3500,3500,TP,1.0,5599.3,0.01259
62
+ cord_sample_005,line_items[0].unit_price,money,3500,3500,TP,1.0,5599.3,0.01259
63
+ cord_sample_005,line_items[1].description,text,Cheesecake Slice,Cheesecake Slice,TP,1.0,5599.3,0.01259
64
+ cord_sample_005,line_items[1].quantity,number,1,1,TP,1.0,5599.3,0.01259
65
+ cord_sample_005,line_items[1].total,money,6500,6500,TP,1.0,5599.3,0.01259
66
+ cord_sample_005,line_items[1].unit_price,money,6500,6500,TP,1.0,5599.3,0.01259
67
+ cord_sample_005,line_items[],number,2,2,TP,1.0,5599.3,0.01259
68
+ cord_sample_005,merchant,text,Unknown merchant,Unknown merchant,TP,1.0,5599.3,0.01259
69
+ cord_sample_005,subtotal,money,10000,10000,TP,1.0,5599.3,0.01259
70
+ cord_sample_005,tax,money,1000,1000,TP,1.0,5599.3,0.01259
71
+ cord_sample_005,total,money,11000,11000,TP,1.0,5599.3,0.01259
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_summary.json ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:50:38.925721+00:00",
3
+ "summary": {
4
+ "model": "gpt-5_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.963,
9
+ "macro_f1": 0.912,
10
+ "doc_exact_match": 0.6,
11
+ "mean_latency_ms": 5221.0,
12
+ "mean_cost_usd": 0.01237,
13
+ "total_cost_usd": 0.0619,
14
+ "wall_time_s": 26.11
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 1.0,
18
+ "micro_recall": 0.9286,
19
+ "micro_f1": 0.963,
20
+ "macro_f1": 0.912
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[0].description": {
36
+ "field": "line_items[0].description",
37
+ "field_type": "text",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "line_items[0].quantity": {
48
+ "field": "line_items[0].quantity",
49
+ "field_type": "number",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "line_items[0].total": {
60
+ "field": "line_items[0].total",
61
+ "field_type": "money",
62
+ "tp": 5,
63
+ "fp": 0,
64
+ "fn": 0,
65
+ "tn": 0,
66
+ "support": 5,
67
+ "precision": 1.0,
68
+ "recall": 1.0,
69
+ "f1": 1.0
70
+ },
71
+ "line_items[0].unit_price": {
72
+ "field": "line_items[0].unit_price",
73
+ "field_type": "money",
74
+ "tp": 3,
75
+ "fp": 0,
76
+ "fn": 2,
77
+ "tn": 0,
78
+ "support": 5,
79
+ "precision": 1.0,
80
+ "recall": 0.6,
81
+ "f1": 0.75
82
+ },
83
+ "line_items[1].description": {
84
+ "field": "line_items[1].description",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 0,
88
+ "fn": 0,
89
+ "tn": 0,
90
+ "support": 4,
91
+ "precision": 1.0,
92
+ "recall": 1.0,
93
+ "f1": 1.0
94
+ },
95
+ "line_items[1].quantity": {
96
+ "field": "line_items[1].quantity",
97
+ "field_type": "number",
98
+ "tp": 4,
99
+ "fp": 0,
100
+ "fn": 0,
101
+ "tn": 0,
102
+ "support": 4,
103
+ "precision": 1.0,
104
+ "recall": 1.0,
105
+ "f1": 1.0
106
+ },
107
+ "line_items[1].total": {
108
+ "field": "line_items[1].total",
109
+ "field_type": "money",
110
+ "tp": 4,
111
+ "fp": 0,
112
+ "fn": 0,
113
+ "tn": 0,
114
+ "support": 4,
115
+ "precision": 1.0,
116
+ "recall": 1.0,
117
+ "f1": 1.0
118
+ },
119
+ "line_items[1].unit_price": {
120
+ "field": "line_items[1].unit_price",
121
+ "field_type": "money",
122
+ "tp": 2,
123
+ "fp": 0,
124
+ "fn": 2,
125
+ "tn": 0,
126
+ "support": 4,
127
+ "precision": 1.0,
128
+ "recall": 0.5,
129
+ "f1": 0.6667
130
+ },
131
+ "line_items[]": {
132
+ "field": "line_items[]",
133
+ "field_type": "number",
134
+ "tp": 5,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 0,
138
+ "support": 5,
139
+ "precision": 1.0,
140
+ "recall": 1.0,
141
+ "f1": 1.0
142
+ },
143
+ "merchant": {
144
+ "field": "merchant",
145
+ "field_type": "text",
146
+ "tp": 5,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 0,
150
+ "support": 5,
151
+ "precision": 1.0,
152
+ "recall": 1.0,
153
+ "f1": 1.0
154
+ },
155
+ "merchant_phone": {
156
+ "field": "merchant_phone",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "payment_method": {
168
+ "field": "payment_method",
169
+ "field_type": "exact",
170
+ "tp": 0,
171
+ "fp": 0,
172
+ "fn": 0,
173
+ "tn": 5,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "receipt_number": {
180
+ "field": "receipt_number",
181
+ "field_type": "exact",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "subtotal": {
192
+ "field": "subtotal",
193
+ "field_type": "money",
194
+ "tp": 5,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 0,
198
+ "support": 5,
199
+ "precision": 1.0,
200
+ "recall": 1.0,
201
+ "f1": 1.0
202
+ },
203
+ "tax": {
204
+ "field": "tax",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "tip": {
216
+ "field": "tip",
217
+ "field_type": "money",
218
+ "tp": 0,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 5,
222
+ "support": 0,
223
+ "precision": 0.0,
224
+ "recall": 0.0,
225
+ "f1": 0.0
226
+ },
227
+ "total": {
228
+ "field": "total",
229
+ "field_type": "money",
230
+ "tp": 5,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 0,
234
+ "support": 5,
235
+ "precision": 1.0,
236
+ "recall": 1.0,
237
+ "f1": 1.0
238
+ },
239
+ "transaction_date": {
240
+ "field": "transaction_date",
241
+ "field_type": "date",
242
+ "tp": 0,
243
+ "fp": 0,
244
+ "fn": 0,
245
+ "tn": 5,
246
+ "support": 0,
247
+ "precision": 0.0,
248
+ "recall": 0.0,
249
+ "f1": 0.0
250
+ },
251
+ "transaction_time": {
252
+ "field": "transaction_time",
253
+ "field_type": "time",
254
+ "tp": 0,
255
+ "fp": 0,
256
+ "fn": 0,
257
+ "tn": 5,
258
+ "support": 0,
259
+ "precision": 0.0,
260
+ "recall": 0.0,
261
+ "f1": 0.0
262
+ },
263
+ "line_items[2].description": {
264
+ "field": "line_items[2].description",
265
+ "field_type": "text",
266
+ "tp": 1,
267
+ "fp": 0,
268
+ "fn": 0,
269
+ "tn": 0,
270
+ "support": 1,
271
+ "precision": 1.0,
272
+ "recall": 1.0,
273
+ "f1": 1.0
274
+ },
275
+ "line_items[2].quantity": {
276
+ "field": "line_items[2].quantity",
277
+ "field_type": "number",
278
+ "tp": 1,
279
+ "fp": 0,
280
+ "fn": 0,
281
+ "tn": 0,
282
+ "support": 1,
283
+ "precision": 1.0,
284
+ "recall": 1.0,
285
+ "f1": 1.0
286
+ },
287
+ "line_items[2].total": {
288
+ "field": "line_items[2].total",
289
+ "field_type": "money",
290
+ "tp": 1,
291
+ "fp": 0,
292
+ "fn": 0,
293
+ "tn": 0,
294
+ "support": 1,
295
+ "precision": 1.0,
296
+ "recall": 1.0,
297
+ "f1": 1.0
298
+ },
299
+ "line_items[2].unit_price": {
300
+ "field": "line_items[2].unit_price",
301
+ "field_type": "money",
302
+ "tp": 0,
303
+ "fp": 0,
304
+ "fn": 1,
305
+ "tn": 0,
306
+ "support": 1,
307
+ "precision": 0.0,
308
+ "recall": 0.0,
309
+ "f1": 0.0
310
+ }
311
+ }
312
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_cord/receipt_gpt-5_re-minimal_summary.md ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:50:38+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.9630** |
12
+ | **Macro F1** | **0.9120** |
13
+ | Doc exact-match rate| 60.00% |
14
+ | Mean latency | 5221 ms |
15
+ | Mean cost / doc | $0.012370 |
16
+ | Total cost | $0.0619 |
17
+ | Wall time | 26.11 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[0].description` | text | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `line_items[0].quantity` | number | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `line_items[0].total` | money | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
29
+ | `subtotal` | money | 5 | 1.000 | 1.000 | 1.000 |
30
+ | `tax` | money | 5 | 1.000 | 1.000 | 1.000 |
31
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
32
+ | `line_items[0].unit_price` | money | 5 | 1.000 | 0.600 | 0.750 |
33
+ | `line_items[1].description` | text | 4 | 1.000 | 1.000 | 1.000 |
34
+ | `line_items[1].quantity` | number | 4 | 1.000 | 1.000 | 1.000 |
35
+ | `line_items[1].total` | money | 4 | 1.000 | 1.000 | 1.000 |
36
+ | `line_items[1].unit_price` | money | 4 | 1.000 | 0.500 | 0.667 |
37
+ | `line_items[2].description` | text | 1 | 1.000 | 1.000 | 1.000 |
38
+ | `line_items[2].quantity` | number | 1 | 1.000 | 1.000 | 1.000 |
39
+ | `line_items[2].total` | money | 1 | 1.000 | 1.000 | 1.000 |
40
+ | `line_items[2].unit_price` | money | 1 | 0.000 | 0.000 | 0.000 |
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_per_record.csv ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ doc_id,field,field_type,predicted,truth,outcome,score,latency_ms,cost_usd
2
+ sroie_sample_001,currency,exact,SGD,SGD,TP,1.0,7563.0,0.01218
3
+ sroie_sample_001,line_items[],number,0,0,TP,1.0,7563.0,0.01218
4
+ sroie_sample_001,merchant,text,TAN WOON YANN,TAN WOON YANN,TP,1.0,7563.0,0.01218
5
+ sroie_sample_001,merchant_address.city,text,JOHOR BAHRU,,FP,0.0,7563.0,0.01218
6
+ sroie_sample_001,merchant_address.country,exact,MY,,FP,0.0,7563.0,0.01218
7
+ sroie_sample_001,merchant_address.line1,text,"789 KING STREET, TAMAN DAYA","789 KING STREET, TAMAN DAYA, 81100 JOHOR BAHRU",TP,0.898,7563.0,0.01218
8
+ sroie_sample_001,merchant_address.postal_code,exact,81100,,FP,0.0,7563.0,0.01218
9
+ sroie_sample_001,total,money,72,72,TP,1.0,7563.0,0.01218
10
+ sroie_sample_001,transaction_date,date,2018-06-25,2018-06-25,TP,1.0,7563.0,0.01218
11
+ sroie_sample_002,currency,exact,SGD,SGD,TP,1.0,5417.4,0.011383
12
+ sroie_sample_002,line_items[],number,0,0,TP,1.0,5417.4,0.011383
13
+ sroie_sample_002,merchant,text,SANYU STATIONERY SHOP,SANYU STATIONERY SHOP,TP,1.0,5417.4,0.011383
14
+ sroie_sample_002,merchant_address.city,text,SHAH ALAM,,FP,0.0,5417.4,0.011383
15
+ sroie_sample_002,merchant_address.line1,text,"NO. 31G&33G, JALAN SETIA INDAH X, U13/X","NO. 31G&33G, JALAN SETIA INDAH X, U13/X 40170 SHAH ALAM",TP,1.0,5417.4,0.011383
16
+ sroie_sample_002,merchant_address.postal_code,exact,40170,,FP,0.0,5417.4,0.011383
17
+ sroie_sample_002,total,money,16.3,16.3,TP,1.0,5417.4,0.011383
18
+ sroie_sample_002,transaction_date,date,2018-02-19,2018-02-19,TP,1.0,5417.4,0.011383
19
+ sroie_sample_003,currency,exact,SGD,SGD,TP,1.0,4327.8,0.01083
20
+ sroie_sample_003,line_items[],number,0,0,TP,1.0,4327.8,0.01083
21
+ sroie_sample_003,merchant,text,KEDAI PAPAN YEW CHUAN,KEDAI PAPAN YEW CHUAN,TP,1.0,4327.8,0.01083
22
+ sroie_sample_003,merchant_address.city,text,DENGKIL,,FP,0.0,4327.8,0.01083
23
+ sroie_sample_003,merchant_address.line1,text,LOT 276 JALAN BANTING,"LOT 276 JALAN BANTING, 43800 DENGKIL, SELANGOR",MISMATCH,0.765,4327.8,0.01083
24
+ sroie_sample_003,merchant_address.postal_code,exact,43800,,FP,0.0,4327.8,0.01083
25
+ sroie_sample_003,merchant_address.region,text,SELANGOR,,FP,0.0,4327.8,0.01083
26
+ sroie_sample_003,total,money,110,110,TP,1.0,4327.8,0.01083
27
+ sroie_sample_003,transaction_date,date,2018-05-10,2018-05-10,TP,1.0,4327.8,0.01083
28
+ sroie_sample_004,currency,exact,SGD,SGD,TP,1.0,4916.9,0.01103
29
+ sroie_sample_004,line_items[],number,0,0,TP,1.0,4916.9,0.01103
30
+ sroie_sample_004,merchant,text,OJC MARKETING SDN BHD,OJC MARKETING SDN BHD,TP,1.0,4916.9,0.01103
31
+ sroie_sample_004,merchant_address.city,text,MASAI,,FP,0.0,4916.9,0.01103
32
+ sroie_sample_004,merchant_address.country,exact,MY,,FP,0.0,4916.9,0.01103
33
+ sroie_sample_004,merchant_address.line1,text,"NO 2 & 4, JALAN BAYU 4, BANDAR SERI ALAM","NO 2 & 4, JALAN BAYU 4, BANDAR SERI ALAM, 81750 MASAI",TP,0.928,4916.9,0.01103
34
+ sroie_sample_004,merchant_address.postal_code,exact,81750,,FP,0.0,4916.9,0.01103
35
+ sroie_sample_004,total,money,48.15,48.15,TP,1.0,4916.9,0.01103
36
+ sroie_sample_004,transaction_date,date,2018-04-17,2018-04-17,TP,1.0,4916.9,0.01103
37
+ sroie_sample_005,currency,exact,SGD,SGD,TP,1.0,5441.7,0.010953
38
+ sroie_sample_005,line_items[],number,0,0,TP,1.0,5441.7,0.010953
39
+ sroie_sample_005,merchant,text,AEON CO. (M) BHD,AEON CO. (M) BHD,TP,1.0,5441.7,0.010953
40
+ sroie_sample_005,merchant_address.country,exact,MY,,FP,0.0,5441.7,0.010953
41
+ sroie_sample_005,merchant_address.line1,text,"3RD FLR, AEON TAMAN MALURI SHOPPING CENTRE","3RD FLR, AEON TAMAN MALURI SHOPPING CENTRE",TP,1.0,5441.7,0.010953
42
+ sroie_sample_005,total,money,39.2,39.2,TP,1.0,5441.7,0.010953
43
+ sroie_sample_005,transaction_date,date,2018-11-30,2018-11-30,TP,1.0,5441.7,0.010953
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_summary.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "generated_at": "2026-07-05T06:50:10.976416+00:00",
3
+ "summary": {
4
+ "model": "gpt-5_re-minimal",
5
+ "doc_type": "receipt",
6
+ "n_docs": 5,
7
+ "errors": 0,
8
+ "micro_f1": 0.8056,
9
+ "macro_f1": 0.9667,
10
+ "doc_exact_match": 0.0,
11
+ "mean_latency_ms": 5533.4,
12
+ "mean_cost_usd": 0.011275,
13
+ "total_cost_usd": 0.0564,
14
+ "wall_time_s": 27.67
15
+ },
16
+ "aggregate": {
17
+ "micro_precision": 0.6905,
18
+ "micro_recall": 0.9667,
19
+ "micro_f1": 0.8056,
20
+ "macro_f1": 0.9667
21
+ },
22
+ "field_stats": {
23
+ "currency": {
24
+ "field": "currency",
25
+ "field_type": "exact",
26
+ "tp": 5,
27
+ "fp": 0,
28
+ "fn": 0,
29
+ "tn": 0,
30
+ "support": 5,
31
+ "precision": 1.0,
32
+ "recall": 1.0,
33
+ "f1": 1.0
34
+ },
35
+ "line_items[]": {
36
+ "field": "line_items[]",
37
+ "field_type": "number",
38
+ "tp": 5,
39
+ "fp": 0,
40
+ "fn": 0,
41
+ "tn": 0,
42
+ "support": 5,
43
+ "precision": 1.0,
44
+ "recall": 1.0,
45
+ "f1": 1.0
46
+ },
47
+ "merchant": {
48
+ "field": "merchant",
49
+ "field_type": "text",
50
+ "tp": 5,
51
+ "fp": 0,
52
+ "fn": 0,
53
+ "tn": 0,
54
+ "support": 5,
55
+ "precision": 1.0,
56
+ "recall": 1.0,
57
+ "f1": 1.0
58
+ },
59
+ "merchant_address.city": {
60
+ "field": "merchant_address.city",
61
+ "field_type": "text",
62
+ "tp": 0,
63
+ "fp": 4,
64
+ "fn": 0,
65
+ "tn": 1,
66
+ "support": 0,
67
+ "precision": 0.0,
68
+ "recall": 0.0,
69
+ "f1": 0.0
70
+ },
71
+ "merchant_address.country": {
72
+ "field": "merchant_address.country",
73
+ "field_type": "exact",
74
+ "tp": 0,
75
+ "fp": 3,
76
+ "fn": 0,
77
+ "tn": 2,
78
+ "support": 0,
79
+ "precision": 0.0,
80
+ "recall": 0.0,
81
+ "f1": 0.0
82
+ },
83
+ "merchant_address.line1": {
84
+ "field": "merchant_address.line1",
85
+ "field_type": "text",
86
+ "tp": 4,
87
+ "fp": 1,
88
+ "fn": 1,
89
+ "tn": 0,
90
+ "support": 5,
91
+ "precision": 0.8,
92
+ "recall": 0.8,
93
+ "f1": 0.8
94
+ },
95
+ "merchant_address.line2": {
96
+ "field": "merchant_address.line2",
97
+ "field_type": "text",
98
+ "tp": 0,
99
+ "fp": 0,
100
+ "fn": 0,
101
+ "tn": 5,
102
+ "support": 0,
103
+ "precision": 0.0,
104
+ "recall": 0.0,
105
+ "f1": 0.0
106
+ },
107
+ "merchant_address.postal_code": {
108
+ "field": "merchant_address.postal_code",
109
+ "field_type": "exact",
110
+ "tp": 0,
111
+ "fp": 4,
112
+ "fn": 0,
113
+ "tn": 1,
114
+ "support": 0,
115
+ "precision": 0.0,
116
+ "recall": 0.0,
117
+ "f1": 0.0
118
+ },
119
+ "merchant_address.region": {
120
+ "field": "merchant_address.region",
121
+ "field_type": "text",
122
+ "tp": 0,
123
+ "fp": 1,
124
+ "fn": 0,
125
+ "tn": 4,
126
+ "support": 0,
127
+ "precision": 0.0,
128
+ "recall": 0.0,
129
+ "f1": 0.0
130
+ },
131
+ "merchant_phone": {
132
+ "field": "merchant_phone",
133
+ "field_type": "exact",
134
+ "tp": 0,
135
+ "fp": 0,
136
+ "fn": 0,
137
+ "tn": 5,
138
+ "support": 0,
139
+ "precision": 0.0,
140
+ "recall": 0.0,
141
+ "f1": 0.0
142
+ },
143
+ "payment_method": {
144
+ "field": "payment_method",
145
+ "field_type": "exact",
146
+ "tp": 0,
147
+ "fp": 0,
148
+ "fn": 0,
149
+ "tn": 5,
150
+ "support": 0,
151
+ "precision": 0.0,
152
+ "recall": 0.0,
153
+ "f1": 0.0
154
+ },
155
+ "receipt_number": {
156
+ "field": "receipt_number",
157
+ "field_type": "exact",
158
+ "tp": 0,
159
+ "fp": 0,
160
+ "fn": 0,
161
+ "tn": 5,
162
+ "support": 0,
163
+ "precision": 0.0,
164
+ "recall": 0.0,
165
+ "f1": 0.0
166
+ },
167
+ "subtotal": {
168
+ "field": "subtotal",
169
+ "field_type": "money",
170
+ "tp": 0,
171
+ "fp": 0,
172
+ "fn": 0,
173
+ "tn": 5,
174
+ "support": 0,
175
+ "precision": 0.0,
176
+ "recall": 0.0,
177
+ "f1": 0.0
178
+ },
179
+ "tax": {
180
+ "field": "tax",
181
+ "field_type": "money",
182
+ "tp": 0,
183
+ "fp": 0,
184
+ "fn": 0,
185
+ "tn": 5,
186
+ "support": 0,
187
+ "precision": 0.0,
188
+ "recall": 0.0,
189
+ "f1": 0.0
190
+ },
191
+ "tip": {
192
+ "field": "tip",
193
+ "field_type": "money",
194
+ "tp": 0,
195
+ "fp": 0,
196
+ "fn": 0,
197
+ "tn": 5,
198
+ "support": 0,
199
+ "precision": 0.0,
200
+ "recall": 0.0,
201
+ "f1": 0.0
202
+ },
203
+ "total": {
204
+ "field": "total",
205
+ "field_type": "money",
206
+ "tp": 5,
207
+ "fp": 0,
208
+ "fn": 0,
209
+ "tn": 0,
210
+ "support": 5,
211
+ "precision": 1.0,
212
+ "recall": 1.0,
213
+ "f1": 1.0
214
+ },
215
+ "transaction_date": {
216
+ "field": "transaction_date",
217
+ "field_type": "date",
218
+ "tp": 5,
219
+ "fp": 0,
220
+ "fn": 0,
221
+ "tn": 0,
222
+ "support": 5,
223
+ "precision": 1.0,
224
+ "recall": 1.0,
225
+ "f1": 1.0
226
+ },
227
+ "transaction_time": {
228
+ "field": "transaction_time",
229
+ "field_type": "time",
230
+ "tp": 0,
231
+ "fp": 0,
232
+ "fn": 0,
233
+ "tn": 5,
234
+ "support": 0,
235
+ "precision": 0.0,
236
+ "recall": 0.0,
237
+ "f1": 0.0
238
+ }
239
+ }
240
+ }
evaluation/benchmarks/20260705T064740Z/gpt-5_minimal_sroie/receipt_gpt-5_re-minimal_summary.md ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation Report β€” `receipt` on `gpt-5_re-minimal`
2
+
3
+ _Generated: 2026-07-05T06:50:10+00:00_
4
+
5
+ ## Headline
6
+
7
+ | Metric | Value |
8
+ |---|---|
9
+ | Documents evaluated | 5 |
10
+ | Extractor errors | 0 |
11
+ | **Micro F1** | **0.8056** |
12
+ | **Macro F1** | **0.9667** |
13
+ | Doc exact-match rate| 0.00% |
14
+ | Mean latency | 5533 ms |
15
+ | Mean cost / doc | $0.011275 |
16
+ | Total cost | $0.0564 |
17
+ | Wall time | 27.67 s |
18
+
19
+ ## Per-field performance
20
+
21
+ | Field | Type | Support | Precision | Recall | F1 |
22
+ |---|---|---:|---:|---:|---:|
23
+ | `currency` | exact | 5 | 1.000 | 1.000 | 1.000 |
24
+ | `line_items[]` | number | 5 | 1.000 | 1.000 | 1.000 |
25
+ | `merchant` | text | 5 | 1.000 | 1.000 | 1.000 |
26
+ | `total` | money | 5 | 1.000 | 1.000 | 1.000 |
27
+ | `transaction_date` | date | 5 | 1.000 | 1.000 | 1.000 |
28
+ | `merchant_address.line1` | text | 5 | 0.800 | 0.800 | 0.800 |
29
+ | `merchant_address.city` | text | 0 | 0.000 | 0.000 | 0.000 |
30
+ | `merchant_address.country` | exact | 0 | 0.000 | 0.000 | 0.000 |
31
+ | `merchant_address.postal_code` | exact | 0 | 0.000 | 0.000 | 0.000 |
32
+ | `merchant_address.region` | text | 0 | 0.000 | 0.000 | 0.000 |
scripts/run_multimodel_benchmark.py ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Run the same evaluation across several models + write a comparison table.
2
+
3
+ Baseline is gpt-5-nano @ minimal effort (already validated on 2026-07-04).
4
+ This script sweeps a small matrix of (model, reasoning_effort) combos over
5
+ the committed smoke datasets (5 SROIE + 5 CORD receipts) and produces:
6
+
7
+ evaluation/benchmarks/<UTC-timestamp>/comparison.json
8
+ evaluation/benchmarks/<UTC-timestamp>/comparison.csv
9
+ evaluation/benchmarks/<UTC-timestamp>/comparison.md
10
+
11
+ The markdown table drops straight into the README.
12
+
13
+ Usage
14
+ -----
15
+ # Default matrix (gpt-5 nano/mini/full @ minimal)
16
+ python scripts/run_multimodel_benchmark.py
17
+
18
+ # Custom matrix: pass any number of MODEL[:effort] specs
19
+ python scripts/run_multimodel_benchmark.py gpt-5-nano:minimal gpt-4o-mini
20
+
21
+ # Dry-run to check what would fire without hitting the API
22
+ python scripts/run_multimodel_benchmark.py --dry-run
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import argparse
27
+ import csv
28
+ import json
29
+ import subprocess
30
+ import sys
31
+ from dataclasses import dataclass
32
+ from datetime import datetime, timezone
33
+ from pathlib import Path
34
+
35
+ ROOT = Path(__file__).resolve().parents[1]
36
+ DATASETS = [
37
+ ("receipt", ROOT / "evaluation" / "smoke_sroie_sample.jsonl", "sroie"),
38
+ ("receipt", ROOT / "evaluation" / "smoke_cord_sample.jsonl", "cord"),
39
+ ]
40
+
41
+ DEFAULT_MATRIX = [
42
+ ("gpt-5-nano", "minimal"),
43
+ ("gpt-5-mini", "minimal"),
44
+ ("gpt-5", "minimal"),
45
+ ]
46
+
47
+
48
+ @dataclass
49
+ class Combo:
50
+ model: str
51
+ effort: str | None
52
+
53
+ @property
54
+ def label(self) -> str:
55
+ return f"{self.model}" + (f"@{self.effort}" if self.effort else "")
56
+
57
+
58
+ def parse_spec(spec: str) -> Combo:
59
+ if ":" in spec:
60
+ m, e = spec.split(":", 1)
61
+ return Combo(model=m.strip(), effort=e.strip() or None)
62
+ return Combo(model=spec.strip(), effort=None)
63
+
64
+
65
+ def run_one_eval(combo: Combo, doc_type: str, dataset: Path, out_dir: Path) -> dict:
66
+ """Fire the eval CLI for one (combo, dataset) and load the JSON summary."""
67
+ cmd = [
68
+ sys.executable, "-m", "src.eval.cli",
69
+ "--dataset", str(dataset),
70
+ "--doc-type", doc_type,
71
+ "--mode", "live",
72
+ "--model", combo.model,
73
+ "--output-dir", str(out_dir),
74
+ ]
75
+ if combo.effort:
76
+ cmd += ["--reasoning-effort", combo.effort]
77
+
78
+ print(f" $ {' '.join(cmd)}", flush=True)
79
+ r = subprocess.run(cmd, cwd=ROOT, capture_output=True, text=True)
80
+ if r.returncode != 0:
81
+ print(r.stdout)
82
+ print(r.stderr, file=sys.stderr)
83
+ raise SystemExit(f"eval CLI failed: rc={r.returncode}")
84
+
85
+ # Find the summary JSON just written (there's exactly one _summary.json per run).
86
+ matches = sorted(out_dir.glob("*_summary.json"))
87
+ if not matches:
88
+ raise RuntimeError(f"no summary.json in {out_dir}")
89
+ with matches[-1].open() as f:
90
+ return json.load(f)["summary"]
91
+
92
+
93
+ def aggregate(rows: list[dict]) -> dict:
94
+ """Weighted aggregate of per-dataset runs into one row per (model, effort)."""
95
+ n = sum(r["n_docs"] for r in rows)
96
+ if n == 0:
97
+ return {}
98
+ def w(k): return sum(r[k] * r["n_docs"] for r in rows) / n
99
+ return {
100
+ "n_docs": n,
101
+ "errors": sum(r["errors"] for r in rows),
102
+ "micro_f1": round(w("micro_f1"), 4),
103
+ "macro_f1": round(w("macro_f1"), 4),
104
+ "doc_exact_match": round(w("doc_exact_match"), 4),
105
+ "mean_latency_ms": round(w("mean_latency_ms"), 0),
106
+ "mean_cost_usd": round(w("mean_cost_usd"), 6),
107
+ "total_cost_usd": round(sum(r["total_cost_usd"] for r in rows), 4),
108
+ "wall_time_s": round(sum(r["wall_time_s"] for r in rows), 2),
109
+ }
110
+
111
+
112
+ def write_markdown(combos: list[Combo], results: dict[str, dict], out: Path) -> Path:
113
+ lines = [
114
+ "# Multi-model benchmark",
115
+ "",
116
+ f"_Generated: {datetime.now(timezone.utc).isoformat(timespec='seconds')}_",
117
+ "",
118
+ "10 receipts (5 SROIE + 5 CORD), synthetic text derived from public ground truth.",
119
+ "All runs use the same prompts, schemas, and post-processing β€” the only variable is the model.",
120
+ "",
121
+ "| Model | Effort | Micro F1 | Macro F1 | Doc-exact | Latency (ms) | Cost / doc | Total cost |",
122
+ "|---|---|---:|---:|---:|---:|---:|---:|",
123
+ ]
124
+ for c in combos:
125
+ r = results.get(c.label)
126
+ if not r:
127
+ lines.append(f"| `{c.model}` | {c.effort or 'β€”'} | β€” | β€” | β€” | β€” | β€” | β€” |")
128
+ continue
129
+ lines.append(
130
+ f"| `{c.model}` | {c.effort or 'β€”'} | "
131
+ f"{r['micro_f1']:.3f} | {r['macro_f1']:.3f} | {r['doc_exact_match']:.0%} | "
132
+ f"{r['mean_latency_ms']:.0f} | ${r['mean_cost_usd']:.5f} | ${r['total_cost_usd']:.4f} |"
133
+ )
134
+ lines.append("")
135
+ lines.append("_Field-level breakdowns live in each combo's per-run report under `evaluation/reports/`._")
136
+ out.write_text("\n".join(lines), encoding="utf-8")
137
+ return out
138
+
139
+
140
+ def write_csv(combos: list[Combo], results: dict[str, dict], out: Path) -> Path:
141
+ fields = ["model", "reasoning_effort", "micro_f1", "macro_f1", "doc_exact_match",
142
+ "mean_latency_ms", "mean_cost_usd", "total_cost_usd", "wall_time_s", "n_docs", "errors"]
143
+ with out.open("w", newline="") as f:
144
+ w = csv.DictWriter(f, fieldnames=fields)
145
+ w.writeheader()
146
+ for c in combos:
147
+ r = results.get(c.label, {})
148
+ row = {"model": c.model, "reasoning_effort": c.effort or ""}
149
+ row.update({k: r.get(k, "") for k in fields[2:]})
150
+ w.writerow(row)
151
+ return out
152
+
153
+
154
+ def main(argv: list[str] | None = None) -> int:
155
+ ap = argparse.ArgumentParser(description=__doc__)
156
+ ap.add_argument("specs", nargs="*", help="Optional model specs (model[:effort]).")
157
+ ap.add_argument("--dry-run", action="store_true", help="Print matrix + exit.")
158
+ args = ap.parse_args(argv)
159
+
160
+ combos = [parse_spec(s) for s in args.specs] if args.specs else [Combo(m, e) for m, e in DEFAULT_MATRIX]
161
+
162
+ stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
163
+ bench_root = ROOT / "evaluation" / "benchmarks" / stamp
164
+ bench_root.mkdir(parents=True, exist_ok=True)
165
+
166
+ print(f"Benchmark run: {bench_root}")
167
+ print("Matrix:")
168
+ for c in combos:
169
+ print(f" - {c.label}")
170
+ print(f"Datasets: {len(DATASETS)} ({sum(1 for _ in DATASETS)} runs per model)")
171
+ if args.dry_run:
172
+ return 0
173
+
174
+ # Sanity-check: OPENAI_API_KEY must be set (dotenv is loaded by src.utils.config).
175
+ from dotenv import dotenv_values
176
+ env_file = ROOT / ".env"
177
+ if not env_file.exists():
178
+ print("ERROR: .env not found β€” add OPENAI_API_KEY there or export it.", file=sys.stderr)
179
+ return 2
180
+ if not (dotenv_values(env_file).get("OPENAI_API_KEY") or "").strip():
181
+ print("ERROR: OPENAI_API_KEY missing/blank in .env", file=sys.stderr)
182
+ return 2
183
+
184
+ results: dict[str, dict] = {}
185
+ for c in combos:
186
+ print(f"\n=== {c.label} ===")
187
+ per_dataset: list[dict] = []
188
+ for doc_type, dataset, tag in DATASETS:
189
+ run_dir = bench_root / f"{c.model.replace('/', '_')}_{c.effort or 'default'}_{tag}"
190
+ run_dir.mkdir(parents=True, exist_ok=True)
191
+ summary = run_one_eval(c, doc_type, dataset, run_dir)
192
+ per_dataset.append(summary)
193
+ print(f" [{tag}] micro_f1={summary['micro_f1']:.3f} "
194
+ f"cost/doc=${summary['mean_cost_usd']:.5f} "
195
+ f"lat={summary['mean_latency_ms']:.0f}ms")
196
+ results[c.label] = aggregate(per_dataset)
197
+
198
+ # Emit the three roll-up files.
199
+ (bench_root / "comparison.json").write_text(json.dumps(
200
+ {"generated_at": datetime.now(timezone.utc).isoformat(),
201
+ "matrix": [{"model": c.model, "reasoning_effort": c.effort} for c in combos],
202
+ "results": results},
203
+ indent=2))
204
+ write_csv(combos, results, bench_root / "comparison.csv")
205
+ write_markdown(combos, results, bench_root / "comparison.md")
206
+
207
+ print(f"\nDone. Comparison written to {bench_root}/comparison.{{json,csv,md}}")
208
+ print("\n" + (bench_root / "comparison.md").read_text())
209
+ return 0
210
+
211
+
212
+ if __name__ == "__main__":
213
+ raise SystemExit(main())