Kako koristimo Google Gemini AI za automatsku klasifikaciju 40.000 akademskih dokumenata

· 7 min
Sadržaj

Katalog je bio suština problema. 700 odgovora na anketu je to potvrdilo.

Pre: slobodan tekst haos. Posle: 77 kategorija, 797 institucija, 52.098 tagova.

Ali ne možete samo baciti AI na 40.000 dokumenata i nadati se. Potrebni su slojevi.

Zašto slojevi?

Svaki poziv Gemini-ju košta. Vreme i novac.

Ako svaki upload prolazi kroz punu klasifikaciju — ekstrahuj tekst, analiziraj sadržaj, odredi tip, kategoriju, naslov, sažetak, ključne reči, instituciju — koštaćete mnogo i biće sporo.

Ali većina upload-a ne treba punu klasifikaciju. Neki su očigledno neprihvatljivi: e-knjige, CV-jevi, reklame, nečitljiv OCR. Zašto trošiti resurse na njih?

Zato: dvoslojna arhitektura.

Sloj 1: Gatekeeper

Brza, jeftina provera. Da li je ovaj dokument uopšte prihvatljiv za platformu?

Šta proverava:

  • Da li je akademski sadržaj (score 0-1)
  • Da li je komercijalna e-knjiga/izdavački sadržaj (rizik 0-1)
  • Crvene zastave: e-knjiga, CV/biografija, reklama, prekratak, nečitljiv OCR

Odluka:

  • PROCEED — Nastavi ka punoj klasifikaciji
  • REJECT — Prikaži grešku, ne obrađuj dalje

Gatekeeper je brz. Par sekundi. Ako dokument ne prođe, korisnik odmah zna.

interface GatekeeperResult {
  decision: 'PROCEED' | 'REJECT';
  scoreAcademic: number;      // 0.0 - 1.0
  ebookRisk: number;          // 0.0 - 1.0
  redFlags: string[];         // ['ebook', 'resume', 'advertisement', 'too_short', 'illegible_ocr']
  reasoning: string;
}

Sloj 2: Puna klasifikacija

Samo za dokumente koji prođu gatekeeper.

Ekstrahuje:

  • documentType: Seminarski rad, Maturski rad, Skripta, Prezentacija, itd.
  • subjectCategory: Iz 77 akademskih predmeta
  • title: Predloženi naslov na srpskom (latinica)
  • summary: 120-350 karaktera sažetka
  • keywords: 2-5 ključnih reči
  • school: Detalji o instituciji
  • confidence: 0-1 score

Srpski jezik awareness:

Ovo nije trivijalno. Dokumenti su na srpskom (latinica i ćirilica), hrvatskom, bosanskom. Različiti termini za iste koncepte. Regionalne varijacije.

Gemini prompt eksplicitno navodi:

  • Izlaz mora biti na srpskom (latinica)
  • Prepoznaj regionalne varijacije
  • Normalizuj termine na standardne kategorije

14-fazni pipeline

Klasifikacija je samo deo. Ceo pipeline:

  1. PDF unlock — Otključaj zaštićene PDF-ove
  2. Convert — DOC/DOCX/PPT/ODT → PDF
  3. Markdown extraction — PDF → Markdown za AI analizu
  4. Gatekeeper — Da li je akademski? (Sloj 1)
  5. Full classification — Tip, kategorija, naslov, sažetak (Sloj 2)
  6. PDF redaction — 30% preview za neregistrovane
  7. Compression — Smanji veličinu fajla
  8. Images — Generiši slike stranica
  9. HTML preview — PDF → HTML za web prikaz
  10. Thumbnails — Cover slike za listing
  11. RAG markdown — Optimizovan tekst za pretragu
  12. Final gate — Poslednja AI provera pre objave
  13. Institution extraction — Fuzzy matching + AI fallback
  14. R2 upload — Upload na Cloudflare R2

Svaka faza može da failuje. Sistem je fail-closed: ako bilo šta ne radi, dokument se ne objavljuje.

Final Gate: Poslednja linija odbrane

95% dokumenata prolazi. Ali taj final gate je kritičan.

Zašto još jedna provera? Zato što gatekeeper vidi samo početak procesa. Final gate vidi sve: originalni sadržaj, klasifikaciju, kako se naslov podudara sa sadržajem.

Tri ishoda:

  • GO — Objavi (odmah za PRO, zakazano 3-7 dana za non-PRO)
  • NO_GO + riskScore < 0.8 — Drži za admin pregled
  • NO_GO + riskScore >= 0.8 — Automatski u trash
interface FinalGateResult {
  decision: 'GO' | 'NO_GO';
  riskScore: number;           // 0.0 - 1.0
  reasoning: string;
  suggestedAction: 'publish' | 'hold' | 'trash';
}

Fail-closed filozofija

Ako je Gemini nedostupan, šta se dešava?

Stari pristup (fail-open): Prihvati dokument, klasifikuj kasnije. Problem: spam prolazi.

Novi pristup (fail-closed): Odbij sa porukom za retry. Problem: korisnik mora da pokuša ponovo.

Izabrali smo fail-closed. Bolje je odbiti legitiman dokument nego prihvatiti spam.

// Error handling u ai-classification.ts
throw new Error('Document analysis service is temporarily unavailable. Please try again later.')

Ekstrakcija institucije: Dve strategije

Dokumenti često pominju instituciju. Ali na mnogo načina:

  • "Univerzitet u Beogradu, Ekonomski fakultet"
  • "Ekonomski fakultet BG"
  • "EF Beograd"
  • "EKOF"

Strategija 1: Fuzzy matching protiv poznatih termina (797 institucija).

Strategija 2: AI fallback za edge cases.

AI dobija listu institucija i traži best match. Ako confidence > 0.7, dodeljujemo. Ako ne, ne dodeljujemo — bolje bez nego pogrešna.

Pre i posle: Primer

Pre:

Naslov: SEMINARSKI RAD EKONOMIJA 2023
Kategorija: Ostalo
Institucija: (prazno)
Tagovi: (prazno)

Posle:

Naslov: Analiza makroekonomskih pokazatelja Srbije u periodu 2020-2023
Kategorija: Makroekonomija
Institucija: Univerzitet u Beogradu - Ekonomski fakultet
Tagovi: [makroekonomija, BDP, inflacija, Srbija, ekonomska analiza]
Sažetak: Rad analizira ključne makroekonomske pokazatelje Srbije...

Isti dokument. Potpuno drugačija discoveryability.

Metrke posle revizije

3.948 postojećih postova je imalo probleme sa kvalitetom:

  • UPPERCASE naslovi
  • lowercase naslovi
  • kebab-case naslovi
  • Prekratki naslovi
  • Numerički prefiksi

AI reklasifikacija rezultati:

  • 100% stopa popravke kategorija
  • 99% stopa popravke naslova
  • 69% stopa popravke tagova
  • 28% stopa popravke HTML-a

695 nepopravljenih. Zašto? Izvorni fajl ne postoji na R2. Bez izvora, ni AI ne može da pomogne.

Efikasna AI klasifikacija nije samo "baci LLM na problem." To je arhitektura koja balansira troškove, latency, i kvalitet.

Gatekeeper eliminiše očigledno loše brzo i jeftino. Puna klasifikacija ide duboko samo za kvalifikovan sadržaj. Final gate hvata greške pre objave.

Dvoslojni pristup nije komplikacija. To je optimizacija.