Preskoči na sadržaj

AI, Full-stack

KODEKS: pravni asistent za bosanskohercegovačko zakonodavstvo zasnovan na RAG-u

Pravni asistent za policijske službenike u Bosni i Hercegovini, izgrađen uz Next.js, Supabase pgvector, OpenAI embeddinge i Claude, koji odgovara isključivo na osnovu zakona i pokazuje odakle dolazi svaki odgovor.

Klijent
Vlastiti proizvod (ANODA)
Godina
2026
Uloga
Proizvod, arhitektura i kompletna implementacija
Status
U razvoju, namijenjen policijskim službenicima u Bosni i Hercegovini. Bez javne demonstracije.
Vrsta
RAG sistem (generisanje potpomognuto pretragom)
Next.jsSupabase (PostgreSQL + pgvector)Anthropic Claude APIOpenAI text-embedding-3-small
Ilustracija KODEKS asistenta u prozoru preglednika: pitanje o policijskim ovlaštenjima i odgovor s oznakama izvoraIlustracija

Ukratko

OblastPravo, provođenje zakona
KorisniciPolicijski službenici u Bosni i Hercegovini
KorpusDomaće zakonodavstvo na bosanskom jeziku
PristupGenerisanje potpomognuto pretragom, uz navođenje izvora
EmbeddingiOpenAI text-embedding-3-small, višejezični
Vektorska bazaSupabase PostgreSQL + pgvector
LLMAnthropic Claude API
AplikacijaNext.js
StatusU razvoju, bez javnog demoa

Problem

Policijskim službenicima u Bosni i Hercegovini trebaju brzi i pouzdani odgovori iz zakona i propisa koji su dugi, rascjepkani i napisani na bosanskom jeziku. Na terenu nema vremena za pretragu nekoliko zakona da bi se pronašao onaj jedan član koji se primjenjuje.

Opći chatbotovi nisu rješenje: ili ne poznaju domaće zakone ili ih izmišljaju, a samouvjeren pogrešan odgovor o zakonu gori je od nikakvog odgovora. Pretraga PDF fajlova je tačna, ali spora, i funkcioniše samo ako već znate tačne riječi koje zakon koristi.

Zašto ne opći chatbot?

Opći chatbotPretraga PDF fajlovaKODEKS
Poznaje bosanskohercegovačke zakoneDjelimičnoDaDa
Odgovara jednostavnim jezikomDaNeDa
Pokazuje izvorNeDaDa
Priznaje kada ne znaNeDjelimičnoDa
Radi s varijantama BHS jezikaDjelimičnoNeDa
Ilustracija, primjer teksta

KODEKS

Kada policijski službenik može tražiti identifikaciju osobe?

Prema pronađenim odredbama, službenik može tražiti identifikaciju u slučajevima koje zakon izričito navodi. Za svaki slučaj navodim izvor, pa odgovor možete provjeriti u originalnom tekstu.

Izvor 1Izvor 2

Ograničenja i odluke u dizajnu

OgraničenjeOdluka
Pogrešan pravni odgovor gori je od nikakvog odgovoraOdgovori se generišu isključivo iz pronađenih odlomaka, a svaka tvrdnja navodi svoj izvor
Pravni tekst je dug i strukturiran (zakoni, članovi, stavovi)Dokumenti se prije indeksiranja dijele na odlomke, a svaki odlomak čuva metapodatke o tome odakle potiče
Korisnici pišu na bosanskom, hrvatskom ili srpskomVišejezični embedding model, tako da se značenje poklapa bez obzira na jezičku varijantu
Službenici moraju brzo provjeriti odgovorIzvori se prikazuju kao linkovi na koje se može kliknuti, odmah uz odgovor
Trošak mora ostati nizak za alat javnog sektoraMali, efikasan embedding model; LLM dobija samo relevantne odlomke

Arhitektura

KODEKS ima dva pipelinea. Unos i obrada dokumenata (ingestion) radi offline i pretvara zakonodavstvo u odlomke (chunkove) koji se mogu pretraživati. Pipeline upita pokreće se za svako pitanje i gradi odgovor isključivo iz tih odlomaka.

