LlamaIndex are integrări cu zeci de baze vectoriale; tabelul din documentație arată pentru fiecare dacă suportă filtrare pe metadate, căutare hibridă, ștergere, stocarea textului și async. Tiparul e același: creezi clientul bazei (chromadb, qdrant_client), îl împachetezi în clasa VectorStore din pachetul de integrare (llama-index-vector-stores-chroma, llama-index-vector-stores-qdrant) și îl dai indexului printr-un StorageContext.
Documentația notează că multe baze vectoriale (FAISS e excepția) stochează și datele, și embedding-urile. Atunci nu ai nevoie de docstore sau index store separat și nici de persist(): datele se scriu în bază pe măsură ce se inserează. Pentru o bază deja populată te conectezi cu VectorStoreIndex.from_vector_store(vector_store, embed_model=...), fără reindexare.
Pentru că textul stă în baza vectorială, docstore-ul indexului rămâne gol în acest caz (decât dacă dai store_nodes_override=True sau un docstore propriu). Contează pentru componentele care citesc din docstore, de exemplu BM25Retriever. Qdrant suportă și căutare hibridă nativă (enable_hybrid=True), iar filtrele pe metadate se aplică în bază, vezi filtrarea pe metadate.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
ChromaVectorStore(chroma_collection=...) |
Adaptorul Chroma; colecția vine din PersistentClient, EphemeralClient sau HttpClient. |
QdrantVectorStore(client=..., collection_name=...) |
Adaptorul Qdrant; clientul poate fi local (path=, location=":memory:") sau un server (url=, host=/port=). |
enable_hybrid / fastembed_sparse_model |
La Qdrant: activează vectorii sparse pentru căutare hibridă, de exemplu cu "Qdrant/bm25". Se setează de la crearea colecției. |
StorageContext.from_defaults(vector_store=...) |
Leagă baza vectorială de index la construire. |
VectorStoreIndex.from_vector_store(...) |
Index peste o bază deja populată. |
store_nodes_override |
Salvează nodurile și în docstore-ul indexului. |
Exemple practice și scenarii reale
Exemplul 1: Reconectare la o colecție Chroma existentă
După exemplul Chroma din documentație; modelul de embedding trebuie să fie același cu cel de la indexare.
import chromadb
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.chroma import ChromaVectorStore
db = chromadb.PersistentClient(path="./chroma_db")
colectie = db.get_or_create_collection("documente_companie")
vector_store = ChromaVectorStore(chroma_collection=colectie)
index = VectorStoreIndex.from_vector_store(vector_store, embed_model=embed_model)
Exemplul 2: Qdrant local, cu căutare hibridă
import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(path="./qdrant_data")
vector_store = QdrantVectorStore(
client=client, collection_name="docs",
enable_hybrid=True, fastembed_sparse_model="Qdrant/bm25",
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
qe = index.as_query_engine(similarity_top_k=2, sparse_top_k=12, vector_store_query_mode="hybrid")
Greșeli frecvente și capcane
- Să apelezi
from_documents()la fiecare pornire peste aceeași colecție. Documentele se inserează din nou; pentru o bază populată foloseștifrom_vector_store(). - Să schimbi modelul de embedding pentru o colecție existentă. Vectorii vechi și cei noi nu sunt comparabili.
- Să construiești un
BM25Retrieverdinindex.docstorecând textul stă în Chroma sau Qdrant. Docstore-ul e gol; dă-i nodurile sau un docstore propriu.