Aliyun OCR + LiteParse: neka i skenirani PDF-ovi postanu pretraživi kroz RAG
Oni koji se bave RAG-om su se verovatno svi sapleli o isto: skenirani PDF ili PDF snimak ekrana koji pri pretrazi nikako ne može da pronađe sadržaj.
I ja sam naišao na taj problem dok sam radio na PaiSmart-u (PaiSmart — bazu znanja na nivou preduzeća zasnovanu na RAG-u).
Ali danas sam pronašao prilično dobro rešenje — pomoću LiteParse-a, koga je LlamaIndex otvorio kao open source, jednom komandom možete izvući tekst iz skeniranog dokumenta pomoću OCR-a; nije potreban API Key, a brzina parsiranja je i velika.

U ovom članku ćemo detaljno obraditi temu.
Šta je zapravo LiteParse, kako se koristi lit komanda, ideja „parsiranja prostornog teksta“, kao i to kako sam ga integrisao u PaiSmart i koje sam zamke naišao.
Zavežite pojaseve, krećemo.
01. Šta je LiteParse
LiteParse je alat za parsiranje dokumenata koji je tim LlamaIndex otvorio kao open source 19. marta 2026, pod Apache 2.0 licencom; adresa repozitorijuma je
https://github.com/run-llama/liteparse

LlamaIndex vam verovatno nije nepoznat — ranije su imali zvezdani proizvod LlamaParse, specijalizovan za parsiranje složenih dokumenata, sa vrlo dobrim rezultatima, ali je to oblačna usluga koja zahteva otpremanje fajlova, plaćanje i internet vezu.
LiteParse izdvaja „jezgro sposobnosti obrade“ iz LlamaParse-a i pravi verziju koja u potpunosti radi lokalno.
Pozicija LiteParse-a je lokalno, lako, brzo.
Celokupno jezgro je prepisano u Rustu; na najnižem nivou PDFium renderuje PDF, Tesseract radi OCR; radi na vašoj mašini, bez ikakvih poziva u oblak, ne zahteva API Key, a radi i bez internet veze.
Pogodan je za obradu dokumenata sa relativno jednostavnom strukturom, sa naglaskom na nisku latenciju, specijalno optimizovan za iterativni način rada AI Agenta — „brzo pročitaj jednom, po potrebi detaljnije pogledaj“.

LlamaParse obrađuje one veoma teške dokumente, poput gustih tabela, višekolonog preloma, grafikona, rukom pisanih slova, jako loših skenova.
Formati koje LiteParse podržava:
- PDF: direkt Ide preko PDFium-a radi parsiranja prostornog teksta; skenirane stranice i ugrađene slike automatski aktiviraju OCR
- Office dokumenti: Word, PPT, Excel, CSV — prvo se LibreOffice-om konvertuju u PDF, a zatim prolaze kroz isti procesni tok
- Slike: PNG, JPG, TIFF, WebP itd. — prvo se ImageMagick-om konvertuju u PDF, a zatim OCR
02. lit komandna linija
LiteParse nudi više načina instalacije — npm, pip, cargo; nakon instalacije, alat komandne linije se jedinstveno zove lit.
npm i -g @llamaindex/liteparse
# ili Python
pip install liteparse
# ili Rust
cargo install liteparse
Nakon instalacije, pokrenite osnovnu komandu za parsiranje koja direktno pretvara PDF u tekst:
lit parse docs/paismart.pdf
On parsirani tekst direktno štampa na standardni izlaz. Prirodno se uklapa u Unix cevovode — na primer, ako u izveštaju želite da pronađete redove koji sadrže „table“, jedna komanda je dovoljna:
lit parse docs/paismart.pdf | grep "table"I udaljeni PDF se može preuzeti pomoću curl-a i proslediti mu:
curl -sL https://example.com/report.pdf | lit parse -Za strukturirani izlaz dodajte --format json, a zatim sa -o navedite izlazni fajl:
lit parse document.pdf --format json -o output.jsonJSON izlaz ne sadrži samo tekst, već i granični okvir (bounding box) koordinate za svaki pasus teksta, kao i broj stranice.
Opcioni parametri komande lit parse:
--target-pages "1-5,10": parsira samo navedene stranice; pri otklanjanju problema sa velikim fajlovima štedi mnogo vremena--no-ocr: isključuje OCR; za čist tekstualni PDF ovo znatno ubrzava rad--ocr-language: navodi jezički paket za OCR; za kineski upišitechi_sim--ocr-server-url: navodi adresu eksterne OCR usluge; ako se ne popuni, koristi se ugrađeni Tesseract--dpi: rezolucija renderovanja; utiče na preciznost i brzinu OCR-a--num-workers: broj paralelnih workera; višejzgarni računari mogu ubrzati rad--max-pages: maksimalan broj stranica za parsiranje; sprečava da previše veliki fajl sruši proces--password: dešifruje šifrovani PDF
Pored parse, često se koriste još dve komande. Jedna je masovno parsiranje celog direktorijuma:
lit batch-parse ./input-directory ./output-directoryDruga je generisanje snimaka stranica, specijalno dizajnirano za Agente:
lit screenshot document.pdf -o ./screenshots03. Integrisanje LiteParse-a u PaiSmart
Da prvo kažem nešto o vektorskom procesu PaiSmart RAG-a.
Korisnik otprema fajl, zatim se u Kafka šalje zadatak obrade koji potrošač osluškuje i obrađuje; poziva se usluga parsiranja koja fajl seče na tekstualne blokove (chunk), izračunava embedding vektore i konačno sinhronizuje ih sa Elasticsearch-om radi kreiranja indeksa.
LiteParse se povezuje baš na „parsiranje“.