Unos i obrada dokumenata (offline)
  1. Pravni dokumenti

    Domaće zakonodavstvo

  2. Parsiranje i normalizacija

    Očišćen, ujednačen tekst

  3. Podjela na odlomke

    Uz metapodatke: zakon, član

  4. Embedding

    text-embedding-3-small

  5. Pohrana vektora

    Supabase pgvector

Pipeline upita (online)
  1. Pitanje korisnika

    Na bosanskom, hrvatskom ili srpskom

  2. Embedding pitanja

    Isti embedding model

  3. Pretraga po sličnosti

    Vektorska pretraga u pgvectoru

  4. Filter praga sličnosti

    Zadržavaju se samo relevantni odlomci

  5. Slaganje konteksta

    Odlomci s oznakama izvora

  6. Claude

    System prompt koji vezuje odgovor za izvore

  7. Odgovor uz navođenje izvora

    Svaka tvrdnja ima izvor

Filter praga sličnosti →Nijedan odlomak ne prolazi: zamjenski odgovor. Navodi se šta nedostaje i predlaže kako preformulisati pitanje.

Jedno pitanje, korak po korak
  1. 1Korisnik → Next.js aplikacijaPostavlja pitanje
  2. 2Next.js aplikacija → Embedding APIEmbedding pitanja
  3. 3Embedding API → Next.js aplikacijaVektor pitanja
  4. 4Next.js aplikacija → Supabase (pgvector)Pretraga po sličnosti
  5. 5Supabase (pgvector) → Next.js aplikacijaOdgovarajući odlomci s izvorima
  6. 6Next.js aplikacija → Claude APIPrompt vezan za izvore + odlomci
  7. 7Claude API → Next.js aplikacijaOdgovor uz navođenje izvora
  8. 8Next.js aplikacija → KorisnikOdgovor i izvori na koje se može kliknuti

Kako radi pretraga

Embedding model pretvara dio teksta u dugu listu brojeva, vektor, tako da tekstovi sličnog značenja završe blizu jedan drugog. Pitanje o "identifikaciji osobe" i član zakona o "utvrđivanju identiteta" nađu se jedno blizu drugog iako dijele malo zajedničkih riječi. Zbog toga isto pitanje radi bez obzira na to da li je napisano na bosanskom, hrvatskom ili srpskom.

Kada službenik postavi pitanje, KODEKS ga pretvara u vektor i od baze traži odlomke koji su mu najbliži. Samo odlomci koji su dovoljno blizu, unutar praga sličnosti, prosljeđuju se jezičkom modelu. Sve ostalo se zanemaruje, što odgovor drži fokusiranim, a trošak niskim.

Prag sličnostiPitanjeRelevantan odlomakOstali odlomci
Ilustracija. Stvarni embeddingi imaju 1.536 dimenzija; ovo je 2D skica.

Incident: asistent koji nije vraćao ništa

Tokom testiranja, neka sasvim razumna pitanja vraćala su prazan odgovor. Bez greške, bez pada sistema, jednostavno ništa korisno. Ovako sam otkrio zašto.

SimptomNeka legitimna pitanja vraćala su prazan odgovor, dok su druga o istom zakonu radila normalno.
HipotezaProblem nije bio u modelu. Nešto prije njega uklanjalo je kontekst koji mu je trebao.
Šta sam provjerioKoje odlomke pretraga po sličnosti vraća za problematična pitanja, prije i poslije filtera praga sličnosti, i šta model dobija kada nijedan odlomak ne prođe.
Uzrok 1Prag sličnosti odbacivao je sve kandidate za pitanja formulisana drugačije od pravnog teksta.
Uzrok 2System prompt nije imao uputu za slučaj "nema relevantnog konteksta", pa model nije imao šta reći.
RješenjePrag sam podesio na stvarnim pitanjima, osigurao da se najbolji odlomci i dalje uzimaju u obzir kada nijedan ne pređe prag, i dodao eksplicitnu uputu: reci šta nedostaje umjesto da nagađaš.
"Pretraga i generisanje zakazuju na različite načine. Sada ih mjerim odvojeno."

Pravila vezivanja odgovora za izvore u system promptu

