Veni AI
Tecnologie dei database

Database vettoriali e sistemi di ricerca tramite embedding

Una guida completa all’architettura tecnica dei database vettoriali, degli algoritmi di ricerca basati su embedding, HNSW, indicizzazione IVF e applicazioni enterprise di ricerca semantica.

Veni AI Technical Team12 Ocak 20256 dk okuma
Database vettoriali e sistemi di ricerca tramite embedding

Database vettoriali e sistemi di ricerca tramite embedding

I database vettoriali sono database specializzati ottimizzati per archiviare e eseguire ricerche di similarità su vettori ad alta dimensionalità. Rappresentano il componente fondamentale delle moderne applicazioni di intelligenza artificiale, in particolare dei sistemi RAG (Retrieval-Augmented Generation).

Che cos'è un database vettoriale?

Mentre i database tradizionali sono ottimizzati per query a corrispondenza esatta, i database vettoriali si concentrano sulle ricerche Approximate Nearest Neighbor (ANN).

Concetti fondamentali

Embedding: Una rappresentazione numerica vettoriale dei dati (testo, immagine, audio).

"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (e.g., 1536 dimensions)

Similarity Search: Trovare i vettori più vicini a un vettore di query.

query_vector → Top-K most similar vectors

Metriche di distanza:

  • Cosine Similarity: Similarità direzionale.
  • Euclidean Distance (L2): Distanza geometrica.
  • Dot Product: Prodotto interno dei vettori.

Metriche di similarità: analisi dettagliata

Cosine Similarity

cos(A, B) = (A · B) / (||A|| × ||B||)

Intervallo valori: [-1, 1]

  • 1: Stessa direzione (identici).
  • 0: Ortogonali (non correlati).
  • -1: Direzione opposta.

Caso d’uso: Similarità tra testi, ricerca semantica.

Euclidean Distance (L2)

d(A, B) = √(Σ(Aᵢ - Bᵢ)²)

Intervallo valori: [0, ∞) Caso d’uso: Similarità tra immagini, clustering.

Dot Product

A · B = Σ(Aᵢ × Bᵢ)

Caso d’uso: Equivalente al coseno per embedding normalizzati.

Algoritmi di indicizzazione

1. Brute Force (Flat Index)

Confronto della query con ogni singolo vettore nel database.

Complessità: O(n × d)

  • n: Numero di vettori.
  • d: Dimensione.

Vantaggio: Accuratezza al 100%. Svantaggio: Molto lento per dataset di grandi dimensioni.

2. IVF (Inverted File Index)

Riduzione dello spazio di ricerca dividendo i vettori in cluster.

Algoritmo:

  1. Creazione dei centroidi tramite K-means.
  2. Assegnazione di ogni vettore al proprio centroide più vicino.
  3. Durante la ricerca, si consultano solo i cluster nprobe più vicini.
1Parameters: 2- nlist: Number of clusters (typically √n) 3- nprobe: Number of clusters to search 4 5Trade-off: Higher nprobe → higher accuracy, lower speed.

3. HNSW (Hierarchical Navigable Small World)

Un approccio basato su grafi e il metodo più popolare oggi.

Struttura:

1Layer 2: o-------o-------o (sparse) 2 | | | 3Layer 1: o-o-o---o-o-o---o-o-o (medium) 4 | | | | | | | | | 5Layer 0: o-o-o-o-o-o-o-o-o-o-o-o (dense)

Parametri:

  • M: Numero massimo di connessioni per nodo.
  • ef_construction: Numero di candidati durante la costruzione dell’indice.
  • ef_search: Numero di candidati durante l’esecuzione della query.

Vantaggi:

  • Ricerca estremamente veloce: O(log n).
  • Alti tassi di recall.
  • Supporta inserimenti/eliminazioni dinamiche.

4. Product Quantization (PQ)

Riduzione dell’uso di memoria comprimendo i vettori.

Metodo:

  1. Suddivisione del vettore in M sotto-vettori.
  2. Mappatura di ciascun sotto-vettore su uno dei K centroidi.
  3. Memorizzazione degli ID dei centroidi al posto dei componenti originali del vettore.
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x

5. Scalar Quantization (SQ)

Conversione delle rappresentazioni Float32 in Int8.

