Referință BO directă
Dacă întrebarea conține ceva de forma BO2025_1011, se deschide exact decizia aceea și toate criticile ei. Fără căutare semantică.
Arhitectură internă · 15 august 2026
O singură clasă centrală, patru surse în baza de date, și tool-uri care fie o apelează, fie își fac căutarea pe cont propriu.
Corpusul stă în PostgreSQL cu pgvector. RAG-ul nu „știe” tot ce e în platformă — caută în patru tabele cu embeddings Gemini, 2000 de dimensiuni, index HNSW.
Nu există un agent autonom. „Agentul Achizia” este Asistentul — endpoint-ul de chat care apelează RAGService ca pe o bibliotecă. Nu alege singur între Memo, Red Flags sau Clarificări. Nu există tool-calling.
Chunk-ul din corpus nu e o fereastră din textul deciziei CNSC. E analiza LLM pe o singură critică. Textul brut al deciziei nu intră în vector.
Nu se taie text_integral în ferestre de N caractere. Textul brut mai apare doar la fallback (articol de lege, keyword ILIKE) — nu pe calea principală.
LLM-ul din analysis.py rupe decizia pe critici și umple argumentare_critica. Aia e unitatea de căutare.
Alt chunking, mai jos. „Documente lungi” taie documentul utilizatorului (paragrafe de ~1.500 de caractere). Cu acele bucăți se caută tot în analiza pe critică, nu în textul deciziei.
search_decisions încearcă strategiile în ordine și se oprește la primul succes. Apoi prepare_context adaugă lege, spețe și instanțe — totul pe aceeași conexiune, pe rând (asyncpg nu permite query-uri paralele).
trece mai departeverde = s-a găsit, se oprește
Dacă întrebarea conține ceva de forma BO2025_1011, se deschide exact decizia aceea și toate criticile ei. Fără căutare semantică.
„art. 57 din Legea 98/2016” → fragmentele legislative + deciziile CNSC care le aplică.
Întrebarea e transformată într-un vector Gemini (tăiată la 4.000 de caractere). Opțional: reformulare prin LLM, căutare trigram + fuziune RRF, reranking. Rerankingul pe model rapid durează ~3 secunde, nu 33.
Dacă vectorul n-a găsit nimic, se potrivește întrebarea cu nomenclatorul CPV și se aduc decizii din același domeniu.
Ultima plasă: căutare ILIKE pe text. Folosită rar, când restul e gol.
| Pas | Sursă | Cât |
|---|---|---|
| 1 | legislatie_fragmente | 5 fragmente |
| 2 | spete_anap | 3 spețe |
| 3 | jurisprudenta_instante | 3 decizii de instanță |
| 4 | argumentare_critica → decizii CNSC | max 5 decizii / 20 chunk-uri |
| + | statistici de corpus | doar la întrebări de inventar („câte decizii aveți?”) |
Din astea se construiesc: blocuri de context etichetate după forța juridică (lege, instrucțiune, îndrumare, sinteză ANAP, abrogat), un system prompt dinamic, citații în ordinea lege → instanțe → ANAP → CNSC (UI-ul arată doar primele N) și un scor de încredere. Generarea: temperatură 0,1, până la 12.288 de tokeni. Persona din prompt este tăiată din răspuns.
Patru module trec prin RAGService. Alte cinci își fac embeddings și caută singure — aceeași bază de date, alt drum.
Același motor, același system prompt, aceleași citații.
Nu trec prin RAGService. Iau vectorul și interoghează tabelele lor.
Aici se taie documentul utilizatorului, nu decizia CNSC. Când întrebarea e un fișier, un singur embedding pierde detalii. Asistentul, Memo Juridic și Drafterul taie textul și caută — tot în analiza pe critică.
Toate documentele într-un singur text.
Paragrafe peste 100 de caractere, grupate în bucăți de ~1.500.
Embedding + vector search pe fiecare bucată, pe rând.
Păstrează cea mai bună distanță pentru fiecare critică.
Maximum 15 decizii și 8 fragmente de lege.
Decizia se importă, se parsează, apoi LLM-ul extrage criticile. Abia acele critici primesc vector. Pipeline-ul scrie în Postgres; fișierele sursă stau în GCS.
Dacă dimensiunea coloanei nu e 2000, serviciul o recreează singur.
Observații din citirea codului, nu un plan de execuție.
Dacă ar trebui să aleagă el între Memo, Red Flags și Clarificări, e un feature nou. Acum fiecare instrument e un endpoint separat, cu pipeline-ul lui.
Strategy, Compliance, Red Flags și Clarificări duplică praguri și logică de retrieval. Dacă apar diferențe de calitate între ele, primul candidat e un API comun de căutare.
Era oprit din cauza latenței. Pe model rapid a scăzut de la 33s la 3s. Expandarea rămâne opt-in.
jurisprudenta_instante are prioritate în citare și în prompt, dar doar 3 rezultate și acoperire slabă. Forța juridică e mare, corpusul nu.