System prompt pretvara model iz općeg asistenta u pažljivog asistenta. Nameće sljedeća ponašanja:

  • Odgovaraj isključivo na osnovu dostavljenih odlomaka.
  • Navedi izvor za svaku tvrdnju.
  • Odgovaraj na jeziku korisnika.
  • Jasno reci kada odlomci ne pokrivaju pitanje.
  • Nikada ne predstavljaj odgovor kao pravni savjet.

Evaluacija

KODEKS evaluiram skupom stvarnih pitanja, gdje je svako upareno s odlomcima koje bi pretraga trebala vratiti. Pretragu mjerim odvojeno od kvaliteta odgovora, pa kada nešto krene po zlu, znam koju polovinu sistema treba pogledati.

Kako mjerim kvalitet
MetrikaŠta mi govori
Recall@kDa li se pravi odlomak našao među prvih k vraćenih odlomaka?
MRR (srednji recipročni rang)Koliko je visoko, u prosjeku, rangiran prvi tačan odlomak.
Oslonjenost na izvore (groundedness)Da li je svaka tvrdnja u odgovoru potkrijepljena navedenim odlomkom?
Ispravno odbijanjeDa li asistent kaže "nije pronađeno" kada zakon ne pokriva pitanje?

Odgovorna upotreba AI-ja

  • Svaki odgovor navodi izvore, tako da službenik može provjeriti originalni tekst.
  • Nijedan odgovor se ne generiše bez pronađenog konteksta.
  • Prije šire upotrebe planirano je jasno upozorenje u interfejsu da odgovor "nije pravni savjet".

Sljedeći koraci, još nisu urađeni

Plan razvoja

  • Hibridna pretraga

    Kombinacija pretrage po ključnim riječima i vektorske pretrage, kako bi se tačni pravni izrazi i brojevi članova poklapali jednako dobro kao i značenje.

  • Reranking

    Ponovno rangiranje pronađenih odlomaka posebnim modelom prije nego što stignu do LLM-a.

  • Automatska evaluacija u CI-ju

    Pokretanje evaluacijskog skupa pri svakoj izmjeni, kako kvalitet pretrage ne bi mogao neprimjetno opasti.

  • Tracing i observability

    Bilježenje svakog upita, pronađenih odlomaka i odgovora, radi otklanjanja grešaka i poboljšanja na osnovu stvarnih podataka.

Tehnologije

SlojTehnologijaZašto
FrontendNext.jsJedan framework za interfejs i za pozive AI servisima sa servera
EmbeddingiOpenAI text-embedding-3-smallDobro radi s bosanskim, hrvatskim i srpskim, uz nizak trošak
Vektorska bazaSupabase PostgreSQL + pgvectorVektori stoje uz ostale podatke, u bazi kojoj već vjerujem
LLMAnthropic Claude APIPrecizno slijedi upute da odgovara samo iz izvora i piše jasne odgovore uz navođenje izvora
JezikTypeScriptJedan tipizirani jezik kroz cijelu aplikaciju

Pojmovnik

Deset pojmova, jednostavnim jezikom
RAG
Generisanje potpomognuto pretragom (retrieval-augmented generation): model prvo pronađe relevantan tekst, a zatim odgovara koristeći samo taj tekst.
Embedding
Lista brojeva koja predstavlja značenje nekog dijela teksta.
Vektor
Sama ta lista brojeva; tekstovi sličnog značenja imaju vektore koji su blizu jedan drugom.
Kosinusna sličnost
Način mjerenja koliko su dva vektora blizu, na osnovu ugla između njih.
Odlomak (chunk)
Dio većeg dokumenta, dovoljno mali da se može pretraživati i proslijediti modelu.
Top-k
k najsličnijih odlomaka koje vrati pretraga.
Prag sličnosti
Minimalna sličnost koju odlomak mora imati da bi bio iskorišten.
Vezivanje za izvore (grounding)
Navođenje modela da odgovara na osnovu datih izvora, a ne svog općeg znanja.
Halucinacija
Samouvjeren odgovor koji nije potkrijepljen izvorima niti stvarnošću.
Recall@k
Udio pitanja kod kojih se pravi odlomak nalazi među prvih k rezultata.

Povezani tekstovi

Imate sličan projekat?
Razgovarajmo.