I dativettoriali sono alla base delle moderne funzionalità basate sull’intelligenza artificiale: ricerca semantica, motori di raccomandazione, pipeline RAG (Retrieval-Augmented Generation) e altro ancora. Man mano che i campi 4D eVector assumono un ruolo di primo piano nei database 4D, la capacità di indicizzarli in modo efficiente è essenziale per garantire la velocità delle query anche con l’aumentare dei set di dati. Questo articolo illustra come funziona l’indicizzazione vettoriale in 4D, quali algoritmi sono supportati e come gestire gli indici vettoriali a livello di programmazione.
L’esecuzione di una query su un campo vettoriale comporta in genere l’individuazione dei record i cui vettori sono “più vicini” a un vettore di riferimento, utilizzando una metrica di similarità. Senza un indice, 4D deve scansionare ogni vettore della tabella e calcolare la distanza uno per uno, operazione corretta ma lenta man mano che la tabella cresce.
Con un indice vettoriale, 4D utilizza un algoritmo appositamente progettato per la ricerca di similarità vettoriale, riducendo drasticamente il tempo di esecuzione della query pur restituendo gli stessi risultati di una query non indicizzata. In altre parole:
- La correttezza è garantita: le query indicizzate e quelle non indicizzate restituiscono insiemi di risultati identici.
- Le prestazioni migliorano: le query indicizzate sono circa 8 volte più veloci di quelle non indicizzate.
Tipi di indici vettoriali supportati
4D introduce tre tipi di indici dedicati per i campi 4D.Vector, oltre all’indice “Standard” già esistente:
| Costante | Caso d’uso |
|---|---|
Indice coseno vettoriale |
Somiglianza basata sull’angolo tra i vettori |
Indice dot vettoriale |
Somiglianza basata sul prodotto scalare |
Indice vettoriale euclideo |
Somiglianza basata sulla distanza in linea retta |
Questi sono disponibili tramite CREATE INDEX e SET INDEX, e ogni tipo di indice può essere selezionato in modo indipendente, consentendo a un singolo campo vettoriale di avere contemporaneamente più indici (ad esempio, sia coseno che euclideo).
Interfaccia utente
I campi vettoriali e i relativi indici sono completamente integrati nell’Editor di struttura e nelle finestre di dialogo correlate:
- I campi di tipo 4D.Vector visualizzano un’icona vettoriale dedicata
, sia nell’Editor della struttura che nell’Inspector.
- La finestra dell’elenco degli indici mostra gli indici vettoriali accanto a quelli regolari.

- Dall’Inspector, dal menu contestuale del campo e dalla finestra Crea/Modifica indice, per i campi vettoriali sono disponibili solo gli indici Coseno, Punto, Euclideo e Automatico, ciascuno selezionabile in modo indipendente. La selezione di qualsiasi altro tipo di indice genera un errore.

Mantenere la coerenza degli indici
4D si occupa di mantenere gli indici vettoriali coerenti con i dati:
- L’aggiornamento di un vettore tramite .save() (o qualsiasi altro comando) aggiorna automaticamente l’indice associato.
- L’eliminazione di un vettore tramite `drop()` (o qualsiasi altro comando) aggiorna automaticamente l’indice associato.
Si tenga presente che:
- Gli indici compositi non possono includere un campo vettoriale.
-
Gli aggiornamenti degli indici vettoriali non sono attualmente supportati all’interno delle transazioni.
Supporto operativo
Gli indici vettoriali sono trattati come elementi di primo piano in tutti gli strumenti di manutenzione e amministrazione di 4D:
- Pausa / Ripresa: PAUSE INDEXES e RESUME INDEXES è possibile lavorare sugli indici vettoriali proprio come su qualsiasi altro indice.
- Archiviazione: 4D crea una cartella denominata <nome progetto>.4DVI nella directory DATA per archiviare gli indici vettoriali.
- Reindicizzazione: una reindicizzazione avviata al riavvio reindicizza anche gli indici vettoriali.
- Verifica e riparazione: il Centro di manutenzione e sicurezza (MSC) include gli indici vettoriali sia nelle operazioni di verifica che in quelle di riparazione.
- Backup: quando un indice è memorizzato in un file separato, viene incluso nella configurazione di backup predefinita.
Precisione vettoriale
4D.Vector.new() ora accetta un parametro di precisione, che può essere di 32 o 64 bit (costantimk single precision e mk double precision ). Per impostazione predefinita, i nuovi vettori vengono creati con una precisione a 32 bit (4 byte per componente). Ciò riduce dello 50% l’ingombro in memoria rispetto ai vettori a 64 bit, pur mantenendo una precisione sufficiente per i calcoli di similarità e distanza; per questo motivo è l’impostazione predefinita consigliata per la maggior parte dei casi d’uso.
$vector32:=4D.Vector.new([1; 2; 3])
// $vector32.precision=32
$vector64:=4D.Vector.new([1; 2; 3]; mk double precision)
// $vector64.precision=64
Nota sulla compatibilità: questa modifica compromette la compatibilità con il codice esistente che si basava sul precedente valore predefinito a 64 bit. Per mantenere la precisione a 64 bit, passare esplicitamente mk double precision.
Conclusione
L’indicizzazione vettoriale in 4D offre prestazioni di livello produttivo per la ricerca di similarità direttamente all’interno del motore del database, senza sacrificare la coerenza o la facilità d’uso. Che si tratti di sviluppare un sistema di raccomandazione, una funzionalità di ricerca semantica o una pipeline RAG, ora è possibile:
- Scegliere la metrica di similarità più adatta (coseno, dot o euclidea) per il proprio caso d’uso.
- Creare e gestire gli indici vettoriali tramite codice o l’interfaccia utente.
- Affidarti a 4D per mantenere gli indici automaticamente sincronizzati man mano che i dati cambiano.
- Ispezionare, mettere in pausa, verificare e riparare gli indici vettoriali utilizzando gli stessi strumenti che già utilizzate per gli indici regolari.
Come sempre, le query indicizzate e non indicizzate restituiscono risultati identici; l’indice serve esclusivamente a ottimizzare le prestazioni, senza mai modificare il comportamento del sistema.
Al momento non è possibile lasciare commenti su questo post.