Majoritatea demo-urilor de RAG optimizează lucrul greșit. Forțează modelul să răspundă. Partea grea când duci retrieval-augmented generation într-un produs în care oamenii au încredere nu e să scoți un răspuns — e să știi când să nu dai unul. Un AI care inventează cu aplomb un tipar în datele tale personale, sau care fabrică un verset biblic, sau care punctează un lead pe baza unor dovezi pe care nu le-a citit niciodată, face mai mult rău decât unul care spune „nu am pe ce să mă bazez".
Acesta e un articol despre un pattern, nu o prezentare de produs. Construiesc multe produse AI ca solo founder, iar în trei dintre ele — Anima, Studiază Biblia și Lead Compass — am ajuns la aceeași coloană vertebrală pentru un RAG de încredere: fuzionezi bine retrieval-ul, pui un gate pe output, lași sistemul să se abțină și intercepți input-urile periculoase înainte să atingă modelul. Iată pattern-ul, cu implementările reale drept dovadă.
De ce abținerea e funcționalitatea
Reflexul în majoritatea pipeline-urilor de RAG e „retrieve, îndeși contextul, generează". Eșecul e tăcut: când retrieval-ul vine subțire sau pe lângă subiect, modelul umple golul cu ceva fluent și greșit. Fluența e problema. O halucinație sigură pe ea arată exact ca un răspuns corect.
Abținerea inversează default-ul. În loc să răspundă mereu, sistemul trebuie să câștige dreptul de a răspunde, trecând un prag de grounding. Dacă nu poate, nu returnează nimic, sau un sincer „încă nu e destul semnal". În Anima — un AI care raționează peste task-urile, stările, obiceiurile și obiectivele tale — asta contează pentru că miza e personală. Un AI care inventează ceva despre propria ta viață distruge încrederea mai repede decât unul care recunoaște o lipsă. Așa că Anima tratează abținerea ca funcționalitate, nu ca plasă de siguranță. Fiecare insight generat trebuie să treacă printr-un gate înainte să ajungă la tine; dacă modelul nu poate fundamenta destul de bine o afirmație, gate-ul o blochează, iar sistemul nu afișează nimic în loc să inventeze un tipar care nu există.
Acea singură decizie — mai degrabă să spună „nu știu" — reașază totul în aval. Calitatea retrieval-ului încetează să mai fie un moft și devine exact lucrul care decide dacă apuci să vorbești.
Fuziune de retrieval: lexical plus semantic
Vector search singur nu e de ajuns, și nici căutarea pe cuvinte-cheie. Embeddings-urile sunt bune la „asta înseamnă cam același lucru" și slabe la termenii exacți — nume, ID-uri, cuvinte rare, fraza literală pe care a tastat-o utilizatorul. BM25 (ranking lexical clasic) e opusul. Așa că pattern-ul e să le rulezi pe ambele și să le fuzionezi.
Stratul de retrieval al Anima e ceea ce numesc RAG v2: BM25 pentru potrivire lexicală, vector search pentru similaritate semantică, cele două seturi de rezultate combinate cu Reciprocal Rank Fusion (RRF), apoi un pas de rerank, apoi citare. RRF e lipiciul lipsit de glamour aici — îmbină două liste ordonate fără să ceară ca scorurile să fie pe aceeași scară, punctând fiecare document după poziția lui în fiecare listă. Un document plăcut de ambele sisteme de retrieval urcă în top; unul plăcut doar de indexul vectorial tot are o șansă corectă. Pasul de rerank ia apoi acel shortlist fuzionat și îl re-punctează cu un model care chiar citește împreună interogarea și candidatul — prea scump de rulat pe tot corpusul, dar ieftin pe un shortlist de, să zicem, primele 20.
Ordinea e intenționată: arunci o plasă largă și ieftină (BM25 + vector), o fuzionezi (RRF), apoi cheltui judecata scumpă (rerank) doar pe ce a supraviețuit. Când asamblezi prompt-ul, lucrezi cu câteva pasaje de încredere ridicată, nu cu un zid de text „poate relevant".
Studiază Biblia adaugă un detaliu care merită menționat: companionul Parakletos rulează RAG nu doar peste un magazin de documente (conținut Wagtail), ci peste un knowledge graph în Neo4j. Scriptura e dens referențiată încrucișat — versete trimit la versete, teme se leagă peste cărți. Un graf surprinde acele relații cum nu o pot face chunk-urile plate, așa că retrieval-ul poate urma o muchie de referință în loc să spere că două pasaje înrudite s-au întâmplat să fie aproape în spațiul de embedding. Corpus diferit, același principiu: rezolvă retrieval-ul înainte să ceri modelului să raționeze.
Eval gate: judeci răspunsul înainte ca utilizatorul să-l vadă
Un retrieval bun reduce halucinațiile. Nu le elimină. Modelul tot poate exagera pe context subțire. Așa că a doua piesă a pattern-ului e un eval gate care stă între generare și utilizator.
În Anima asta e o componentă propriu-zisă — EvalGate. Fiecare insight generat trece prin el înainte de livrare. Treaba gate-ului e să întrebe: e afirmația asta chiar fundamentată în contextul recuperat, sau a brodat modelul? Dacă fundamentarea e prea slabă, gate-ul blochează output-ul. Asta face abținerea reală, nu aspirațională. Fără gate, „sistemul ar trebui să refuze când nu e sigur" e doar o speranță. Cu el, refuzul e o ramură de cod care rulează la fiecare răspuns.
Modelul mental pe care îl folosesc: generarea e candidatul, eval gate-ul e judecătorul, iar utilizatorul vede doar ce trece. Judecătorul poate verifica mai multe lucruri — e fiecare afirmație atribuibilă unui pasaj recuperat, rămâne răspunsul în scopul recuperat, e încrederea peste prag — iar orice eșec rutează spre abținere, nu spre livrare. E același reflex ca regula mai largă a Anima, „fără metrici false, fără tipare inventate", impusă în cod: un AI care își umple răspunsurile cu umplutură care sună plauzibil e propriul lui fel de slop, iar gate-ul e locul unde îl prinzi.
Citări: grounding pe care îl poți audita
Abținerea răspunde la „ar trebui să vorbesc?". Citările răspund la „poți verifica ce am spus?". Atât Anima cât și Studiază Biblia poartă citarea prin pipeline, astfel încât fiecare afirmație trimite înapoi la pasajul din care a venit.
Asta face două lucruri. Pentru utilizator, transformă un răspuns de tip cutie neagră în ceva verificabil — într-un context de studiu biblic mai ales, „uite versetul și comentariul din care vine asta" nu e opțional, e tot rostul. Pentru sistem, citările sunt ceea ce inspectează eval gate-ul: dacă o propoziție nu are niciun pasaj recuperat în spate, exact aceea e afirmația nesusținută pe care gate-ul ar trebui să o blocheze. Citările și abținerea sunt cele două capete ale aceluiași fir. Nu poți pune un gate de încredere pe grounding dacă nu ai urmărit grounding-ul de la bun început.
Interceptează înainte de model: guard-ul de siguranță
Există o categorie de input-uri pe care nu trebuie deloc să le predai unui LLM, oricât de bun ar fi retrieval-ul și gate-ul tău. Cel mai clar exemplu pe care l-am construit e în Studiază Biblia.
Parakletos include un guard de detecție a crizelor pastorale: un interceptor bazat pe cuvinte-cheie care rulează înainte de orice apel la LLM. Dacă detectează semnale de auto-vătămare, scurtcircuitează întreg pipeline-ul de RAG și returnează direct informații de linie telefonică de urgență — fără invocarea modelului, fără retrieval, fără generare. E o alegere de design deliberată, motivată etic, și e opusul reflexului obișnuit „lasă modelul deștept să se ocupe de tot".
Principiul se generalizează: unele decizii sunt prea importante ca să le delegi unui sistem probabilistic. Un răspuns la o criză nu ar trebui să depindă de dacă retrieval-ul a găsit pasajul corect sau de cât de bine a formulat modelul. Pentru un semnal cunoscut și cu miză mare, o regulă deterministă care se declanșează înainte de LLM e mai de încredere decât un prompt iscusit, tocmai pentru că nu poate fi convinsă să renunțe. Pune guard-ul la ușa din față. Mai ieftin, mai rapid, și nu-și poate halucina drumul în jurul unei granițe de siguranță.
Când „răspunsul" e un scor, nu o frază
Pattern-ul nu e doar pentru chat. Lead Compass — un instrument care descoperă, auditează și punctează lead-uri pentru agenții — rulează straturi de analiză AI (un strat de analiză Agent Zero în spatele unui gateway multi-provider OpenClaw) peste un audit de website cu 15 puncte care trage semnale reale externe: Google CrUX, Qualys SSL Labs, Mozilla Observatory, Green Web Foundation. Acea alegere de grounding e aceeași disciplină într-o altă formă. AI-ul punctează lead-urile pe fapte măsurate de API-uri terțe reale, nu pe impresii pe care le-a generat despre un site citit pe jumătate. Aceeași lecție: încrederea în output e fixată de calitatea și autenticitatea a ceea ce ai recuperat înainte să ruleze modelul.
Pattern-ul, într-un singur loc
Redus la os, un RAG de încredere arată așa:
- Fuzionează retrieval-ul — lexical (BM25) plus semantic (vector), combinate cu RRF, apoi rerank pe un shortlist. Folosește un graf dacă datele tale sunt relaționale.
- Poartă citările prin tot pipeline-ul, ca fiecare afirmație să fie atribuibilă.
- Pune un gate pe output — un eval gate verifică grounding-ul înainte ca utilizatorul să vadă ceva.
- Abține-te by default — dacă grounding-ul nu trece gate-ul, returnezi nimic sau un sincer „nu e destul semnal", niciodată o fabricație.
- Interceptează input-urile periculoase înainte de model — guard-uri deterministe pentru semnale cu miză mare, înaintea oricărui apel la LLM.
Niciunul din astea nu e exotic. Ce e neobișnuit e să tratezi „refuză să răspunzi" ca pe un rezultat de prim rang, nu ca pe o stare de eroare. Produsele care câștigă încrederea sunt cele în care tăcerea AI-ului e la fel de bine inginerită ca vorbirea lui.
Acest pattern e coloana vertebrală comună a mai multor lucruri pe care le construiesc — vezi cum se desfășoară în RAG-ul peste date personale al Anima, în companionul Parakletos al Studiază Biblia și în scoringul fundamentat pe audit al Lead Compass. Totul face parte din cele 11 produse pe care le construiesc ca solo founder. Dacă vrei postmortem-urile despre ce rezistă în producție, abonează-te la newsletter.