{"notes":[{"id":"text-spotting/olmocr","category":"text-spotting","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"olmOCR","subtitle":"給模型一份小抄","author":"Z. Yuan","paperDate":"2025-02-25","publishedOn":"2026-02-03","paperTitle":"olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models","paperUrl":"https://arxiv.org/abs/2502.18443","bibliography":{"title":"olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models","authors":["Jake Poznanski","Aman Rangapur","Jon Borchardt","Jason Dunkelberger","Regan Huff","Daniel Lin","Aman Rangapur","Christopher Wilhelm","Kyle Lo","Luca Soldaini"],"url":"https://arxiv.org/abs/2502.18443","pdfUrl":"https://arxiv.org/pdf/2502.18443v3","codeUrl":"https://github.com/allenai/olmocr","preprint":{"id":"2502.18443","submittedOn":"2025-02-25","url":"https://arxiv.org/abs/2502.18443"},"publication":null,"citation":"@misc{textspottingolmocr2025,\n  title = {{olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models}},\n  author = {Jake Poznanski and Aman Rangapur and Jon Borchardt and Jason Dunkelberger and Regan Huff and Daniel Lin and Aman Rangapur and Christopher Wilhelm and Kyle Lo and Luca Soldaini},\n  year = {2025},\n  eprint = {2502.18443},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2502.18443}\n}\n","citationPath":"/content/papers/citations/text-spotting/olmocr.48e77a79a2cb.bib"},"thumbnail":{"src":"/content/papers/assets/044c3df431d57e98d00da32fff3b3df21f0cad1cb9a2e9176487efa55b628c17.png","width":994,"height":622},"locale":"zh-hant","path":"/content/papers/zh-hant/text-spotting/olmocr.10bffd51a137.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"解決問題","text":"解決問題","depth":2},{"id":"document-anchoring把-pdf-裡的字一起交給模型","text":"Document anchoring：把 PDF 裡的字一起交給模型","depth":3},{"id":"用-gpt-4o-產生訓練資料","text":"用 GPT-4o 產生訓練資料","depth":3},{"id":"微調一個-7b-的專用模型","text":"微調一個 7B 的專用模型","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"olmocr-bench用單元測試打分數","text":"olmOCR-Bench：用單元測試打分數","depth":3},{"id":"拿來訓練語言模型","text":"拿來訓練語言模型","depth":3},{"id":"成本","text":"成本","depth":3},{"id":"社群的反應","text":"社群的反應","depth":3},{"id":"讀這篇時要知道的事","text":"讀這篇時要知道的事","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[]}],"text":"網路上有數以兆計的 PDF。論文、報告、說明書、政府文件，很多內容只存在 PDF 裡，網頁上找不到。對要訓練語言模型的團隊來說，這是一座還沒開採的礦。\n\n麻煩在於，PDF 天生就不是為了「讀出文字」設計的。\n\n它最早是用來描述「怎麼把文件印到紙上」。檔案裡存的不是標題、段落這些有意義的單位，而是一個個字形，加上它的字型、大小與座標。論文 Figure 2 舉了一個例子：標題「olmOCR」在 PDF 裡是六筆記錄，每筆一個字母，各帶一組變換矩陣。哪個字先讀、哪段接哪段，PDF 不負責。\n\n艾倫人工智慧研究所（Ai2）在 2025 年 2 月提出 olmOCR，目標是把大量 PDF 轉成乾淨、照閱讀順序排列的純文字。本文依 2025 年 7 月的 v3 閱讀，模型、訓練資料與程式都以寬鬆授權開源。\n\n## 定義問題\n\n當時的做法大致分兩派：\n\n- **分段式工具**，例如 MinerU、Marker，把版面分割、表格解析等多個模型串在一起；GROBID、PaperMage 這類則專門處理學術論文。\n- **端到端模型**，例如 Nougat、GOT，輸入頁面影像，直接輸出文字。\n\n作者指出，端到端模型只看影像，等於放棄了一件事：**很多 PDF 本來就是數位產生的，裡面已經有文字**。這些文字雖然亂，卻是正確的字。\n\n另一方面，直接拿 GPT-4o 這種通用 VLM 來讀，品質也不夠。作者觀察到，在文字密集或版面複雜的頁面上，GPT-4o 單靠影像容易漏掉內容、改寫或「補完」原文，沒被要求時還會替圖片加說明。附錄寫得更具體：只給頁面影像時，模型會把沒寫完的句子補完，影像含糊時甚至發明更長的文字。\n\n所以問題變成：能不能讓 VLM 在看影像的同時，也拿到 PDF 裡的文字當參考？\n\n## 解決問題\n\n### Document anchoring：把 PDF 裡的字一起交給模型\n\n[![document anchoring 示意：左側是一頁 PDF，右側是從中抽出的錨定文字，包含頁面尺寸、圖片位置，以及帶座標的文字區塊，例如「[71x459]Figure 1」、「[71x398]1 Introduction」](/content/papers/assets/044c3df431d57e98d00da32fff3b3df21f0cad1cb9a2e9176487efa55b628c17.png)](/content/papers/assets/044c3df431d57e98d00da32fff3b3df21f0cad1cb9a2e9176487efa55b628c17.png)\n\n*原論文 Figure 3，取自 [**v3 PDF 第 17 頁**](https://arxiv.org/pdf/2502.18443v3#page=17)，CC BY 4.0。左為 PDF 頁面，右為插入提示詞的錨定文字。*\n\n右邊那個框，就是作者說的 **document anchoring**。做法是：\n\n1. 用 pypdf 讀取 PDF 內部的結構，取出每個文字區塊和圖片，連同它們在頁面上的座標。\n2. 依優先順序挑選區塊放進提示詞，直到字數上限。文件開頭與結尾的區塊優先，因為標題、摘要、頁尾資訊多半在那裡。\n3. 把這段錨定文字和頁面影像一起交給 VLM，請它輸出這一頁的純文字。\n\n看圖上的格式：`[71x459]Figure 1` 表示座標 (71, 459) 處有一段文字「Figure 1」；`[Image 480x298 to 525x312]` 標出一張圖片的位置。\n\n作者很坦白地說，這份錨定文字**很吵**：沒有保留閱讀順序，正文和各種樣板文字、PDF 渲染產生的雜訊混在一起。但它提供了模型可以照抄的字，以及字在頁面上的大概位置。VLM 負責看懂版面、排出順序，PDF 文字負責把字釘住。\n\n如果頁面是掃描檔、沒有內嵌文字，錨定文字就只剩頁面尺寸與圖片位置，模型主要靠影像來讀。\n\n### 用 GPT-4o 產生訓練資料\n\n有了錨定方法，作者先拿它來製作訓練資料。\n\n他們在 2024 年 10 月比較了幾個候選的「老師」模型：Gemini 1.5 經常回報 RECITATION 錯誤，GPT-4o mini 幻覺太多，Claude Sonnet 3.5 太貴。最後選了 `gpt-4o-2024-08-06`。\n\n提示詞要求 GPT-4o 以結構化的 JSON 回答，先輸出頁面的語言、方向、是否有表格等中繼資料，再輸出照閱讀順序排列的文字。作者發現，這個結構很關鍵，能讓 GPT-4o 在頁面沒有文字時，不去替圖片編說明。\n\n這樣做出來的 **olmOCR-mix-0225** 共 258,641 頁、102,825 份文件：其中 96,929 份是從約 2.4 億份公開網頁 PDF 中抽樣，另有 5,896 份來自 Internet Archive 的公有領域書籍。依抽樣估計，學術文件約占 56%，其次是宣傳手冊與法律文件。\n\n### 微調一個 7B 的專用模型\n\n錨定提示詞拿來指揮 GPT-4o 效果不錯，但作者發現，它的效果會因模型而異，比較適合當作資料生成的技巧。他們接著問：一個較小的專用 VLM，能不能做到和 GPT-4o 一樣好？\n\n他們從 Qwen2-VL-7B-Instruct 開始，在 olmOCR-mix-0225 上微調約 1.2 個 epoch，用一台 8 張 H100 的機器訓練 16 小時。微調時，頁面縮放到最長邊 1,024 像素，錨定文字上限 6,000 個字元。一頁的典型輸入是：影像約 1,000 個 token，錨定文字約 1,800 個，合計約 3,000 個。\n\n## 討論\n\n### olmOCR-Bench：用單元測試打分數\n\n要比較 OCR 系統，作者不想用編輯距離這類「和參考答案有多像」的指標。他們舉的例子是數學式：$x$ 和 $x_i$ 的字串只差一點點，意思卻完全不同。\n\n所以他們做了 **olmOCR-Bench**：約 1,400 份 PDF、7,010 個通過或失敗的單元測試，每個測試都能用程式明確判定：\n\n- **文字存在**：某段一到三句的文字有沒有出現在輸出裡。\n- **文字不存在**：頁首、頁尾、頁碼這類周邊內容有沒有被排除。\n- **閱讀順序**：兩段文字的先後是否正確。例如同一頁有好幾篇新聞，可以只檢查每篇的標題在第一句之前，不管各篇彼此的順序。\n- **表格**：某個值的儲存格存在，而且它上方、左方的儲存格符合預期。\n- **數學式**：把參考的 LaTeX 用 KaTeX 渲染出來，記下每個符號的相對位置，再看輸出裡有沒有一組符號排得一樣。\n- **基本檢查**：每頁都有，確認有輸出文字、結尾沒有超過 30 個重複的 n-gram，也沒有中日文或 emoji 字元。\n\n基本檢查那一項，等於把「陷入重複」與「冒出不該有的文字」直接寫成必考題。\n\n\n> [!NOTE]\n> \n> 論文對這個基準的規模有三種寫法：摘要寫 1,400 份 PDF，§3 寫 1,402 份，結論寫 1,403 份。測試數都是 7,010。\n\n\n[![olmOCR-Bench 結果表：GOT OCR、Marker、MinerU、Mistral OCR API、GPT-4o、Gemini Flash 2、Qwen 2 VL、Qwen 2.5 VL 與 olmOCR 在 ArXiv、舊掃描數學、表格、舊掃描、頁首頁尾、多欄、長篇小字與基本檢查八個來源的通過率與整體分數](/content/papers/assets/970cd043bba14de362481d37c8428e947780e9ec1c949f7846a8be7c4f58fbbf.png)](/content/papers/assets/970cd043bba14de362481d37c8428e947780e9ec1c949f7846a8be7c4f58fbbf.png)\n\n*原論文 Table 4，取自 [**v3 PDF 第 8 頁**](https://arxiv.org/pdf/2502.18443v3#page=8)，CC BY 4.0。欄位依序為 ArXiv、舊掃描數學、表格、舊掃描、頁首頁尾、多欄、長篇小字、基本檢查；整體分數是各來源的平均，附 95% 信賴區間。*\n\n整體分數最高的是錨定版的 olmOCR，75.5；商用的 Mistral OCR API 是 72.0，Marker 是 70.1，MinerU 是 61.5，GOT 只有 48.3。作者特別說明，olmOCR-Bench 是在訓練完模型**之後**才做的，避免反覆對著基準調模型。\n\n表上有一組對照值得細看：**錨定對不同模型的幫助差很多**。\n\n| 模型 | 不錨定 | 錨定 | 差距 |\n| --- | ---: | ---: | ---: |\n| GPT-4o | 68.9 | 69.9 | +1.0 |\n| Gemini Flash 2 | 57.8 | 63.8 | +6.0 |\n| olmOCR | 74.7 | 75.5 | +0.8 |\n\n對 olmOCR 自己來說，錨定只多了 0.8 分，落在信賴區間附近。它真正的進步，主要來自用錨定做出來的訓練資料：同樣的 Qwen2-VL 底模，不微調只有 31.5 分。\n\n另外，olmOCR 在「舊掃描」這一欄只有 42.2，表格也是 71.0 左右。掃描檔沒有內嵌文字可錨定，仍然是難點。\n\n### 拿來訓練語言模型\n\n作者也測了這些文字對語言模型有沒有用。他們取 OLMo-2-7B 的一個中間檢查點，各用 500 億 token 繼續預訓練：一組是原本用 GROBID 加規則抽出的 peS2o 學術論文，另一組是同一批 PDF 改用 olmOCR 重新處理的版本。\n\n在 MMLU、ARC、DROP、HellaSwag 等六項任務上，平均從 53.9 升到 55.2，進步 1.3 個百分點。\n\n### 成本\n\n| 系統 | 每百萬頁成本（美元） |\n| --- | ---: |\n| GPT-4o（批次） | 6,240 |\n| Marker（H100） | 1,484 |\n| Mistral OCR API | 1,000 |\n| MinerU（L40S） | 596 |\n| Gemini Flash 2（批次） | 249 |\n| olmOCR（L40S） | 176 |\n\n*表：節錄自原論文 Table 6。L40S 以每小時 0.79 美元、H100 以每小時 2.69 美元估算，olmOCR 計入 12% 的重試率。*\n\n摘要裡「一百萬頁只要 176 美元」，指的是自己用 L40S 跑推論的估算。\n\n### 社群的反應\n\nolmOCR 在 2025 年 2 月 28 日登上 Hacker News，討論串裡有人直接點出生成式 OCR 的老問題：幻覺與結果不穩定。開發 Marker 的使用者 vikp 回覆，他們在自己的測試集上看到 olmOCR 有不少漏字與幻覺，也質疑論文拿 Marker 的 API 價格和 olmOCR 的自架推論成本相比，條件不對等。[Hacker News，2025-02-28](https://news.ycombinator.com/item?id=43174298)\n\nvikp 是競品的開發者，立場要一併考慮；不過他點出的成本比較條件，確實可以在 Table 6 上看到：Marker 列的是 H100 上的強制 OCR 模式，olmOCR 列的是 L40S。\n\n### 讀這篇時要知道的事\n\n1. **訓練資料來自 GPT-4o**。olmOCR 學的是 GPT-4o 在錨定提示下的輸出，老師的錯也可能一起學到。作者在附錄另外量了學生和老師的一致程度。\n2. **基準是自己做的**。olmOCR-Bench 的設計很有參考價值，但最早的比較結果來自作者自己。\n3. **錨定依賴 PDF 品質**。數位原生的 PDF 效果最好；純掃描檔沒有內嵌文字可用。\n\n## 結論\n\nolmOCR 的核心是一個很樸素的想法：**PDF 裡已經有字了，就給模型看**。\n\n1. **Document anchoring** 把 PDF 內嵌的文字與座標放進提示詞，讓 VLM 有可以照抄的字。\n2. **用錨定做資料、再微調小模型**：26 萬頁 GPT-4o 標註，加上 7B 的 Qwen2-VL，整體分數超過 GPT-4o 本身。\n3. **olmOCR-Bench 用單元測試取代相似度**，把重複、漏字、閱讀順序都寫成可以自動判定的題目。\n\n生成式 OCR 最大的風險，是它在看不清楚時會自己補字。olmOCR 的回答之一是：先找找看，有沒有不必猜的字可以用。\n","imageSizes":{"/content/papers/assets/044c3df431d57e98d00da32fff3b3df21f0cad1cb9a2e9176487efa55b628c17.png":{"width":994,"height":622},"/content/papers/assets/970cd043bba14de362481d37c8428e947780e9ec1c949f7846a8be7c4f58fbbf.png":{"width":1394,"height":527}}}
