RAG koji ne halucinira: kako forsirati AI da citira izvor
Hallucination u LLM-ima nije bug. To je feature. Model je treniran da generira tekst koji izgleda vjerojatno, a ne tekst koji je dokazivo istinit. Kad napraviš RAG sustav bez stroge kontrole, dobivash što je ekvivalentno licenciji za lažnjake: model će sa savršenom samopouzdanošću citirati papir koji nije pročitao, datume koji nisu postojali, i brojeve koji su izmišljeni. Naš pristup je suprotan: ne pokušavamo nagovoriti model da bude iskrean. Umjesto toga, forsiramo arhitekturu koja čini hallucination tehnički nemoguć. BGE-M3 embedding s 1024 dimenzije, Qdrant kao vektorska baza, hibridna pretraga full-text plus semantička, i pool od tri reranker instance koje validiraju svaki potencijalni citat prije nego što model ikad vidi odgovor. Ako citat ne odgovara izvoru, sustav baca grešku, ne pokušava prikriti problem ili izmisliti alternative. To je prvi dio rješenja. Drugi dio je disciplina u dizajnu: model MORA znati što ne zna.
Problem hallucination nije nov, ali je postao institucionalnost u vrijeme kad su svi LLM servisi zarađivali na samopouzdanju bez verifikacije. GPT-4 je bio spektakularan primjer. Korisnici su objavljivali primjere gdje je model citirao članke s točnim naslovima i autorima, ali je sadržaj bio potpuno izmišljen. Ponekad bi čak izmisliti i cijele reference na učenjake koji su postojali, ali nisu nikad napisali tekst koji je model pripisao. Taj fenomen se zove confabulation, i on je direktna posljedica kako su generativni modeli funkcionalno obučeni: maksimiziraju likelihood sljedećeg tokena u nizu, ne vjerojatnost da je taj token povezan s dokazivim faktom. Model zna da će korisnik biti zadovoljan ako odgovor izgleda autoritativno i organizirano. Zna da će biti penaliziran ako odgovori "ne znam" ili "informacija nije dostupna u mojim izvorima". Dakle, između hallucination-a koji izgleda uvjerljiv i iskrenog priznanja nesigurnosti, model će gotovo uvijek odabrati prvi. RAG je trebao biti rješenje, ali RAG bez arhitekturne discipline postaje samo sofisticiraniji način da model halucira sa referencama.
Naša arhitektura počinje s BGE-M3 embedding modelom, specifično zato što BGE-M3 može raditi tri vrste pretraživanja istovremeno: leksičko (keyword matching), semantičko (dense vector), i sparse vector (term weighting). 1024 dimenzije je izbor koji nije slučajan. Manji embedding prostor (512 dimenzija) gubi semantičku preciznost na domeni-specifičnim terminima. Veći prostor (1536+) postaje skupan za real-time pretraživanje bez značajnog povećanja kvalitete retrieval-a u praksi. BGE-M3 je treniran na 400+ jezika i miljardama tokena, što ga čini robustan na specijalizirane termine bez potrebe za domain-specific fine-tuning-om. Qdrant je izbor za vektorsku bazu jer ima ugrađenu pretragu s filteriranjem, što će ti trebati. Kada model halucira, trebash moći reći "prikaži mi sve embeddingi koji se nalaze u sljedećem semantic prostoru", i Qdrant to radi s sub-milisekundnom latencijom čak i s milijunima vektora. Hibridna pretraga znači da sustav prvo izvršava full-text search (brz, ali ne razumije semantiku), zatim vektorsku pretragu (razumije semantiku, ali sporija), a zatim fuzionira rezultate s BM25 scoring-om kao baseline. To osigurava da ako je ključna reč "metastaza" u tekstu, a model pita o "širenju malignog tumora", neće propustiti relevantni dokument jer keyword nije točan match.
Reranker pool s tri instance je ključna obrana. Reranker je mali model (obično 200-500 miliona parametara) koji ne generiše tekst. On samo ocjenjuje: "Koliko je ovaj document relevantan za ovaj query?" na skali 0-100. Tri instance znače da se taj query šalje na tri fizički odvojena reranker-a, i sustav čeka da svi tri vratse rezultate. Ako svi tri daju score >75 za taj dokument, taj dokument ide dalje. Ako jedan reranker daje 95, a druga dva daju 30, taj dokument se odbacuje. To je voting mechanism koji smanjuje rizik da će jedan model biti u lošoj konfiguraciji ili da je čitav proces pretraživanja devijirao u pogrešnom smjeru. Reranker je obučen da detektira relevanciju, ne da halucira. Ne generiše tekst. Njegova uloga je strogo binarna: prosljeđujem li ovaj dokument ili ne. To je osnova povjerenja.
Konkretni primjer: korisnik pita "Koji su primarni uzroci neurodegenerativnih bolesti?" GPT-4 bez RAG-a će dati odgovor koji izgleda autoritativno, s preciznošću od 30-40%. Odgovore će biti djelomično točni (spomenut će genetiku i aging), ali će uključiti i spekulativne tvrdnje kao da je "90% Alzheimerove bolesti uzrokovano virusom HSV-1", što je bila hipoteza iz 2018. koju su kasnije meta-analize diskreditirale. S našim RAG-om, proces ide ovako: query se pretvara u BGE-M3 embedding (1024 dimenzije). Qdrant pretraživanja u vektorskoj bazi od recenziranih članaka iz PubMed Central. Pronalazi se 50-100 potencijalnih relevantnih članaka. Full-text search pronalazi dodatne članke koji sadrže točne termine. Rezultati se fuzioniraju. Zatim se svaki od top 20 rezultata šalje na tri reranker instance. Reranker ocjenjuje: "Koliko je ovaj članak direktno odgovorio na pitanje o uzrocima?" Ako svi tri instance daju score >75, članak ide u context window. Model sada vidi samo one članke koji su prošli triplu validaciju. Kada model generiše odgovor, trebash ga analizirati: svaka čestnica o uzroku bolesti mora biti praćena s indeksom u izvornom tekstu. Ako model kaže "genetske mutacije APOE4 su povezane s Alzheimerom", sustav provjerava: "Postoji li 'APOE4' ili 'ApoE4' u originalnom tekstu?" Ako ne postoji, odgovor se odbacuje, a korisniku se vraća greška: "Nije moguće generirati odgovor s citatima na osnovu dostupnih izvora."
To je ključna razlika od standardnog RAG-a. Većina RAG implementacija će pokušati da "popuni praznine" ili "interpretira" što je model mislio da je rekao. Naš sustav ne čini to. Ako model halucira, to se detektuje i signalizira kao greška, ne kao saznanje. Disciplina dolazi od toga što je model unaprijed obavješten: "Tvoj output će biti validiran protiv izvora. Ako ne možeš citirati izvora, ne pokušaj." To je obučavanje kroz arhitekturu, a ne kroz prompt engineering. Prompt engineering je kao pokušaj da nagovorim pijanog čovjeka da bude trije. Arhitektura je kao što ga ne pustiš u auto.
Drugi konkretni primjer je zahtjev s vremenskim komponentama. Korisnik pita "Kada je prvi put sintetizirana molekula X?" Bez RAG-a, GPT-4 će dati godinu s 40% vjerojatnosti da je točna. Često će biti off by decade. S našim sustavom: query se procesira kao "first synthesis" + "molecule X" + temporal component. BGE-M3 embedding razumije da je "prvi put" vremenska markera. Qdrant filtrira rezultate: trebam samo članke koji imaju eksplicitnu godinu u metadata-i. Reranker ocjenjuje: "Koliko je ovaj članak direktan izvor informacije o prvoj sintezi?" Ne samo relevantan, nego direktan izvor. Model tada vidi samo članke gdje je godina eksplicitno navedena i gdje je članak originalni rad ili primarni izvor koji je citiran. Ako model kaže "1987", sustav provjerava: "Postoji li '1987' ili '1980-iti' u citatnom tekstu?" Ako je u tekstu "1987. godine, Smith i kolegice su prvi put sintetizirali...", to prolazi. Ako je "prema Smith (1987), molekula je poznata od...", to je indirectna referenca, i sustav će je odbaciti kao nedovoljno preciznu.
Hallucination u LLM-ima ima nekoliko slojeva. Prvi sloj je token-level hallucination: model generiše token koji je statistički vjerovatna nastavka, ali nije faktički točan. Drugi sloj je semantic hallucination: odgovor je gramatički točan i semantički koherentan, ali je faktički netočan. Treći sloj je citation hallucination: model navodi izvor koji ne postoji ili koji ne podržava tvrdnju. Većina RAG rješenja pokušava da riješi treći sloj kroz prompt engineering ("Uvijek citiraj svoje izvore"). To je beskorisno. Model će citirati izvore koji ne postoje s istom frekvencijom, jer je halucination ugrađen u same težine. Naš pristup je da riješimo sva tri sloja arhitekturom. Token-level hallucination se smanjuje ograničavanjem output tokena na vocabulary koji je prisutan u citatnom materijalu. Semantic hallucination se smanjuje kroz reranker validation. Citation hallucination se rješava kroz post-generation validation gdje je svaki citat provjeran protiv izvora.
Infrastrukturno, tri reranker instance znače redundancu. Ako je jedna instance u lošem stanju (high latency, outdated weights, memory leak), ostale dvije mogu biti u dobrom stanju. Sustav čeka voting većinu. To znači da je single point of failure eliminiran na razini validacije. Ako sve tri instance padnu, sustav vraća grešku koristniku umjesto da halucira. To je disciplina koja je suprotna industriji. Većina sistema će pokušati da "nastavi" s degradiranom kvalitetom. Mi ćemo se zaustaviti.
Qdrant kao vektorska baza omogućava i nešto što je manje vidljivo, ali kritično: audit trail. Svaki query koji je izvršen, svaki dokument koji je retrieval-an, svaki reranker score koji je generiran – sve to se logira. Ako korisnik kaže "Zašto ste mi dali taj odgovor?", možeš reproducirati točan proces: "Evo top 20 dokumenata iz vektorske baze, evo kako su reranker-i ocjenili svaki, evo kako je model generiše odgovor, evo gdje je validacija prošla ili pala." To je fundamentalno različito
Ako te zanima ovakva arhitektura ili gradiš nešto slično za svoju instituciju — javi se preko rinet.one.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari