Cum să folosești embeddings pentru căutare semantică
In this tutorial, you'll learn how to use embeddings for semantic search — finding documents by meaning rather than exact keyword matches, using OpenAI or sentence-transformers.
Problema
Căutarea clasică după cuvinte cheie ratează documente care folosesc sinonime sau formulări diferite. De exemplu, "cum instalez un program" nu găsește un document intitulat "ghid de instalare aplicație" — deși sensul e același.
Soluția Greșită
import pandas as pd
documente = [
"Cum instalez Python pe Linux",
"Ghid de instalare aplicatie",
"Erori de compilare in C++]
]
cuvant = "instalare"
rezultate = [d for d in documente if cuvant in d.lower()]
print(rezultate)
Problema: Căutarea după substring ratează documentul "Cum instalez Python pe Linux" pentru că "instalare" ≠ "instalez". Sinonimele și variațiile gramaticale nu sunt detectate.
Soluția Corectă
from sentence_transformers import SentenceTransformer
import numpy as np
documente = [
"Cum instalez Python pe Linux",
"Ghid de instalare aplicatie",
"Erori de compilare in C++",
"Tutorial machine learning pentru incepatori]
]
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
embeddings_doc = model.encode(documente)
intrebare = "cum se configureaza un program"
embedding_intrebare = model.encode([intrebare])
similaritati = model.similarity(embedding_intrebare, embeddings_doc)[0]
cele_mai_bune = np.argsort(similaritati, axis=0)[::-1][:2]
for idx in cele_mai_bune:
print(f"{documente[idx]} (scor: {similaritati[idx]:.3f})")
Output:
Cum instalez Python pe Linux (scor: 0.742)
Ghid de instalare aplicatie (scor: 0.681)
Implementare Pas cu Pas
1. Alege un model de embeddings
# Pentru romană / multilingv: "paraphrase-multilingual-MiniLM-L12-v2"
# Pentru engleză: "all-MiniLM-L6-v2" (mai rapid)
# Via OpenAI: text-embedding-3-small
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
2. Indexează documentele
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
documente = ["Text 1", "Text 2", "Text 3"]
embeddings = model.encode(documente, show_progress_bar=True)
# Salvează vectorii
np.save("embeddings.npy", embeddings)
3. Caută semantic
def cauta_semantic(intrebare, documente, embeddings, top_k=3):
emb_intrebare = model.encode([intrebare])
similaritati = model.similarity(emb_intrebare, embeddings)[0]
indici = np.argsort(similaritati, axis=0)[::-1][:top_k]
return [(documente[i], similaritati[i]) for i in indici]
rezultate = cauta_semantic("eroare la compilare", documente, embeddings)
for doc, scor in rezultate:
print(f"{doc} ({scor:.3f})")
Sfaturi pentru Prevenire
- Folosește modele multilingve pentru text în română
- Împarte documentele mari în chunk-uri de max 512 tokeni
- Salvează embeddings în fișiere
.npysau într-o bază vectorială - Combină căutarea semantică cu căutarea clasică (hybrid search) pentru rezultate optime
- Alege modelul în funcție de compromisul dintre viteză și acuratețe
Greșeli Comune
- Nu împarți documentele mari — un document de 10 pagini are un singur embedding, sensul se pierde
- Folosești model doar în engleză pentru text românesc — similaritățile sunt mult mai slabe
- Nu normalizezi vectorii — similaritatea cosine funcționează corect doar pe vectori normalizați
- Cauți după cuvânt exact în embeddings — embeddings nu funcționează așa, folosește similaritate
- Nu testezi calitatea — evaluează manual top-k rezultate pe un set de test
Întrebări Frecvente
Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. DodaTech tools integrate seamlessly with AI APIs for enhanced productivity and security.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro