Skip to content

Cum să folosești embeddings pentru căutare semantică

DodaTech Updated 2025-01-15 2 min read

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 .npy sau î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

  1. Nu împarți documentele mari — un document de 10 pagini are un singur embedding, sensul se pierde
  2. Folosești model doar în engleză pentru text românesc — similaritățile sunt mult mai slabe
  3. Nu normalizezi vectorii — similaritatea cosine funcționează corect doar pe vectori normalizați
  4. Cauți după cuvânt exact în embeddings — embeddings nu funcționează așa, folosește similaritate
  5. Nu testezi calitatea — evaluează manual top-k rezultate pe un set de test

Întrebări Frecvente

### Ce sunt embeddings în NLP?

Embeddings sunt reprezentări vectoriale ale textului — vectori numerici care capturează sensul semantic. Două propoziții cu sens similar au embeddings apropiate (distanță mică).

Care e diferența dintre embeddings OpenAI și sentence-transformers?

OpenAI (text-embedding-3-small) e mai performant dar costă per API call. Sentence-transformers e local și gratuit, ideal pentru prototipuri și volume mari.

Cum măsor similaritatea între embeddings?

Cosine similarity — măsoară unghiul dintre doi vectori. Valori apropiate de 1 înseamnă sens similar, apropiate de 0 înseamnă diferit.

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