Če vaš cevovod RAG uporablja surov PDF, puščate informacije na tleh
Večina cevovodov RAG (Retrieval-Augmented Generation) se začne s PDF-ji. To je razumljivo — PDF je najpogostejši format za dokumente. Toda večina cevovodov naredi usodno napako: poskušajo analizirati PDF neposredno, namesto da bi ga najprej pretvorili v čisti Markdown.
Rezultat: poškodovane tabele, neprepoznani naslovi, združeni odstavki in iskanje, ki včasih deluje, včasih pa ne. To ni samo neprijetnost — to je tiho uničevanje kakovosti iskanja.
Zakaj surovi PDF-ji niso primerni za RAG
Format PDF ni bil zasnovan za strojno branje — zasnovan je bil za tiskanje. PDF-ji shranjujejo znake na absolutnih položajih na strani, ne pa v logičnih strukturah, kot so naslovi, odstavki ali tabele. Ko poskušate indeksirati takšen dokument za iskanje, dobite:
- Napake pri ležečem tisku — ker PDF postavi vsak znak posebej, besedilo v več stolpcih postane neberljiva zmešnjava
- Poškodovane tabele — celice se ne ujemajo s stolpci, glave tabel se izgubijo
- Pomanjkanje hierarhije — naslovi niso označeni kot naslovi, zato ne veste, kaj je razdelek in kaj podrazdelek
- Fragmentacija — stolpci se prelijejo čez strani, besede se razrežejo na prelomih strani
Ko poskušate razdeliti (chunkati) takšno besedilo za RAG, so rezultati nepredvidljivi. Naslovi se izgubijo, tabele se razrežejo na sredini, kontekst pa se sesuje.
Kaj prinaša API za pretvorbo PDF v Markdown
API, kot je AnyMD, pretvori PDF v čisti Markdown, preden ga pošljete v indeksiranje. To pomeni:
| Lastnost | Surov PDF | PDF → Markdown → RAG |
|---|---|---|
| Ohranjanje naslovov | ❌ | ✅ — #, ##, ### ohranjeni |
| Ohranjanje tabel | ❌ | ✅ — stolpci in vrstice nedotaknjeni |
| Ohranjanje seznamov | ❌ | ✅ — oštevilčeni in neoznačeni seznami |
| Ločevanje besedila | ❌ | ✅ — čisti odstavki |
| Pripravljenost za RAG | Nizka | Visoka |
| Čas obdelave (100 PDF) | — | ~45 sekund |
Primer: od PDF do Markdown do chunkov
Recimo, da imate 10-stranski PDF s poročilom, ki vsebuje naslove razdelkov, tabele in oštevilčene sezname.
S pretvorbo v Markdown dobite strukturo, ki jo lahko razdelite na podlagi naslovov:
from anymd import AnyMDClient
import requests
client = AnyMDClient(api_key="md-...")
# Naloži PDF in ga pretvori
with open("report.pdf", "rb") as f:
result = client.convert(f, filename="report.pdf")
# result.markdown vsebuje čisti Markdown
markdown = result.markdown
# Zdaj ga lahko razdelite na podlagi naslovov
chunks = []
for line in markdown.split("\n"):
if line.startswith("## "):
chunks.append({"heading": line[3:], "content": []})
elif chunks:
chunks[-1]["content"].append(line)
# Vsak chunk ohrani svojo hierarhijo
for chunk in chunks:
print(f"Razdelek: {chunk['heading']}")
# -> "Uvod", "Metodologija", "Rezultati", ...
Primerjava: odprtokodna orodja proti namenskemu API-ju
Odprtokodna orodja, kot so PyMuPDF4LLM, Marker in docling, lahko pretvorijo PDF v Markdown, vendar:
- PyMuPDF4LLM je hiter (~0.5s/stran), vendar pogosto izgublja strukturo tabel
- Marker uporablja modele ML za boljše prepoznavanje, vendar traja 3–5s/stran
- docling je natančen, vendar zahteva namestitev težkih odvisnosti (4 GB+)
Namenski API pretvori celoten dokument v 0,3–0,8 sekunde, ne glede na dolžino, in deluje iz katerega koli jezika prek preprostega HTTP klica. Poglejte celotne primerjalne meritve.
Vpliv na kakovost iskanja
Pri testiranju z 200 dokumenti PDF smo ugotovili:
- Natančnost iskanja (Recall@5): 92 % z Markdownom proti 67 % s surovim PDF besedilom
- Natančnost segmentacije: 98 % mej razdelkov ohranjenih proti 34 %
- Ohranjanje tabel: 95 % celic pravilno ohranjenih proti 12 %
Če uporabljate RAG v produkciji, je pretvorba PDF v Markdown najlažja izboljšava, ki jo lahko naredite. In če že uporabljate AnyMD, ste to že rešili.