Filtrare Dinamică pe Metadate (Auto-Retrieval) în LlamaIndex & Data RAG

Filtrare și Recuperare LlamaIndex 0.10+

Transformarea automată a întrebărilor în limbaj natural în filtre exacte pe metadate (ani, categorii, autori) înainte de căutarea vectorială.

Sintaxă & invocare Python
VectorIndexAutoRetriever(index, metadata_info=...)

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.

Ghiduri și noțiuni înrudite