Tag: embeddings, vector-search, nlp, cosine-similarity, llm
Livello: intermedio
TL;DR: Rappresentazione numerica densa di dati (testo, immagini) in uno spazio multi-dimensionale. Permette di calcolare la similarita' semantica tra entita' tramite semplici operazioni matematiche.
-
Un embedding e' un array di numeri a virgola mobile (vettore) di dimensione fissa.
-
Cattura il contesto semantico: concetti dal significato simile hanno vettori geometricamente vicini nello spazio.
-
Le dimensioni variano a seconda del modello (es. da 256 a 4096 per i modelli moderni).
-
La trasformazione del dato in vettore e' unidirezionale e richiede un modello neurale pre-addestrato.
-
La similarita' si misura tramite Cosine Similarity, Dot Product o distanza Euclidea (L2).
-
La Cosine Similarity valuta l'angolo tra due vettori ed e' indipendente dalla loro magnitudo.
-
I Vector Database (Pinecone, Weaviate, pgvector) sono ottimizzati per archiviare vettori e processare query di similarita'.
-
Per scalare, la ricerca esatta (K-Nearest Neighbors) viene sostituita dalla ricerca approssimata (Approximate Nearest Neighbor o ANN).
-
HNSW (Hierarchical Navigable Small World) e' l'algoritmo di indicizzazione standard per ricerche ANN efficienti.
-
Il chunking del testo e' obbligatorio prima dell'embedding per preservare il focus semantico e rispettare i token limit.
-
Q: Qual e' la differenza tra sparse representations e dense embeddings?R: Le rappresentazioni sparse (es. BM25, TF-IDF) hanno altissima dimensionalita' con molti zeri e si basano su keyword matching. Gli embedding densi catturano il reale significato semantico del testo in dimensioni fisse.
-
Q: Che metrica di distanza usi solitamente e perche'?R: Preferisco la Cosine Similarity per testi, perche' normalizza implicitamente i vettori e misura l'orientamento (significato) a prescindere dalla lunghezza del documento originale.
-
Q: Come risolvi il problema dei documenti molto lunghi da embeddare?R: Applico tecniche di chunking con overlap, dividendo il documento in paragrafi logici. In fase di ricerca estraggo il chunk e poi recupero il documento genitore.
-
Embeddare chunk di testo eccessivamente grandi, causando diluizione semantica (il vettore medio perde specificita').
-
Dimenticare di normalizzare i vettori in fase di ingestione se il vector db o la metrica scelta lo richiedono.
-
Mischiare vettori generati da modelli diversi: spazi vettoriali differenti sono totalmente incompatibili tra loro.
-
Usare un database vettoriale dedicato per moli di dati banali, dove un semplice pgvector o array numpy basterebbero.
```import numpy as np
from numpy.linalg import norm
def cosine_similarity(vec_a, vec_b):
# Calcolo manuale della similarita' del coseno tra due vettori
return np.dot(vec_a, vec_b) / (norm(vec_a) * norm(vec_b))
-- Esempio query in PostgreSQL usando l'estensione pgvector (distanza L2)
SELECT id, content
FROM documents
ORDER BY embedding <-> '[0.1, 0.2, 0.3, ...]'
LIMIT 5;
```
-
[ ] Strategie avanzate di chunking (sliding window, semantic chunking)
-
[ ] Architettura e layer interni del grafo HNSW
-
[ ] Implementazione e differenze di performance tra Dot Product e Cosine Similarity su DB specifici
-
Documentazione pgvector e concetti di indicizzazione IVFFlat / HNSW
-
Best practice OpenAI su Text Embeddings e dimensionalita'