PaiSmart je ranije koristio Apache Tika za opšte parsiranje dokumenata; Tika dobro obrađuje čist tekstualni PDF, ali kod skeniranih dokumenata pada.
Stoga je integracija LiteParse-a bila neophodna.
Pošto je LiteParse alat komandne linije, ovaj put smo pristupili tako što smo pomoću ProcessBuilder-a pokrenuli potproces, upisali PDF u privremeni fajl, u komandi naveli JSON izlaz, a nakon završetka pročitali taj JSON.
List<String> command = new ArrayList<>();
command.add(liteParseCommand); // lit
command.add("parse");
command.add(inputPath.toString()); // privremena putanja PDF-a
command.add("--format");
command.add("json");
command.add("--output");
command.add(outputPath.toString()); // privremena putanja JSON-a
command.add("--max-pages");
command.add(String.valueOf(liteParseMaxPages));
command.add("--dpi");
command.add(String.valueOf(liteParseDpi));
// Jezik OCR-a: pojednostavljeni kineski + engleski
command.add("--ocr-language");
command.add(liteParseOcrLanguage); // chi_sim+eng
command.add("--quiet");Prvo,kontrola isteka vremena. LiteParse pri parsiranju velikih fajlova ili OCR-u može biti spor; potproces ne može čekati beskonačno. Ako vreme istekne, poziva se destroyForcibly() da se nasilno ubije.
Drugo,standardni izlaz i izlaz greške se preusmeravaju u fajlove. Ako se bafer potprocesa za stdout i stderr napuni, proces se zamrzne. Zato ih preusmeravamo u dva privremena fajla; pri neuspehu parsiranja zapisujemo u log, što olakšava otklanjanje problema.
Treće,privremeni fajlozi se obavezno čiste. Svako parsiranje kreira četiri privremena fajla: ulazni PDF, izlazni JSON, stdout log i stderr log; zato koristimo finally blok koji, bez obzira na uspeh ili neuspeh, briše te fajlove.
Korak čitanja JSON-a nakon parsiranja radi sečenje na nivou stranice.
Ranije sam pomenuo da JSON izlaz LiteParse-a za svaki pasus teksta sadrži broj stranice. Zato ih delimo po stranicama, sečemo chunk po stranicama i beležimo broj stranice za svaki chunk:
for (LiteParsePage page : pages) {
String pageText = page.text();
if (pageText == null || pageText.isBlank()) {
continue;
}
List<String> childChunks = splitTextIntoChunksWithSemantics(pageText, chunkSize);
savedChunkCount = saveChildChunks(
fileMd5, childChunks, userId, orgTag, isPublic, savedChunkCount, page.pageNumber()
);
}Zašto zadržati broj stranice?
Zato što nakon pogotka RAG pretrage, ako korisnik želi da zna „na kojoj stranici originalnog dokumenta se nalazi ovaj pasus“, broj stranice omogućava lociranje izvora.
Pored toga, sečenje po stranicama ima i još jednu prednost: jedan chunk ne prelazi dve stranice, semantički je čistiji i ne spaja kraj treće stranice sa početkom četvrte.

PaiSmart koristi strategiju „roditeljski dokument—detski isečci“ sa semantičkim preklapanjem: prvo seče po granicama pasusa i rečenice, previše male blokove spaja, a između susednih blokova ostavlja 100 znakova semantičkog preklapanja (overlap); za duge kineske rečenice koristi HanLP za segmentaciju reči na granicama značenja, čime se izbegava presecanje jedne reči na dva dela.
Konfiguracija je sledeća:
file:
parsing:
chunk-size: 512
overlap-size: 100
min-chunk-size: 100
pdf:
engine: liteparse
liteparse:
command: lit
ocr-enabled: true
ocr-language: chi_sim+eng
dpi: 150
max-pages: 1000
timeout-seconds: 300Kompletnu konfiguraciju sam napravio kao spolja nadjačive varijable okruženja, kao što su putanja komande lit, jezik OCR-a, DPI, vreme isteka; pri deploy-ju u različita okruženja dovoljno je promeniti varijablu okruženja, bez diranja koda.

05. Praktični test na PDF-u od slika
Nakon povezivanja sa LiteParse-om, testiramo opet fajl paismart.pdf, ovaj put tako da LiteParse preko ugrađenog Tesseract-a prepozna tekst iz slika.
Najpre da odradimo test.
TESSDATA_PREFIX="$HOME/Library/Application Support/tesseract-rs/tessdata" \
lit parse docs/paismart.pdf \
--target-pages 1 \
--dpi 300 \
--ocr-language chi_sim \
--quiet
Originalna slika izgleda ovako.

Iako rezultat parsiranja nije savršen, u osnovi je upotrebljiv.
Zar ne?
LiteParse ne radi OCR bez razmišljanja na svakoj stranici.
Ima sopstveni kriterijum: OCR pokreće samo na stranicama sa retkim tekstom ili znakovima u područjima fonta koji su nečitki, dok čist tekstualne stranice idu direktno preko PDFium ekstrakcije.
Ovde da kažem još nešto o parametru DPI.
Što je DPI viši, renderovana slika je jasnija, OCR precizniji, ali se vreme obrade i zauzeće memorije po stranici povećavaju. 300 je dovoljno za većinu materijala.
Još jedna zamka oko kineskog jezičkog paketa.
Da bi ugrađeni Tesseract prepoznao kineski, potrebno je instalirati jezički paket chi_sim; u konfiguraciji ocr-language navedite chi_sim+eng za mešovito prepoznavanje kineskog i engleskog.
macOS korisnici mogu instalirati ovako:
mkdir -p "$HOME/Library/Application Support/tesseract-rs/tessdata"
curl -L -o "$HOME/Library/Application Support/tesseract-rs/tessdata/eng.traineddata" \
https://github.com/tesseract-ocr/tessdata_fast/raw/main/eng.traineddata
curl -L -o "$HOME/Library/Application Support/tesseract-rs/tessdata/chi_sim.traineddata" \
https://github.com/tesseract-ocr/tessdata_fast/raw/main/chi_sim.traineddataLinux može ovako:
mkdir -p /usr/local/share/tessdata
curl -L -o /usr/local/share/tessdata/eng.traineddata \
https://github.com/tesseract-ocr/tessdata_fast/raw/main/eng.traineddata
curl -L -o /usr/local/share/tessdata/chi_sim.traineddata \
https://github.com/tesseract-ocr/tessdata_fast/raw/main/chi_sim.traineddataWindows korisnici mogu sami potražiti; nemam okruženje, pa ne mogu da verifikujem.
Ne zaboravite da konfigurišete putanju na ovo mesto u .env fajlu.

06. Povezivanje sa Aliyun OCR-om
Iz prethodnih primera ste videli da ugrađeni Tesseract, iako može izvući tekst iz slikovnog PDF-a, nije dovoljno precizan.
LiteParse nudi parametar --ocr-server-url.
Pomoću ovog parametra možemo se povezati sa eksternom OCR uslugom i dodatno povećati tačnost prepoznavanja.

Na taj način LiteParse samo renderuje PDF u sliku i procenjuje koje stranice zahtevaju OCR, dok se korak preciznog prepoznavanja svodi na POST slike navedenoj HTTP usluzi.
Pošto je PaiSmart ranije koristio Aliyun Embedding, ovaj put smo izabrali Aliyun-ovu „opštu visokopreciznu verziju prepoznavanja teksta“ (RecognizeAllText, Type=Advanced).
Međutim, pošto format koji LiteParse očekuje ne odgovara formatu koji vraća Aliyun, napravili smo jedan sloj adaptacije.
Specifikacija OCR usluge LiteParse-a zahteva sledeći JSON:
{
"results": [
{ "text": "prepoznati red teksta", "bbox": [x0, y0, x1, y1], "confidence": 0.98 }
]
}Dok Aliyun vraća ugnježdenu strukturu SubImages → BlockInfo → BlockDetails, gde se svaki tekstualni blok zove BlockContent, koordinate su čiri ugla BlockPoints, a pouzdanost se zove BlockConfidence.
Zato sam u PaiSmart-u dodao interni sloj adaptacije koji vrši ovaj prevod.
InternalOcrController: izlaže interni interfejs/api/v1/internal/ocr/liteparsekoji prima sliku POST-ovanu od strane LiteParse-aAliyunOcrService: poziva Aliyun SDK, prosleđuje sliku kaRecognizeAllTexti preuzima originalni odgovorLiteParseOcrAdapterService: prevodi Aliyun-ovuBlockDetailsstrukturu uresultsformat koji očekuje LiteParse
Aliyun-ov OCR smo napravili kao priključiv; ako je u .env fajlu ALIYUN_OCR_ENABLED postavljeno na true i upisan AccessKey, OCR se automatski prebacuje sa Tesseract-a na Aliyun; bez toga ide preko ugrađenog Tesseract-a.
aliyun:
ocr:
enabled: true
endpoint: ocr-api.cn-hangzhou.aliyuncs.com
access-key-id: ${ALIYUN_OCR_ACCESS_KEY_ID}
access-key-secret: ${ALIYUN_OCR_ACCESS_KEY_SECRET}
type: Advanced # opšta visokoprecizna verzija prepoznavanja teksta
output-coordinate: points
callback-token: ${ALIYUN_OCR_CALLBACK_TOKEN}Nakon povezivanja, možemo proveriti pomoću komande lit.
lit parse docs/paismart.pdf \
--target-pages 1 \
--dpi 300 \
--ocr-language chi_sim \
--ocr-server-url http://127.0.0.1:8081/api/v1/internal/ocr/liteparse \
--quiet
Ovaj put je preciznost očigledno veća.
Veoma tačno.

Stvarni rezultat je takođe veoma dobar — sadržaj iz slika takođe može biti pretražen.
07. Kako upisati PaiSmart u biografiju?
Naziv projekta: PaiSmart — open source RAG baza znanja na nivou preduzeća
Kratak opis: Sistem za pronalaženje i generisanje na osnovu internih dokumenata preduzeća; podržava otpremanje, parsiranje, vektorizaciju, semantičku pretragu i odgovaranje na pitanja za dokumente; pokriva PDF, Office, slike i druge formate; ima sposobnost izolacije ovlašćenja na nivou organizacije i asinhronog procesiranja.
Tehnološki stek: Spring Boot, Kafka, Elasticsearch, LiteParse, Tesseract / Aliyun OCR, HanLP.
Ključne odgovornosti:
- Na osnovu komandnog alata LiteParse refaktorisan je proces parsiranja PDF-a; pozivom potprocesa realizovan je lokalni OCR, čime je rešen problem da skenirani i slikovni PDF-ovi u bazi znanja ne mogu biti pretraženi.
- Dizajniran je priključiv sloj za adaptaciju OCR-a; pomoću mehanizma ocr-server-url LiteParse-a omogućeno je neprimetno prebacivanje motora za prepoznavanje između lokalnog Tesseract-a i Aliyun-ove visokoprecizne verzije OCR-a.
- Dizajnirana je strategija sečenja na nivou stranice; korišćenjem informacija o broju stranice iz izlaza parsiranja, svaki tekstualni blok se označava izvornom stranicom; podržano je lociranje izvora rezultata pretrage; pouzdanost odgovaranja na pitanja značajno je poboljšana.
- Implementirana je semantička strategija sečenja „roditeljski dokument + detski isečci“; uvedeno je 100 znakova semantičkog preklapanja i HanLP segmentacija reči na granicama kineskih reči; time je poboljšano vraćanje rezultata.
