Cum să folosești o bază vectorială
In this tutorial, you'll learn how to use vector databases like Chroma, Pinecone, and FAISS to store and search embeddings at scale for semantic search, RAG, and recommendation systems.
Problema
Când ai mii sau milioane de documente, a calcula similaritatea între întrebare și fiecare document devine imposibil — e lent și consumă prea multă memorie. O bază vectorială indexează embeddings-urile și găsește cei mai apropiați vecini în milisecunde.
Soluția Greșită
import numpy as np
from sentence_transformers import SentenceTransformer
documente = ["doc1", "doc2", ..., "doc100000"] # 100k documente
model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode(documente)
# Cautare liniara — O(N) — extrem de lenta la sute de mii de documente
def cauta_liniar(intrebare, embeddings, k=5):
emb_q = model.encode([intrebare])
similaritati = np.dot(embeddings, emb_q.T).flatten()
return np.argsort(similaritati)[-k:][::-1]
Problema: Pentru 100.000 de documente, fiecare căutare durează sute de milisecunde. La 1 milion, e imposibil în timp real.
Soluția Corectă (Chroma)
import chromadb
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
client = chromadb.Client()
colectie = client.create_collection(name="documente")
documente = [
"Cum instalez Python pe Linux",
"Ghid de instalare aplicatie",
"Erori de compilare in C++]
]
embeddings = model.encode(documente).tolist()
colectie.add(
embeddings=embeddings,
documents=documente,
ids=["doc1", "doc2", "doc3"]
)
rezultate = colectie.query(
query_embeddings=model.encode(["eroare compilare"]).tolist(),
n_results=2
)
print(rezultate["documents"])
Output:
[['Erori de compilare in C++', 'Cum instalez Python pe Linux']]
Implementare Pas cu Pas
1. Chroma — local și simplu
import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
colectie = client.get_or_create_collection("articole")
colectie.add(
embeddings=embeddings,
documents=texte,
metadatas=[{"categorie": cat} for cat in categorii],
ids=[str(i) for i in range(len(texte))]
)
2. FAISS — ultra-rapid pentru milioane de vectori
import faiss
import numpy as np
dimensiune = 384 # dimensiunea embedding-urilor
index = faiss.IndexFlatL2(dimensiune) # L2 distance
index.add(np.array(embeddings).astype("float32"))
D, I = index.search(np.array([query_emb]), k=5) # D = distante, I = indici
print(f"Cei mai apropiati indici: {I}")
3. Pinecone — managed cloud
import pinecone
pinecone.init(api_key="pc-sk-...", environment="us-west1-gcp")
index = pinecone.Index("documente")
index.upsert([(str(i), emb) for i, emb in enumerate(embeddings)])
rezultate = index.query(query_emb, top_k=5, include_metadata=True)
print(rezultate["matches"])
Sfaturi pentru Prevenire
- Chroma e ideal pentru prototipuri și proiecte mici-mijlocii
- FAISS e cea mai rapidă opțiune locală pentru milioane de vectori
- Pinecone e potrivit pentru producție cloud, fără grija infrastructurii
- Adaugă metadate (categorie, data) pentru filtrare înainte de căutare
- Testează latenta: Chroma < 10ms, FAISS < 1ms, Pinecone < 20ms
Greșeli Comune
- Nu normalizezi embeddings — FAISS cosine similarity necesită vectori normalizați
- Folosești IndexFlatL2 pentru milioane de vectori — e O(N). Folosește IndexIVFFlat pentru aproximare
- Nu ștergi indexul vechi — Chroma păstrează datele între sesiuni
- Ignori dimensiunea embedding-urilor — FAISS cere aceeași dimensiune la query
- Nu filtrezi cu metadate — cauți în toate documentele când ai putea restrânge
Întrebări Frecvente
Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. DodaTech tools integrate seamlessly with vector databases for enhanced productivity and security.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro