PDF zu Markdown für RAG
Wandle PDFs in sauberes, chunking-freundliches Markdown für Retrieval und LLM-Ingestion um: Tabellen und Formeln intakt, Scans per OCR, viel weniger Tokens als der Rohtext der PDF. Steuere es über die REST API oder das gehostete MCP.
Markdown ist die saubere Eingabe, die RAG will
Rohen PDF-Text einzubetten gibt dem Retriever verrauschte Chunks: Überschriften, Listen und Tabellen kollabieren, die Lesereihenfolge bricht und binärer/Layout-Müll dringt ein. Konvertiere die PDF zuerst zu Markdown und die Dokumentstruktur überlebt, also kannst du nach Überschriften und Abschnitten chunken, Tabellen und Formeln als Fakten erhalten und viel weniger Tokens pro Passage verbrauchen. Sauberere Chunks rein, besseres Retrieval raus.
Was sauberes Markdown deiner Pipeline bringt
Saubere Chunk-Grenzen
Überschriften und Abschnitte überleben, also erzeugt das Teilen nach Struktur kohärente, eigenständige Chunks statt Schnitte mitten im Satz.
Weniger Tokens
Reines Markdown ist viel günstiger einzubetten und als Kontext zu senden als rohe PDF-Dumps oder HTML, also indexierst und rufst du mehr für weniger ab.
Tabellen bleiben Fakten
Spalten werden zu echten Markdown-Tabellen, nicht zu wirren Zeilen, also bleiben tabellarische Zahlen abrufbar statt durcheinandergewürfelt.
Formeln erhalten
Mathematische Notation bleibt erhalten statt zu unleserlichen Zeichen abgeflacht zu werden, die die Embeddings verschmutzen.
Scans werden Text
OCR verwandelt reine Bild-PDFs und gescannte PDFs in auswählbares Markdown in vielen Sprachen, also sind Scans ebenfalls indexierbar.
Links & Fußnoten
Hyperlinks und Fußnoten werden als Markdown-Links übernommen statt verworfen, sodass Referenzen intakt bleiben.
Eine PDF in vier Schritten ingestieren
Ein vorhersehbarer Lebenszyklus über HTTPS mit einem Bearer-API-Schlüssel. Das gehostete MCP stellt dieselben Schritte als Agent-Tools bereit.
Job anlegen
Schick die PDF-URL (oder die hochgeladenen Bytes) per POST an /api/v2/jobs. Du bekommst eine Job-ID und einen Status.
Bis ready abfragen
Mach GET /api/v2/jobs/{id}, bis status ready oder error ist. Bei error lies error_code/error_message. In bezahlten Tarifen registriere einen Webhook statt zu pollen.
Markdown abholen
Mach GET /api/v2/jobs/{id}/download. Beachte truncated und pages: truncated bedeutet, dass ein langes Dokument bis zum Zeitbudget teilweise zurückgegeben wurde.
Chunken & einbetten
Teile nach Überschriften/Abschnitten, betten die Chunks ein und indexiere sie in deinem Vector Store. Die Markdown-Struktur hält die Grenzen sauber.
# 1. Job aus einer PDF-URL anlegen curl -s -X POST https://pdf2md.dev/api/v2/jobs \ -H "Authorization: Bearer p2m_your_key" \ -H "Content-Type: application/json" \ -d '{"url":"https://example.com/paper.pdf"}' # -> { "job_id": "...", "status": "queued" } # 2. Status abfragen, bis ready oder error curl -s https://pdf2md.dev/api/v2/jobs/JOB_ID \ -H "Authorization: Bearer p2m_your_key" # -> { "status": "ready", "pages": 24, "truncated": false } # bei Fehler: { "status": "error", "error_code": "...", "error_message": "..." } # 3. Markdown abholen, dann chunken + einbetten curl -s https://pdf2md.dev/api/v2/jobs/JOB_ID/download \ -H "Authorization: Bearer p2m_your_key"
Lieber Agent-Tools? Das gehostete MCP stellt denselben Lebenszyklus bereit (pdf_to_markdown_create_job_from_url, _get_job, _get_markdown), damit Claude, ChatGPT und Agent-Frameworks PDFs ohne lokalen Server ingestieren können.
Chunking-Strategien für Markdown
Sauberes Markdown gibt dir natürliche Nahtstellen zum Teilen, also bleiben die Chunks kohärent und abrufbar.
Nach Überschriften teilen
Nutze die Überschriften-Hierarchie als Chunk-Grenzen, damit jeder Chunk ein eigenständiger Abschnitt mit eigenem Kontext ist.
Tabellen ganz halten
Teile nie innerhalb einer Markdown-Tabelle; eine halbe Tabelle verliert ihren Sinn. Halte jede Tabelle, samt Überschrift, in einem Chunk.
Etwas Überlapp hinzufügen
Ein kleiner Überlapp von ein oder zwei Sätzen zwischen benachbarten Chunks bewahrt den Kontext an den Grenzen und verbessert den Recall.
Überschriftenpfad mitführen
Stelle die Abschnittsüberschrift (oder den Pfad der Überschriften) jedem Chunk voran, damit das Embedding erfasst, woher er stammt.
Chunks richtig dimensionieren
Ziele auf ein paar hundert Tokens pro Chunk: zu groß verwässert die Relevanz, zu klein verliert Kontext. Die Markdown-Struktur macht das leicht justierbar.
Boilerplate entfernen
Entferne wiederholte Kopf- und Fußzeilen, damit sie die Embeddings nicht dominieren; der Konverter entfernt bereits den meisten Layout-Lärm.
Eine minimale Ingestion in Python
Anlegen, abfragen, abholen und dann nach Überschriften teilen, bereit zum Einbetten und Indexieren in deinem Vector Store.
# pip install requests import requests, time, re API = "https://pdf2md.dev/api/v2" H = {"Authorization": "Bearer p2m_your_key"} job = requests.post(f"{API}/jobs", headers=H, json={"url": "https://example.com/paper.pdf"}).json() jid = job["job_id"] while True: j = requests.get(f"{API}/jobs/{jid}", headers=H).json() if j["status"] in ("ready", "error"): break time.sleep(3) md = requests.get(f"{API}/jobs/{jid}/download", headers=H).text # einfaches Teilen nach Top-Level-Überschriften -> Chunks bereit zum Einbetten chunks = re.split(r"\n(?=# )", md)
Warum Tabellen besser abgerufen werden
Eine verwürfelte Tabelle bettet sich als Rauschen ein, also passt die Zahl, die du brauchst, selten zu einer Anfrage. Als echte Markdown-Tabelle bleiben Zeilen und Überschriften ausgerichtet, also bleiben tabellarische Fakten wie Preise, Metriken und Daten in Antworten durchsuchbar und zitierbar.
Polling vs. Webhooks
Für ein paar Dokumente frage GET /api/v2/jobs/{id} alle paar Sekunden ab. Für Massen- oder Backend-Pipelines in einem bezahlten Tarif registriere einen Webhook (oder übergib callback_url) und wir machen einen POST an dich bei ready oder error, also sparst du dir das Pollen komplett.
Bau es in deine Pipeline ein
Derselbe Konverter ist eine REST API und ein gehosteter MCP-Endpunkt, mit maschinenlesbarer Discovery, damit Skripte und Agenten ihn direkt steuern können.
Häufige Fragen
Warum Markdown für RAG statt des Rohtexts der PDF?
Die Rohextraktion verliert die Struktur (Überschriften, Listen und Tabellen kollabieren und die Lesereihenfolge bricht), was verrauschte Chunks erzeugt. Markdown erhält die Struktur, also liefert das Chunking nach Überschriften sauberere, besser abrufbare Passagen und nutzt viel weniger Tokens als Roh-Dumps oder HTML.
Überleben Tabellen und Formeln?
Ja. Spalten werden zu echten Markdown-Tabellen statt zu wirren Zeilen, und mathematische Notation bleibt erhalten statt abgeflacht zu werden, also bleiben numerische und tabellarische Fakten abrufbar. Mehr zum Extrahieren von Tabellen.
Kann ich das in einer Pipeline automatisieren?
Ja. Nutze die REST API (anlegen, abfragen, herunterladen) mit einem Bearer-API-Schlüssel oder das gehostete MCP für Agent-Frameworks. In bezahlten Tarifen entfernt ein Webhook das Pollen. Es gibt nichts zu hosten. Sieh dir das Python-Tutorial für ein vollständiges Beispiel an.
Wie gehe ich mit langen Dokumenten um?
Jede Konvertierung läuft bis zu einem Zeitbudget pro Tarif; ein langes Dokument wird mit truncated=true teilweise zurückgegeben, statt zu scheitern. Lies truncated und teile sehr große Dateien auf, oder nutze einen höheren Tarif mit größerem Budget.
Verarbeitet es gescannte PDFs für die Ingestion?
Ja. Reine Bild-PDFs und gescannte PDFs werden per OCR in auswählbares Markdown in vielen Sprachen umgewandelt, also werden Scans zu abrufbarem Text in deinem Index.
Wie sollte ich das Markdown für RAG chunken?
Teile nach der Überschriften-Hierarchie, damit jeder Chunk ein eigenständiger Abschnitt ist, halte Tabellen ganz, füge einen kleinen Überlapp zwischen Chunks hinzu und stelle die Abschnittsüberschrift voran, damit das Embedding den Kontext kennt. Ziele auf ein paar hundert Tokens pro Chunk.
Warum werden Markdown-Tabellen besser abgerufen als Rohtext?
Die Rohextraktion verwürfelt Spalten zu Rauschen, also passt der Wert, den du brauchst, selten zu einer Anfrage. Eine echte Markdown-Tabelle hält Zeilen und Überschriften ausgerichtet, also bleiben tabellarische Fakten durchsuchbar und zitierbar.
Gibt es einen Gratis-Tarif zum Testen?
Ja. Ein kostenloses Google-Konto schaltet einen API-Schlüssel und das gehostete MCP frei: 3 Slots, 10-MB-Dateien, ein Zeitbudget von 15 Minuten und 1 Stunde Aufbewahrung. Bezahlte Tarife erhöhen jedes Limit und ergänzen Webhooks und Batch-Anlage.