Una dintre cele mai comune erori în sistemele RAG este ‘poluarea temporală’: utilizatorul întreabă ‘Care au fost vânzările în T3 2024?’, iar motorul vectorial returnează fragmente din 2022 sau 2023 doar pentru că termenii ‘vânzări’ și ‘T3’ sunt identici semantic.
Auto-Retrieval rezolvă această problemă printr-o etapă inteligentă de pre-procesare: un model LLM compact analizează întrebarea și descrierea metadatelor disponibile în baza vectorială. Modelul extrage filtre structurate (de exemplu: an == 2024 AND trimestru == 'T3') și separă termenii semantici de căutare.
Interogarea este transmisă bazei vectoriale cu filtrele SQL/Metadata aplicate strict la nivel hardware, căutarea semantică de similitudine având loc exclusiv peste documentele care respectă constrângerile temporale sau departamentale cerute.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
VectorIndexAutoRetriever |
Modulul ce orchestrează extragerea de filtre din promptul utilizatorului. |
MetadataInfo |
Definiția fiecărui atribut disponibil (nume, tip de date și descriere pentru LLM). |
Filter Conditionals |
Operatori logici generați automat: `==`, `!=`, `>`, `<`, `AND`, `OR`, `IN`. |
Pre-filtering vs Post-filtering |
Aplicarea filtrelor înainte de calculul distanței vectoriale pentru acuratețe 100%. |
Exemple practice și configurații
Exemplul 1: Configurarea Auto-Retriever pentru filtrarea pe departament și an
Cum se descriu atributele pentru ca LLM-ul să genereze filtre corecte.
from llama_index.core.retrievers import VectorIndexAutoRetriever
from llama_index.core.vector_stores.types import MetadataInfo, VectorStoreInfo
info_metadate = VectorStoreInfo(
content_info="Rapoarte financiare și contracte de achiziții",
metadata_info=[
MetadataInfo(name="an", type="integer", description="Anul fiscal al raportului (ex: 2023, 2024)"),
MetadataInfo(name="departament", type="string", description="Departamentul: 'IT', 'Marketing', 'Legal'")
]
)
retriever = VectorIndexAutoRetriever(index, vector_store_info=info_metadate)
# La întrebarea: "Cât s-a cheltuit pe licențe IT în 2024?"
# Auto-Retriever generează automat filtrul: (departament == 'IT' AND an == 2024)
fragmente = retriever.retrieve("Cât s-a cheltuit pe licențe IT în 2024?")
Rezultat & Impact
Excluderea matematică a oricărui document irelevant din alți ani sau alte departamente.
Greșeli frecvente și bune practici
- Descrierea vagă a metadatelor în `MetadataInfo`, ceea ce face ca LLM-ul să nu știe ce format de dată sau valori permise să genereze.
- Folosirea auto-retrieval peste baze vectoriale care nu suportă nativ filtrarea indexată pe metadate, rezultând în scanări lente pe disc.