语料,逐文档
这里是整个回归语料,不是挑出来的好样本:引擎被测过的每一份文档、它转出来是什么样、以及现在还有哪里是错的。这套检查在每个 PR 上跑,所以这张表和「我们很在意正确性」这句话的区别,是后者只是一句话。
| 文档 | 22 份真实 PDF,共 612 页 |
| 断言 | 120 条里 120 条通过——每一条都是有人对着原 PDF 核过的事实 |
| 已知缺陷 | 17 个,分布在 10 份文档上,下面全部列出 |
| 语言 | 20 份英文、1 份中英双语、1 份中文 |
| 许可 | CC BY 4.0(16 份) · 美国联邦政府公有领域(5 份) · 中国官方文件(1 份) |
| 引擎 | @mindmax/pdf-markdown v0.1.0,正文版本 v1 |
| 文档 | 语言 | 页数 | 标题 | 表格 | 链接 | 断言 | 未修 |
|---|---|---|---|---|---|---|---|
Chain-of-Thought Prompting Elicits Reasoning in LLMsarxiv-2201.11903-cot | en | 24 | 32 | 12 | 77 | 8/8 | — |
Mamba: Linear-Time Sequence Modelingarxiv-2312.00752-mamba | en | 37 | 65 | 21 | 3 | 5/5 | 1 |
Mistral 7Barxiv-2310.06825-mistral | en | 9 | 13 | 4 | 2 | 5/5 | 1 |
LLaMA: Open and Efficient Foundation Language Modelsarxiv-2302.13971-llama | en | 27 | 44 | 18 | 30 | 9/9 | 1 |
Constitutional AI: Harmlessness from AI Feedbackarxiv-2212.08073-constitutional-ai | en | 34 | 47 | 5 | 0 | 4/4 | — |
Phi-3 Technical Reportarxiv-2404.14219-phi3 | en | 12 | 10 | 2 | 0 | 5/5 | — |
3D modelling of orbits in wide binary gravity testsarxiv-2610.40388-wide-binaries | en | 12 | 6 | 2 | 17 | 8/8 | 2 |
GæniceN: relaxing magnetization states self-consistentlyarxiv-2610.37889-magnetization | en | 7 | 11 | 5 | 0 | 5/5 | — |
Causal framework for autonomous mobile robotsarxiv-2611.04027-ieee-ral | en | 12 | 26 | 2 | 0 | 4/4 | — |
Annotator-free object detectionarxiv-2611.06195-detection | en | 12 | 27 | 5 | 0 | 5/5 | — |
Cutoff for simple random walk on preferential attachment graphsarxiv-2611.00717-random-walk | en | 49 | 13 | 22 | 0 | 4/4 | 1 |
Mapping AI economic complexityarxiv-2609.17200-ai-complexity | en | 8 | 17 | 2 | 4 | 5/5 | — |
Mismatch-tolerant high-gain OTAarxiv-2610.39699-ota | en | 6 | 8 | 1 | 0 | 8/8 | — |
Speech brain-computer interfaces (review)arxiv-2609.36736-speech-bci | en | 36 | 68 | 1 | 1 | 5/5 | — |
Luo's spectral large sieve inequalityarxiv-2608.29558-math-fonts | en | 17 | 81 | 42 | 0 | 4/4 | 3 |
中英双语稿:英文全文在前,中文原文在后arxiv-2609.27618-bilingual | zh+en | 76 | 103 | 9 | 2 | 6/6 | 2 |
NIST SP 800-63B, Digital Identity Guidelinesnist-sp800-63b | en | 80 | 44 | 19 | 69 | 4/4 | 2 |
The Constitution of the United Statesus-constitution | en | 85 | 45 | 72 | 0 | 6/6 | — |
Federal Register: Airworthiness Directives (Airbus)federal-register-2023-28802 | en | 4 | 14 | 0 | 21 | 6/6 | — |
USGS Fact Sheet 2018-3025usgs-fs-2018-3025 | en | 4 | 11 | 7 | 0 | 4/4 | 1 |
NACA Report 614 (scanned, OCR text layer)naca-19930091690-ocr-scan | en | 20 | 10 | 32 | 0 | 3/3 | — |
中华人民共和国国务院公报 2025 年第 35 号gov-cn-gazette-2025-35 | zh | 41 | 60 | 1 | 0 | 7/7 | 3 |
| 22 份合计 | 612 | 755 | 284 | 226 | 120/120 | 17 |
一行怎么读
页数、标题、表格、链接是「出来了什么」:PDF 有几页,Markdown 里各有多少个结构。它们不说明这些结构对不对——PDF 里本来没有表格、却被判成表格,在这里照样算一个。
断言是这份文档带了多少条检查、过了多少条。一条断言就是一个人打开 PDF 核对过的一个事实:这行是标题、这个页眉不该出现、表格至少有五个、这几页的公式必须被报成压平。它们是一份一份手写的,所以是 120 条,而不是一万条。
未修是已知缺陷数,也是让整张表值得读的那一列。每一条都是清单里的 todo:一条描述「正确输出长什么样」、当前预期失败的断言。文档名链到原始 PDF,任何一行都能自己核,不用信我们。
这张表不衡量什么
- 结构准确率。 这些数字背后没有一份人工标注的文档树,所以没有 F1 可报。数出多少标题和表格,不等于知道每一个都对;这里的正确性信号只有断言,而断言覆盖的是有人看过的地方,不是每一行。
- 你手上的 PDF。 语料是我们按踩到的坑挑的——双栏论文、中英混排稿、带标签的政府文件、带 OCR 文字层的扫描件。它不是全世界 PDF 的随机抽样,所以它没法告诉你「你的文件一定能转好」,它只说这 22 份上确切的发生了什么。
- 快照质量。
golden/<id>.md是引擎今天转出来的样子,不是它应该有的样子。快照抓的是「变了没有」,断言抓的才是「对不对」。 - OCR。 其中一份(NACA Report 614)是扫描件,文字层来自别人的 OCR。它在这里是为了验证引擎如实报告自己看到了什么、而不是凭空编结构,不是为了衡量 OCR 质量。
- 别的转换器。 这里没有跑任何竞品。做对比是另一张表,要钉住对方的版本、写清对方的参数。
已知缺陷
17 条失败检查,分布在 10 份文档上。公开列出来,是因为一个带缺陷清单的转换器比一个声称没有缺陷的更容易被信任:这些正是有人看了输出、发现不对、然后把「对的样子」写下来的地方。
每一条都预期失败,所以它们开着的时候 CI 仍然是绿的。一旦某次修复让它通过,运行器会点名说出来,这条断言就从 todo 移进 expect——既没法悄悄修掉,也没法被忘掉。
- Mamba: Linear-Time Sequence Modeling(1)
should not appear: "### 𝐴"
- Mistral 7B(1)
missing whole line: "| Parameter | Value |"
- LLaMA: Open and Efficient Foundation Language Models(1)
missing whole line: "| Dataset | Sampling prop. | Epochs | Disk size |"
- 3D modelling of orbits in wide binary gravity tests(2)
not a heading: "1. INTRODUCTION"should not appear: "[1. INTRODUCTION]("
- Cutoff for simple random walk on preferential attachment graphs(1)
tables 22 > 0
- Luo's spectral large sieve inequality(3)
should not appear: "#### ÿ"should not appear: "#### ˇ"should report garbled text, did not
- 中英双语稿:英文全文在前,中文原文在后(2)
should not appear: "尺寸 持续缩小"should not appear: "\n\n。瞬态平面热源法"
- NIST SP 800-63B, Digital Identity Guidelines(2)
not a heading: "5.1.1 Memorized Secrets"should not appear: "###### 5 Authenticator and Verifier Requirements"
- USGS Fact Sheet 2018-3025(1)
should not appear: "now more the Lower Elwha Klallam Tribe"
- 中华人民共和国国务院公报 2025 年第 35 号(3)
should not appear: "�"should not appear: "!!第一条"should report garbled text, did not
断言原文是英文,因为它们在仓库里就是这么写的。字面读也不难:should not appear: "### 𝐴" 是说一个游离的数学字形被升成了标题,tables 22 > 0 是说一页定理被读成了 22 张表,should report garbled text, did not 是说体检该报出来的字体问题没报。
自己跑一遍
PDF 不在仓库里——多数许可允许再分发转换后的文字,不允许再分发文件本身。运行器按 URL 下载,sha256 与清单不一致就拒收。
git clone https://github.com/woodpeng/mindmax-pdf-markdown
cd mindmax-pdf-markdown && pnpm install
pnpm eval --fetch # 只有第一次:下载 22 份 PDF(约 82 MB),校验 sha256
pnpm eval # 转换并比对;有回归则退出码 1
它最后会打印一行,可以拿去和这一页对:
ran 22 · 0 assertion failures · 0 differ from snapshot · 10 open todos
需要 Node 22(运行器驱动 pdf.js 6,用到 Promise.withResolvers;库本身 Node 18+ 就能跑)。
加上 --report eval/results.json 会把这一页的表写成 JSON——这一页就是渲染那个文件,上面没有任何一个数字是手打的。JSON 是公开发布的,所以这里的每个数都不用信我们:eval/results.json。
你自己的 PDF 转坏了,语料就是这样长大的:语料用例模板只要那份文档、或者你有权分享的一页,先写失败断言。