1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## Confronto dei Database di Vettori più Popolari 5 6### Pinecone 7 8**Funzionalità:** 9- Servizio cloud completamente gestito. 10- Scalabilità automatica. 11- Filtraggio tramite metadata. 12- Isolamento tramite namespace. 13 14**Utilizzo:** 15```python 16import pinecone 17 18pinecone.init(api_key="xxx", environment="us-west1-gcp") 19index = pinecone.Index("my-index") 20 21# Upsert 22index.upsert(vectors=[ 23 {"id": "vec1", "values": [0.1, 0.2, ...], "metadata": {"category": "tech"}} 24]) 25 26# Query 27results = index.query(vector=[0.1, 0.2, ...], top_k=10, filter={"category": "tech"})

Weaviate

Funzionalità:

  • Open source.
  • Vettorizzazione integrata.
  • Supporto GraphQL API.
  • Ricerca ibrida (vettoriale + keyword).

Qdrant

Funzionalità:

  • Scritto in Rust per alte prestazioni.
  • Opzioni di filtraggio avanzate.
  • Indicizzazione del payload.
  • Supporto per deployment distribuiti.

Milvus

Funzionalità:

  • Accelerazione GPU.
  • Ricerca multi-vettore.
  • Time travel (versioning).
  • Architettura nativa Kubernetes.

ChromaDB

Funzionalità:

  • Semplice da usare e orientato agli sviluppatori.
  • Modalità in-memory + persistente.
  • Approccio Python-first.
  • Ideale per il prototyping.

Tabella di Confronto

FunzionalitàPineconeWeaviateQdrantMilvus
HostingCloudEntrambiEntrambiEntrambi
ScalabilitàAutoManualeManualeAuto
Ricerca Ibrida
Supporto GPU--
PrezziPer vettoreGratis/A pagamentoGratis/A pagamentoGratis/A pagamento

Filtraggio e Metadata

Pre-filtering vs Post-filtering

Pre-filtering:

  1. Applicare prima il filtro sui metadata.
  2. Eseguire la ricerca vettoriale sul set filtrato.
  • Vantaggio: Più veloce.
  • Svantaggio: Possibile perdita di recall.

Post-filtering:

  1. Trovare Top-K × moltiplicatore tramite ricerca vettoriale.
  2. Applicare il filtro metadata a questi risultati.
  3. Restituire il top K finale.
  • Vantaggio: Miglior recall.
  • Svantaggio: Prestazioni più lente.

Ricerca Ibrida

Combinazione di Keyword (BM25) + Ricerca vettoriale:

final_score = α × vector_score + (1-α) × keyword_score

Ottimizzazione delle Prestazioni

Parametri dell’Indice

Impostazioni HNSW Ottimali:

1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100

Elaborazione in Batch

1# Pessimo: insert singolo 2for vec in vectors: 3 index.upsert([vec]) 4 5# Buono: insert batch 6index.upsert(vectors, batch_size=100)

Connection Pooling

1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Parallel connections 6)

Esempio di Architettura Enterprise

1┌─────────────────────────────────────────────────────┐ 2│ Application │ 3└──────────────────────┬──────────────────────────────┘ 45┌──────────────────────▼──────────────────────────────┐ 6│ Vector Search Service │ 7│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 8│ │ Query │ │ Reranker │ │ Cache │ │ 9│ │ Engine │ │ Service │ │ (Redis) │ │ 10│ └─────────────┘ └─────────────┘ └─────────────┘ │ 11└──────────────────────┬──────────────────────────────┘ 1213┌──────────────────────▼──────────────────────────────┐ 14│ Vector Database Cluster │ 15│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 16│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │ 17│ └─────────┘ └─────────┘ └─────────┘ │ 18└─────────────────────────────────────────────────────┘

Monitoring e Observability

Metriche Chiave

  • Latenza Query (p50, p95, p99)
  • Tasso di Recall
  • QPS (Queries Per Second)
  • Dimensione dell’Indice
  • Utilizzo della Memoria

Soglie di Alerting

1alerts: 2 - name: high_latency 3 condition: p99_latency > 200ms 4 severity: warning 5 6 - name: low_recall 7 condition: recall < 0.9 8 severity: critical 9## Conclusione 10 11I database vettoriali sono componenti indispensabili delle moderne applicazioni di AI. Con la scelta giusta del database, della strategia di indicizzazione e delle ottimizzazioni, è possibile creare sistemi di ricerca semantica ad alte prestazioni. 12 13In Veni AI, offriamo soluzioni enterprise per la ricerca vettoriale. Contattaci per le tue esigenze.

İlgili Makaleler