Skip to content

Cum să folosești o bază vectorială

DodaTech Updated 2025-01-15 2 min read

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

  1. Nu normalizezi embeddings — FAISS cosine similarity necesită vectori normalizați
  2. Folosești IndexFlatL2 pentru milioane de vectori — e O(N). Folosește IndexIVFFlat pentru aproximare
  3. Nu ștergi indexul vechi — Chroma păstrează datele între sesiuni
  4. Ignori dimensiunea embedding-urilor — FAISS cere aceeași dimensiune la query
  5. Nu filtrezi cu metadate — cauți în toate documentele când ai putea restrânge

Întrebări Frecvente

### Când să folosesc Chroma vs FAISS vs Pinecone?

Chroma: prototipuri, local, date < 1M. FAISS: producție locală, milioane de vectori, cea mai rapidă. Pinecone: cloud, scalabil, zero administrare.

Ce este un index vectorial?

Un index vectorial e o structură de date care organizează embeddings pentru căutare rapidă după similaritate, folosind tehnici ca IVF (Inverted File) sau HNSW (Hierarchical Navigable Small World).

Cum aleg distanța potrivită?

Cosine similarity pentru text și embeddings normalizați. L2 (euclidiană) pentru date numerice. Dot product pentru embeddings normalizați deja.

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