Integrarea cu baze vectoriale (Chroma și Qdrant) în LlamaIndex & Data RAG

Cum conectezi un VectorStoreIndex la o bază vectorială externă (Chroma, Qdrant, Pinecone, Milvus, Postgres și altele) prin clasa VectorStore din pachetul de integrare și StorageContext.

Sintaxă & invocare Python
import chromadb
from llama_index.core import StorageContext, 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)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)

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ști from_vector_store().
  • Să schimbi modelul de embedding pentru o colecție existentă. Vectorii vechi și cei noi nu sunt comparabili.
  • Să construiești un BM25Retriever din index.docstore când textul stă în Chroma sau Qdrant. Docstore-ul e gol; dă-i nodurile sau un docstore propriu.

Noțiuni și module înrudite