Vettori Embeddings — Cheat Sheet

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.

Concetti chiave

-

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.

Domande tipiche e risposte pronte

-

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.

Insidie e errori comuni

-

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.

Snippet e comandiPython

```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;

```

Da ripassare

-

[ ] 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

Riferimenti

-

Documentazione pgvector e concetti di indicizzazione IVFFlat / HNSW

-

Best practice OpenAI su Text Embeddings e dimensionalita'

Jarvis Interviews
Jarvis