Anti-halucinare juridic: chatbot pe 2,8 milioane de documente RO
Cum am eliminat halucinațiile dintr-un chatbot juridic românesc cu un pipeline de citation grounding pe 2,8 milioane de documente legislative.
Cum scoatem halucinațiile dintr-un chatbot juridic pe 2,8 milioane de documente românești
Un avocat ne-a trimis un screenshot anul trecut: un chatbot juridic generic îl asigura, cu citare cu tot, că articolul 187 alineatul (3) din Codul fiscal îi permite o deducere pe care o solicita un client. Articolul nu există. Alineatul, cu atât mai puțin. Citarea era fabricată cu o încredere care a făcut clientul să creadă că dreptul îl protejează — până la prima notificare ANAF.
Acel screenshot a fost punctul de pornire pentru pipeline-ul Anti-Halucinare pe care l-am construit pentru Leta, asistentul juridic al CAI Technology pentru piața românească. În acest articol explicăm cum un chatbot juridic ajunge să mintă cu siguranță și de ce soluția nu este un model mai mare, ci o arhitectură care refuză să răspundă fără sursă.
TL;DR
- Halucinațiile juridice au o cauză precisă: modelele lingvistice generative completează tipare statistice, iar formatul „articol X alineat Y” este unul dintre cele mai previzibile tipare din corpus.
- Un model mai mare nu rezolvă problema; o reduce, dar și o ascunde mai bine. Singura soluție robustă este citation grounding obligatoriu.
- Pe Leta am implementat un pipeline cu patru porți de validare care refuză să răspundă dacă nu poate atașa un fragment textual identic dintr-un document oficial indexat.
- Pe un eșantion de 1.200 de întrebări juridice reale, rata de halucinare a coborât de la 14,2% (răspuns generic GPT) la sub 0,3% (Leta cu pipeline).
- Costul: timpul mediu de răspuns crește cu aproximativ 40%, iar acoperirea (rate of „pot răspunde”) scade cu 9 puncte. Compromisul este negociabil cu clientul; halucinarea nu este.
De ce halucinează chatboții juridici
Un model de limbaj nu „știe” articole de lege. Reproduce, statistic, ce tipar se potrivește cel mai bine cu întrebarea. În drept, formatul Codul X, articolul Y, alineatul Z apare de zeci de mii de ori în corpus. Modelul învață că acest format urmează adesea o întrebare juridică. Dacă întrebarea nu are un răspuns clar în datele de antrenament, modelul completează cu cea mai plauzibilă combinație numerică — nu cu adevărul.
Aceasta nu este o eroare de implementare. Este comportamentul corect al unui model auto-regresiv, aplicat pe o sarcină pentru care nu a fost construit. Modelul nu minte; nu are cum să distingă între a reproduce un fapt și a fabrica unul, pentru că, la nivelul tokens-urilor, sunt aceeași operațiune.
Concret, am rulat aceeași listă de 1.200 de întrebări reale colectate de la clienți avocați, prin trei configurații:
- Model generativ generic, fără context: 14,2% răspunsuri cu citare fabricată
- Model generativ + RAG simplu (top-5 documente, no grounding): 4,8% halucinare
- Leta pipeline complet: 0,28% halucinare, validată manual de un avocat senior
Diferența între RAG simplu și pipeline-ul nostru nu este o îmbunătățire incrementală. Este diferența între un sistem care încearcă să răspundă corect și unul care refuză să răspundă greșit.
Arhitectura: patru porți între întrebare și răspuns
Pipeline-ul Anti-Halucinare are patru componente care funcționează ca o pâlnie. O întrebare nu trece la următoarea poartă dacă nu îndeplinește condiția curentă.
Poarta 1 — Clasificare de scop
Înainte de a căuta în corpus, întrebarea este analizată de un clasificator antrenat pe tipuri de cereri juridice românești. Dacă întrebarea este în afara scopului (de exemplu „ce vreme va fi mâine în Cluj?”), pipeline-ul răspunde direct: „Această întrebare este în afara expertizei mele juridice.” Niciun token de răspuns substantiv nu este generat fără sursă.
Poarta 2 — Recuperare hibridă
Corpusul Leta conține peste 2,8 milioane de documente: legislație consolidată, jurisprudență ÎCCJ, decizii ale curților de apel, soluții fiscale ANAF, ghiduri ANRMAP. Recuperarea folosește două metode în paralel:
- căutare vectorială pe embeddings dense, fine-tuned pe corpus juridic românesc;
- căutare lexicală BM25 cu tokenizare specifică pentru forme flexionare românești (substantive declinate, verbe conjugate, diacritice).
Rezultatele sunt fuzionate cu reciprocal rank fusion și se păstrează top-20 fragmente. Această dublă căutare este esențială pentru limba română: căutarea vectorială prinde sinonime și parafraze („concediere” vs. „desfacerea contractului”), iar BM25 prinde formele exacte ale articolelor de lege, unde sinonimele nu sunt admise.
Poarta 3 — Grounding obligatoriu
Aici se sparg majoritatea halucinațiilor. Modelul generativ primește întrebarea și fragmentele recuperate, cu instrucțiunea explicită: orice afirmație factuală trebuie să fie marcată cu un identificator de fragment. Răspunsul este apoi parsat și fiecare claim este validat:
pentru fiecare afirmație din răspuns:
dacă conține referință legală (articol, alineat, hotărâre, decizie):
extrage textul fragmentului citat
caută textul exact în documentul sursă
dacă nu se găsește potrivire ≥ 95% similaritate text:
marchează afirmația ca neacoperită
dacă există afirmații neacoperite:
respinge răspunsul, regenerează cu prompt mai strict
după 3 încercări eșuate: răspunde „nu am o sursă suficientă pentru a răspunde"
Validarea este textuală, nu semantică. Verifică dacă textul citat există efectiv în documentul indicat. Această decizie este deliberată: o validare semantică ar permite modelului să „interpreteze” sursa, ceea ce este exact comportamentul pe care vrem să-l blocăm.
Poarta 4 — Verificare de coerență
Ultima poartă verifică dacă afirmațiile interne ale răspunsului nu se contrazic. Folosim un al doilea model, mai mic, antrenat să detecteze contradicții între perechi de propoziții. Dacă răspunsul afirmă „X este permis” într-un paragraf și „X nu este permis” în altul, este returnat cu eroare și regenerat.
Ce am învățat construind asta
Pe parcursul a două generații de pipeline am eliminat ipoteze pe care le-am crezut adevărate la început.
Modelele mai mari nu sunt soluția. Am testat versiuni open-source la diverse scale, fine-tuned pe corpus juridic românesc. Modelele mai mari halucinează mai puțin într-adevăr, dar halucinează mai convingător. Un avocat detectează ușor o citare greșită grosolană; o citare fabricată cu numerotare plauzibilă, sintaxă corectă și ton academic este aproape imposibil de distins de una reală. Mărimea modelului mută riscul de la „eroare evidentă” la „eroare ascunsă”. Asta este mai rău, nu mai bine.
Recuperarea pură nu este suficientă. Un sistem RAG fără grounding obligatoriu reduce halucinațiile, dar nu le elimină. Dacă fragmentul recuperat tratează un caz similar dar nu identic, modelul va „extrapola” cu încredere. Singura barieră fiabilă este să forțezi modelul să citeze textual și apoi să verifici că textul citat este în sursă.
Tokenizarea contează enorm pentru limba română. Multe modele tokenizează cuvintele românești foarte fragmentat, ceea ce strică similaritatea cosinus pe embeddings. Un fine-tune pe corpus juridic românesc, cu tokenizator dedicat, a îmbunătățit recall-ul căutării vectoriale cu peste 20 de procente. Citatele cu diacritice corecte trebuie să se potrivească exact cu cele din corpus; orice normalizare lossy (transformare la ASCII) introduce erori.
Refuzul este un feature. La început am încercat să maximizăm acoperirea — vrem ca Leta să răspundă la cât mai multe întrebări. După șase luni am inversat: vrem ca Leta să răspundă numai când răspunsul este verificabil. Un avocat preferă „nu am o sursă suficientă” cu o sugestie să consulte direct legislația, în locul unei citări fabricate. „Nu știu” este un răspuns juridic valid; ficțiunea cu aer de certitudine nu este.
Compromisuri reale
Acest pipeline nu este gratuit:
- Latență. Validarea de grounding și regenerarea în caz de eșec adaugă, în medie, aproximativ 40% timp suplimentar pe răspuns. Pentru un asistent care răspunde în 4 secunde fără grounding, ajungem la 5,5–6 secunde cu pipeline complet.
- Acoperire. Aproximativ 9 din 100 de întrebări care primeau răspuns generic primesc acum „nu am o sursă suficientă”. Pentru o platformă publică ar fi un dezastru de UX. Pentru un asistent juridic profesional, este profilul corect: avocații preferă claritate asupra incertitudinii.
- Cost computațional. Pipeline-ul rulează două căutări paralele, un model generativ, un parser de citări, un validator textual, un model de coerență. Costul per răspuns este de aproximativ 3–4 ori mai mare decât un GPT generic. Pentru clienți enterprise care înțeleg costul unei halucinări juridice, este o tranzacție acceptabilă.
Ce înseamnă asta pentru un avocat care evaluează un asistent AI
Trei întrebări care, după experiența noastră, separă instrumentele utilizabile profesional de cele care arată bine la demo:
-
„Pot vedea sursa pentru fiecare afirmație?” Dacă răspunsul nu poate fi marcat fragment cu fragment cu un document oficial, nu este utilizabil profesional. Citările simulate la sfârșit de paragraf nu sunt suficiente — pot fi fabricate.
-
„Ce face când nu știe?” Un asistent care răspunde mereu cu siguranță la orice este un risc. Cereți să vedeți comportamentul pe întrebări tendențioase sau pe legislație recentă pe care nu o poate avea în corpus.
-
„Cum gestionați actualizarea corpusului?” Legislația românească se modifică săptămânal. Un corpus indexat acum șase luni va greși pe modificări recente. Procedura de re-indexare și de retragere a documentelor abrogate este un indicator de maturitate operațională.
Concluzie operațională
Construirea unui asistent juridic românesc fără halucinații este o problemă de inginerie, nu de magie. Soluția nu este un model mai mare sau o tehnică nouă de prompt; este un pipeline conservator care preferă tăcerea în locul ficțiunii. Pentru avocați, jurnaliști de investigație și consultanți fiscali, acest profil este nenegociabil. Pentru o platformă SEO care optimizează engagement, este greșit.
Leta este construită explicit pentru primul tip de utilizator. Dacă acea precizie contează în practica dumneavoastră, vă invităm la o demonstrație tehnică de 30 de minute pe corpusul propriu al firmei — testați direct, cu cazurile reale care v-au făcut probleme cu un chatbot generic.
Articole conexe
- De ce engine-ul de devize HG907 nu folosește deloc LLM
- Pillar Leta — asistentul juridic CAI Technology
- Arhitectura propose-then-act pentru agenți AI în producție
Surse externe
- NIST AI Risk Management Framework, AI RMF 1.0 — secțiunea „Map” pentru clasificarea riscurilor de halucinare
- European Union Agency for Cybersecurity (ENISA), Multilayer Framework for Good Cybersecurity Practices for AI
- Lewis et al., „Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”, arXiv:2005.11401 — fundamentul tehnic al RAG
- Robertson & Zaragoza, „The Probabilistic Relevance Framework: BM25 and Beyond”
Următorul pas
Dacă echipa dumneavoastră evaluează un asistent juridic AI și aveți nevoie de o conversație tehnică despre arhitectură, ne puteți contacta direct pentru o consultație de 30 de minute fără cost.