उच्च सटीकता के साथ तेज़ी से PDF को Markdown में बदलने की तकनीक
(github.com/VikParuchuri)- Marker PDF के साथ-साथ इमेज, PPTX, DOCX, XLSX, HTML, EPUB दस्तावेज़ों को Markdown, JSON, chunks, HTML में तेज़ और सटीक रूप से बदलने वाला document intelligence टूल है
- यह टेबल, फ़ॉर्म, समीकरण, inline math, लिंक, रेफ़रेंस, code block को फ़ॉर्मैट करता है, इमेज extract·save और header/footer जैसे artifacts हटाने को सपोर्ट करता है
- सटीकता बढ़ाने के लिए
--use_llmके साथ LLM का उपयोग किया जा सकता है, डिफ़ॉल्टgemini-2.0-flashहै, और Gemini, Ollama, Claude, OpenAI, Azure OpenAI आदि चुने जा सकते हैं - benchmark में Marker ने single PDF page के आधार पर औसतन 2.83837 सेकंड, heuristic score 95.6709, LLM score 4.23916 दर्ज किया, और H100 batch mode में 25 pages/second throughput की उम्मीद है
- Python 3.10+ और PyTorch की ज़रूरत है, और code GPL के तहत है, जबकि model weights modified AI Pubs OpenRAIL-M लाइसेंस के तहत research, personal use, और $2M से कम startup के लिए मुफ़्त शर्तों के साथ उपलब्ध हैं
Marker किन दस्तावेज़ों को बदलता है और उसका आउटपुट
- Marker दस्तावेज़ों को Markdown, JSON, chunks, HTML में बदलता है
- input format में PDF, इमेज, PPTX, DOCX, XLSX, HTML, EPUB शामिल हैं और यह सभी भाषाओं के दस्तावेज़ों को प्रोसेस करता है
- document element processing का दायरा:
- टेबल, फ़ॉर्म, समीकरण, inline math
- लिंक, रेफ़रेंस, code block
- इमेज extract और save
- header, footer, और अन्य artifacts हटाना
- इसे अपनी formatting और logic के साथ extend किया जा सकता है
- JSON schema देने पर structured extraction किया जा सकता है, और यह फ़ीचर beta है
- यह GPU, CPU, MPS पर चलता है
Datalab managed platform
- Datalab managed platform नवीनतम open source मॉडल Chandra चलाता है
- Chandra को Marker से अधिक सटीक बताया गया है, और डिफ़ॉल्ट रूप से data retention नहीं है, साथ ही SOC 2 Type 2 और custom BAA उपलब्ध हैं
- high-volume workload के लिए batch processing service ने प्रति सप्ताह 200M+ pages प्रोसेस किए हैं
- signup पर $5 free credit मिलता है, और public playground भी उपलब्ध है
- commercial self-hosting के लिए लाइसेंस चाहिए, और on-premises लाइसेंस के लिए अलग से संपर्क करना होता है
प्रदर्शन और LLM hybrid mode
- Marker, Llamaparse, Mathpix जैसी cloud services और अन्य open source टूल्स की तुलना में अनुकूल benchmark परिणाम दिखाता है
- README में पूरा performance result single PDF page को serial execution में चलाने के आधार पर है
- batch mode में यह और तेज़ है, और H100 पर 25 pages/second throughput की उम्मीद है
- सर्वोच्च सटीकता के लिए
--use_llmफ़्लैग के साथ LLM का उपयोग किया जा सकता है- कई pages में फैली टेबल merge करना
- inline math को प्रोसेस करना
- टेबल formatting में सुधार
- फ़ॉर्म से value extract करना
- LLM hybrid mode में table benchmark accuracy, केवल Marker या केवल Gemini Flash से अधिक है
इंस्टॉलेशन और बुनियादी उपयोग
- Python 3.10+ और PyTorch की ज़रूरत है
- PDF-केंद्रित इंस्टॉलेशन:
pip install marker-pdf - PDF के अलावा अन्य document format प्रोसेस करने के लिए अतिरिक्त dependency इंस्टॉल करें
pip install marker-pdf[full] - single file conversion:
marker_single /path/to/file.pdf - folder स्तर पर multiple file conversion:
marker /path/to/input/folder - कई GPU पर conversion:
NUM_DEVICES=4 NUM_WORKERS=15 marker_chunk_convert ../pdf_in ../md_outNUM_DEVICESउपयोग किए जाने वाले GPU की संख्या है, और यह 2 या उससे अधिक होनी चाहिएNUM_WORKERSप्रति GPU parallel process की संख्या है
प्रमुख CLI options
--page_range TEXT: प्रोसेस किए जाने वाले page number और range तय करता है--output_format [markdown|json|html|chunks]: output format तय करता है--output_dir PATH: output file save directory तय करता है--paginate_output: page number और separator जोड़कर output देता है--use_llm: LLM के साथ सटीकता बढ़ाता है--force_ocr: पूरे document पर OCR को force करता है, और inline math को भी सही फ़ॉर्मैट करता है--block_correction_prompt: LLM mode में Marker output correction के लिए prompt तय करता है--strip_existing_ocr: मौजूदा OCR text हटाकर surya से दोबारा OCR करता है--redo_inline_math:--use_llmके साथ inline math conversion quality बढ़ाता है--disable_image_extraction: PDF से इमेज extract नहीं करता--converter_cls: डिफ़ॉल्टmarker.converters.pdf.PdfConverterया केवल table के लिएmarker.converters.table.TableConverterचुनता है--llm_service:--use_llmके साथ LLM service तय करता है, डिफ़ॉल्टmarker.services.gemini.GoogleGeminiServiceहै--workers: concurrent conversion worker की संख्या तय करता है- प्रति worker अधिकतम 5GB VRAM, औसतन 3.5GB VRAM उपयोग होता है
Python API और internal block manipulation
PdfConverterके साथ Python से सीधे conversion किया जा सकता हैfrom marker.converters.pdf import PdfConverter from marker.models import create_model_dict from marker.output import text_from_rendered converter = PdfConverter( artifact_dict=create_model_dict(), ) rendered = converter("FILEPATH") text, _, images = text_from_rendered(rendered)- Markdown output का
rendered,markdown,metadata,imagesproperties रखता है - JSON output का
rendered,children,block_type,metadataरखता है ConfigParserसे output format, processor, renderer, LLM service आदि configure किए जा सकते हैं- document page और block की tree से बना होता है, और page के भीतर फिर block हो सकते हैं
contained_blocksका उपयोग करके फ़ॉर्म जैसे specific block को programmatically extract किया जा सकता है
converter के प्रकार
PdfConverter: पूरे PDF को बदलने वाला डिफ़ॉल्ट converter हैTableConverter: केवल टेबल extract और convert करता हैforce_layout_block=Tableदेने पर layout detection से बचते हुए सभी pages को table माना जाता हैoutput_format=jsonउपयोग करने पर cell bounding box भी मिल सकते हैं
OCRConverter: केवल OCR चलाता है--keep_charsसेट करने पर individual character और bounding box बनाए रखता है
ExtractionConverter: beta स्थिति वाला structured extraction converter है- पहले LLM service configuration चाहिए
- यह JSON output में extracted values लौटाता है
- पिछले run के
original_markdownकोexisting_markdownके रूप में देने पर document re-parsing को छोड़ा जा सकता है
output formats
- Markdown output:
- इमेज लिंक
- formatted table
$$में लिपटे LaTeX समीकरण- triple backticks code block
- footnote के लिए superscript
- HTML output:
imgtag इमेज<math>tag समीकरणpretag code
- JSON output:
- pages को list के रूप में दिखाता है, और हर page internal Marker schema का block होता है
- इसमें
id,block_type,html,polygon,childrenkeys होती हैं - child block में अतिरिक्त
section_hierarchy,imagesहोती हैं - block structure tree के रूप में होता है
- Chunks output:
- JSON जैसा है, लेकिन सब कुछ एक single list में flatten कर देता है
- हर block का पूरा HTML शामिल होता है, इसलिए RAG के लिए chunking में लचीले ढंग से उपयोग हो सकता है
- सभी output format
metadataलौटाते हैं- गणना की गई PDF table of contents यानी
table_of_contents - page-वार text extraction method और block count वाला
page_stats
- गणना की गई PDF table of contents यानी
समर्थित LLM services
--use_llmके साथ चुनी जा सकने वाली services:- Gemini: डिफ़ॉल्ट रूप से Gemini developer API उपयोग करता है और
--gemini_api_keyचाहिए - Google Vertex:
--vertex_project_idचाहिए औरmarker.services.vertex.GoogleVertexServiceनिर्दिष्ट करना होता है - Ollama: local model उपयोग करता है, और
--ollama_base_url,--ollama_modelसेट करना होता है - Claude:
--claude_api_key,--claude_model_nameसेट करना होता है - OpenAI: OpenAI-compatible endpoint सपोर्ट करता है, और
--openai_api_key,--openai_model,--openai_base_urlसेट करना होता है - Azure OpenAI:
--azure_endpoint,--azure_api_key,--deployment_nameसेट करना होता है
- Gemini: डिफ़ॉल्ट रूप से Gemini developer API उपयोग करता है और
internal architecture और extension points
- Marker deep learning model pipeline के रूप में काम करता है
- text extraction, और ज़रूरत पड़ने पर OCR
- page layout detection और reading order detection
- हर block की सफ़ाई और formatting
- ज़रूरत पड़ने पर LLM से quality सुधार
- block combine करना और पूरे text की post-processing
- OCR और layout से जुड़े चरणों में surya का उपयोग होता है
- equation-related formatting के लिए texify उपयोग होता है
- मुख्य components:
Providers: PDF जैसे source file से जानकारी देते हैंBuilders: शुरुआती document block बनाते हैं और text भरते हैंProcessors: table formatter की तरह specific block को प्रोसेस करते हैंRenderers: block को output format में render करते हैंSchema: सभी block type की classesConverters: पूरा end-to-end pipeline चलाते हैं
- processing behavior बदलने के लिए
processorsको override करें - नया output format जोड़ने के लिए नया
rendererलिखें - नया input format जोड़ने के लिए नया
providerलिखें
API server और deployment
- एक सरल FastAPI server चलाया जा सकता है
pip install -U uvicorn fastapi python-multipart marker_server --port 8001 - server
localhost:8001पर उपलब्ध होगा, औरlocalhost:8001/docsपर endpoint options देखे जा सकते हैं - यह API server कोई मजबूत API नहीं है और केवल छोटे पैमाने के उपयोग के लिए बनाया गया है
- यदि अधिक robust conversion options चाहिए, तो hosted Datalab API का उपयोग किया जा सकता है
- deployment examples में Modal के माध्यम से web endpoint deployment शामिल है
समस्या निवारण
- accuracy समस्या हो तो
--use_llmके साथ LLM उपयोग करें- इस स्थिति में Gemini API key को
GOOGLE_API_KEYके रूप में सेट करना होगा
- इस स्थिति में Gemini API key को
- अगर text टूटा हुआ दिखे, तो
force_ocrसे document पर दोबारा OCR चलाएँ TORCH_DEVICEसे उपयोग होने वाला torch device force किया जा सकता है- memory error आने पर workers की संख्या कम करें या लंबे PDF को कई files में बाँटें
debugoption detected layout और text वाली page image, तथा bounding box जानकारी वाली JSON file save करता है
benchmark परिणाम
- full PDF conversion benchmark के लिए common crawl से निकाले गए single PDF pages से बने benchmark set का उपयोग किया गया
- score, ground truth text segment के साथ alignment heuristic और LLM-as-judge तरीके से निकाले गए
- full PDF conversion results:
- marker: औसत समय 2.83837, heuristic 95.6709, LLM 4.23916
- llamaparse: औसत समय 23.348, heuristic 84.2442, LLM 3.97619
- mathpix: औसत समय 6.36223, heuristic 86.4281, LLM 4.15626
- docling: औसत समय 3.69949, heuristic 86.7073, LLM 3.70429
- marker और docling H100 पर चलाए गए, जबकि llamaparse और mathpix cloud services का उपयोग करते हैं
- लंबे PDF throughput benchmark के लिए Think Python का उपयोग किया गया
- marker: प्रति page 0.18 सेकंड
- प्रति document 43.42 सेकंड
- VRAM 3.17GB
- H100 पर 22 individual process चलाए जा सकते हैं, इसलिए 122 pages/second throughput की उम्मीद है
- table conversion benchmark में FinTabNet test split की HTML representation की तुलना की गई
- marker: औसत score 0.816, कुल 99 tables
- marker w/use_llm: औसत score 0.907, कुल 99 tables
- gemini: औसत score 0.829, कुल 99 tables
- FinTabNet और layout model की detection method के अंतर के कारण ground truth से align न हो सकने वाली tables को filter किया गया
सीमाएँ और लाइसेंस
- PDF एक जटिल format है, इसलिए Marker हमेशा पूरी तरह सही काम नहीं कर सकता
- ज्ञात सीमाएँ:
- nested table और form वाले बहुत जटिल layout काम नहीं कर सकते
- form rendering अच्छी तरह न हो सकती है
--use_llmऔर--force_ocrफ़्लैग देने पर इन समस्याओं का अधिकांश हिस्सा हल हो सकता है- model weights modified AI Pubs OpenRAIL-M लाइसेंस के तहत हैं
- research, personal use, और funding/revenue $2M से कम वाले startup के लिए मुफ़्त हैं
- code GPL लाइसेंस के तहत है
- व्यापक commercial लाइसेंस या GPL आवश्यकताओं को हटाने के लिए pricing page देखें
1 टिप्पणियां
Hacker News की राय
पूरे repo में Nougat से तुलना करने का तरीका थोड़ा उलझाने वाला है
Nougat अकादमिक दस्तावेज़ों के लिए खास तौर पर trained मॉडल है, और मुझे नहीं लगता कि कभी यह दावा किया गया कि Nougat सबसे अच्छा OCR मॉडल है। benchmark में भी लिखा है कि arXiv दस्तावेज़ों पर Nougat की accuracy ज़्यादा है। साथ ही marker यह कहता है कि वह Nougat की तुलना में formulas कम convert करता है, फिर भी speed comparison Nougat से करता है—यह बात भी थोड़ी खटकती है, क्योंकि Nougat अकादमिक दस्तावेज़ों वाला मॉडल है
अगर गणित वाले PDF का OCR करना हो तो Nougat ज़रूर आज़माने लायक है। Python package के रूप में इसे install करना आसान है, और एक ही command से formulas, text, tables आदि को
.mmdfile में extract कर देता है। निजी उपयोग के लिए speed भी ठीक है; मेरे 4 साल पुराने i5 laptop पर सिर्फ CPU से 6-page document convert करने में करीब 30 सेकंड लगेयह तो नए tool को किसी परिचित चीज़ के साथ side-by-side देखने का तरीका भर है। जैसा आपने कहा, Nougat install और run करना आसान है, इसलिए उसे comparison target बनाना स्वाभाविक है। comparison में और ज़्यादा libraries शामिल हों तो बेशक और अच्छा व उपयोगी होगा
मैं ऐसा OCR model ढूंढ रहा हूं जो RPG books के कुछ हिस्सों को Markdown में बदलने में मदद करे। संभव हो तो bold या italics जैसी emphasis भी वैसी ही बनी रहे तो अच्छा होगा
text, numbers और mathematical symbols का मेल technical/academic documents जैसा दिखता है, लेकिन अजीब formatting, margins में text boxes, और बहुत सारे diagrams अक्सर मिले-जुले रहते हैं
नीचे simple text extraction से भी तुलना की है। Nougat एक शानदार model है और कई PDFs को अच्छी तरह convert करता है, लेकिन मुझे कुछ तेज़ और ज़्यादा generalizable चाहिए था
ऐसे tools के impact को कम करके नहीं आंकना चाहिए। क्योंकि यह “पढ़ने के लिए अच्छा, लेकिन distribution के लिए खराब” format में फंसे भारी-भरकम ज्ञान को आज़ाद करने का काम है
सच में उत्साहित हूं। अगर pipeline बने तो अच्छा होगा: सभी PDFs → सबको Markdown में convert → सबको archive.org पर preserve
इससे bugs fix होने और improvements आने पर conversion फिर से चलाया जा सकता है। आम तौर पर archival preservation में source material के जितना करीब हो सके, उसी रूप में store करना पसंद किया जाता है। उसके बाद के सारे conversions केवल data loss पैदा कर सकते हैं
end user जो document देखता है, उसे generate करने में इस्तेमाल raw data को आप अपनी पसंद के format में अदृश्य रूप से embed कर सकते हैं। उदाहरण के लिए, अगर PrinceXML से HTML render करके PDF बनाया जा रहा हो, तो text, graphs, charts आदि बनाने में इस्तेमाल किया गया original JSON PDF के अंदर रखा जा सकता है। बेशक ज़्यादातर लोग असल में ऐसा नहीं करते, लेकिन यह specification की गलती नहीं है
https://github.com/VikParuchuri/libgen_to_txt भी देखने लायक है। अभी इसे marker के साथ integrate नहीं किया है, और फिलहाल simple text extraction इस्तेमाल करता है
needs या use cases के सिर्फ कुछ हिस्से भी cover हों, तो भी अगर यह ठीक से काम करे तो बेहद उपयोगी होगा
PDF accessibility को सही ढंग से लागू करना बहुत बड़ा काम है, और अगर कर भी दिया जाए, तो संभावना है कि user का PDF viewer ज़रूरी standards support न करे
weekend पर खुद इसे आज़माना पड़ेगा
मैं अक्सर अज्ञात sources से आए RPG PDF scans को हाथ से transcribe करता हूं, जिनमें OCR नहीं हुआ होता ताकि selectable text न हो, या हुआ भी हो तो quality खराब होती है
copy-paste errors ठीक करने या OCR से text बनाने के बाद errors ठीक करने की बजाय कई बार सीधे खुद type करना सचमुच ज़्यादा तेज़ होता है
official PDF में भी formatting अक्सर बिगड़ जाती है, और शब्दों के बीच double/triple spaces या tabs आ जाते हैं। अगर यह ठीक से काम करे, तो वाकई बहुत समय बचा सकता है
tables और text boxes काफ़ी बिगड़ गए। tables के screenshots लेकर ChatGPT में paste करके Markdown table conversion करवाने पर काफी अच्छे results मिले। थोड़ा prompt दे दें, जैसे “row-wise पढ़ो। column headers X, Y, Z हैं। X text है, Y number है, Z word है”, तो irregular tables भी handle हो गए
आजकल Tesseract OCR कितना ठीक है? पहले इस्तेमाल किया था तो AWS, Azure, GCP के online OCR से काफी पीछे था
https://github.com/tesseract-ocr/tesseract/releases
आखिरकार यह use case पर निर्भर करेगा। ऐसे personal tasks के लिए शायद काफी हो, और user info या credit card जैसी चीज़ों की भी ज़रूरत नहीं
हालांकि यह resolution को लेकर बहुत sensitive है। image का size एक सीमा से नीचे जाते ही, इंसान को भले वह पढ़ने लायक लगे, Tesseract output बिल्कुल खराब हो गया
iOS Vision API भी try किया, लेकिन वह भी fail हुआ। test case एक किताब के page की साफ़ photo थी
लेखक से सवाल: Markdown क्यों? इस टूल का मुश्किल हिस्सा PDF को उच्च सटीकता से parse करना है, उसके बाद उसे किस format में export किया जाता है, यह नहीं लगता
इसलिए अच्छा होगा अगर user output format चुन सके। अगर उच्च-सटीकता वाला PDF parser हो, तो मैं उसे EPUB बनाने के लिए इस्तेमाल करना चाहूंगा
मैं एक university press में ebooks manage करता हूं, और conversion का इंतजार कर रही पुरानी सूची काफी बड़ी है; उनमें से कई में पुराने print editions के सिर्फ page scans बचे हैं। EPUB के रूप में उपलब्ध कराने के लिए यह जानना जरूरी है कि chapter breaks, titles, tables, charts, equations, quotations आदि कहां हैं। बाहरी vendor यह कर सकते हैं, लेकिन कुछ किताबों में conversion cost बिक्री से होने वाली कमाई से ज्यादा होती है। अगर इसका कुछ हिस्सा खुद कर सकें तो अच्छा होगा
हालांकि यहां लगता है कि Markdown को intermediate format की तरह इस्तेमाल किया जा रहा है। यह plain text के करीब है, लेकिन साधारण layout information सुरक्षित रख सकता है। व्यवहार में शायद Markdown output लेकर उसे desired final output format में convert करने वाले tool से जोड़कर इस्तेमाल करूंगा
equations को
$/$$में wrap किया जा सकता है। EPUB output को अभी नहीं देखा है, लेकिन ऐसी requirements की वजह से plain text को बाहर रखा गयाएक खास use case है जिसका अभी तक अच्छा solution नहीं मिला: construction documents पढ़ना
drawings हमेशा PDF में आती हैं, लेकिन DXF(AutoCAD) files parse करते समय यह कहीं बेहतर काम करता था। लेकिन भले ही मैं site का general contractor हूं, architect से DXF भेजने को कहना और उसे पाना हमेशा आसान नहीं होता
लंबे लेख मैं मुख्यतः ebook reader पर पढ़ता हूं
PDF, खासकर multi-column layout, Amazon Kindle या Pocketbook की default capabilities के लिए लगभग nightmare है। लगता है यह tool reading experience को काफी बेहतर कर देगा
अच्छा काम है
Nougat output में दिखने वाले hallucinations कहां से आते हैं, यह सोच रहा था। Think Python example के Nougat output पर नजर डालें तो समझ में आ जाएगा कि मेरा मतलब क्या है
दोबारा देखा तो लिखा है कि यह LLM से होकर गुजरता है, इसलिए hallucinations अपेक्षित ही थे
वह स्तर लगभग 0 के करीब है, और use case के हिसाब से सचमुच 0 होना भी जरूरी हो सकता है। अगर accurate document content महत्वपूर्ण नहीं है तो आम तौर पर ठीक होगा, लेकिन ऐसे documents बड़ी मात्रा में होना आम नहीं लगता जो न अभी किसी के लिए महत्वपूर्ण हों न भविष्य में, फिर भी PDF से ज्यादा accessible होने चाहिए
OneNote से मेरे notes migrate करने में मददगार tool जैसा लगता है
https://help.obsidian.md/import/onenote
काफी दिलचस्प। repo में conversion से पहले/बाद के examples कुछ जोड़ दिए जाएं तो अच्छा होगा
जानना चाहूंगा कि किस तरह के PDFs के लिए इसे tune किया जा रहा है। handwritten annotations को कैसे handle करता है?