Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'estensione lakebase_vector aggiunge una ricerca del vettore ann (nearest-neighbor) approssimativa a Lakebase tramite il lakebase_ann tipo di indice. Si tratta di un drop-in complementare a pgvector: gli stessi tipi di vettore, operatori di distanza e sintassi di query funzionano senza modifiche.
Install
Abilitare prima di tutto Lakebase Search nelle impostazioni del progetto. Installare quindi l'estensione:
CREATE EXTENSION IF NOT EXISTS lakebase_vector CASCADE;
La CASCADE parola chiave viene pgvector installata automaticamente come dipendenza.
Aggiornare l'estensione e gli indici
Una nuova versione di Lakebase Search può aggiungere funzionalità, correzioni e miglioramenti delle prestazioni. Sebbene Lakebase Search sia rilasciato come parte degli aggiornamenti di Lakebase, non aggiorna tutto automaticamente. In lakebase_vector, due cose vengono aggiornate separatamente e portano numeri di versione che non sono collegati tra loro:
-
La versione dell'estensione è la versione degli oggetti SQL che
CREATE EXTENSION lakebase_vectorcrea, inclusi i suoi tipi di dati, funzioni, operatori e il metodo di accesso all'indicelakebase_ann. Questa versione è riportata daSELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_vector'.ALTER EXTENSION lakebase_vector UPDATEaggiorna questa versione. -
Il formato di archiviazione dell'indice è la disposizione su disco di un
lakebase_annindice. L'estensione potrebbe introdurre formati di archiviazione degli indici aggiornati in un aggiornamento, sbloccando più funzionalità e offrendo prestazioni migliori. Tutti gli indici di nuova creazione utilizzano automaticamente il formato di archiviazione più recente, mentre gli indici esistenti possono essere aggiornati al nuovo formato dopoREINDEX INDEX CONCURRENTLYche è disponibile un formato di archiviazione più recente.
L'aggiornamento non è urgente. L'estensione è compatibile con oggetti SQL e formati di archiviazione indicizzati delle versioni precedenti, ma rimanere aggiornato ti mantiene sul percorso supportato e con le migliori prestazioni ed evita una migrazione più grande in seguito, quindi aggiorna quando comodo invece di rimandare indefinitamente.
Note
L'ultima versione di estensione disponibile è riportata da SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_vector'.
L'ultima versione del formato di archiviazione è _2. La query seguente trova tutti gli indici che utilizzano un formato di archiviazione più vecchio. Puoi poi ricostruirli all'ultimo formato di archiviazione con REINDEX INDEX oppure REINDEX INDEX CONCURRENTLY:
SELECT oid::regclass AS index, lakebase_ann_index_info(oid::regclass)::json ->> 'version' AS storage_format_version
FROM pg_class
WHERE relam = (SELECT oid FROM pg_am WHERE amname = 'lakebase_ann') AND relkind = 'i';
Note
REINDEX INDEX CONCURRENTLY Permette di continuare letture e scritture, ma richiede più tempo.
Avvio rapido
-- Create a table with a vector column
CREATE TABLE items (id BIGSERIAL PRIMARY KEY, embedding VECTOR(3));
-- Insert sample data
INSERT INTO items (embedding)
SELECT ARRAY[random(), random(), random()]::real[]
FROM generate_series(1, 1000);
-- Create a lakebase_ann index
CREATE INDEX items_embedding_idx ON items
USING lakebase_ann (embedding vector_l2_ops);
-- Query using standard pgvector distance operators
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
Popolare da tabelle sincronizzate
Se carichi embedding da Unity Catalog invece di inserirli direttamente, le tabelle sincronizzate possono mappare una colonna di embedding lakehouse direttamente a una colonna Postgres vector durante la sincronizzazione, invece della mappatura predefinita JSONB .
Vedi Mappatura personalizzata dei tipi per la ricerca Lakebase.
Configurare l'indice
Impostare build_mode in fase di creazione dell'indice per controllare il compromesso di accuratezza/velocità:
-
standard(predefinito): richiamo di saldi e tempo di costruzione dell'indice. Usare per la maggior parte dei carichi di lavoro. -
quality: migliora il richiamo ma richiede più tempo per essere costruito.
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (build_mode = 'quality');
La fast modalità build rimane supportata per la retrocompatibilità.
Di default, lakebase_ann sceglie le liste in base alle statistiche della tabella e alla configurazione dell'indice. Impostato lists per controllare esplicitamente la disposizione delle partizioni:
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (lists = '1000');
Tempo di costruzione dell'indice
Più grandi shared_buffers possono ridurre significativamente i tempi di costruzione dell'indice. Lakebase consente questa ottimizzazione solo su calcoli di dimensioni fisse più grandi. Controlla il valore attuale prima di ottimizzare una build di indice:
SHOW shared_buffers;
Se shared_buffers è 1 GB o meno, considera di ridimensionare temporaneamente a un calcolo di dimensione fissa maggiore prima di iniziare la build dell'indice.
Puoi anche accelerare la creazione di indici aumentando il numero di lavoratori paralleli.
Il parametro max_parallel_maintenance_workers di configurazione stabilisce il numero massimo di lavoratori paralleli che possono essere avviati con un singolo comando utility come CREATE INDEX.
Il parametro max_parallel_workers di configurazione stabilisce il numero massimo di lavoratori che il calcolo può supportare per operazioni parallele. I valori superiori max_parallel_maintenance_workers a questo limite non hanno effetto.
Il parametro max_worker_processes di configurazione stabilisce il numero massimo di processi in background che il calcolo può supportare. Lakebase gestisce questa impostazione in base alla dimensione di calcolo. I valori superiori max_parallel_workers a questo limite non hanno effetto.
SHOW max_worker_processes;
-- Set both values to the desired parallelism minus one.
SET max_parallel_workers = 15;
SET max_parallel_maintenance_workers = 15;
Compilare gli indici contemporaneamente
CREATE INDEX CONCURRENTLY e REINDEX INDEX CONCURRENTLY permettono letture e scritture di continuare mentre un indice viene costruito o ricostruito:
CREATE INDEX CONCURRENTLY items_embedding_idx_concurrent ON items
USING lakebase_ann (embedding vector_l2_ops);
REINDEX INDEX CONCURRENTLY items_embedding_idx_concurrent;
Ottimizzare l'accuratezza della ricerca
Prima dell'ottimizzazione, chiamare lakebase_ann_index_info(index_name) per ottenere i valori , listse default_probes dell'indicedefault_epsilon.
Usalo lakebase_ann.probes al momento della query per controllare quante partizioni IVF vengono cercate. I valori più elevati migliorano il richiamo al costo della velocità delle query. Il valore predefinito è 'auto'. Testa valori diversi per raggiungere il tuo obiettivo di richiamo.
La forma di probes deve corrispondere alla forma di lists. Chiama lakebase_ann_index_info per trovare il tuo lists array, poi imposta un valore per un indice a un livello o due valori separati da virgola per un indice a due livelli:
lists da informazioni sull'indice |
probes da impostare |
|---|---|
[] (vuoto) |
'' |
[222] |
'22' |
[3333, 33333] |
'33, 333' |
Note
Su un piccolo dataset, lakebase_ann si utilizza la ricerca esatta (piatta) invece della partizionazione IVF, e lakebase_ann_index_info restituisce vuoti lists e default_probes. In questo caso, lascia probes impostato a ''. Quando lists non è vuoto, un probes valore la cui forma non corrisponde lists causa un errore.
-- Check your index's lists array first
SELECT lakebase_ann_index_info('items_embedding_idx');
-- Then set probes to match the shape of lists.
-- One-level index (single-value lists): set one value.
SET lakebase_ann.probes TO '10';
-- Two-level index: set two ascending comma-separated values, for example '10, 20'.
-- Flat index (empty lists): leave probes set to ''.
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 10;
lakebase_ann.epsilon Controlla quanti candidati vengono riclassificati usando distanze a piena precisione. Valori più alti riclassificano più candidati e richiedono più tempo. Il valore predefinito di 'auto' funziona bene per la maggior parte dei carichi di lavoro. Durante la ricerca piatta su un piccolo dataset, epsilon si controlla comunque il riposizionamento a piena precisione.
Prefiltro
Per impostazione predefinita, Postgres applica condizioni di filtro non vettoriale dopo che l'indice ANN restituisce le righe candidate. Consentire lakebase_ann.prefilter di valutare queste condizioni prima di riclassificare la distanza con piena precisione:
SET lakebase_ann.prefilter TO on;
SELECT * FROM items
WHERE id % 100 = 0
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;
Il prefiltraggio funziona meglio quando il filtro è economico da valutare e rimuove la maggior parte delle righe. Lascialo disattivato per i filtri che corrispondono a molte righe o richiedono calcoli costosi, poiché valutare il filtro all'interno dell'indice può aggiungere sovraccarico.
Preriscalda un indice
Da usare lakebase_ann_prewarm dopo l'inizio del calcolo per caricare in memoria le parti di un indice frequentemente accessibili. L'argomento scope accetta i seguenti valori:
-
search(predefinito): Preriscalda la parte calda completa utilizzata per la ricerca. -
routing: Preriscalda solo le strutture di instradamento. Questa opzione è più veloce e offre un miglior compromesso costo-performance per indici di grandi dimensioni.
-- Prewarm the full search scope
SELECT lakebase_ann_prewarm('items_embedding_idx');
-- Prewarm only routing structures
SELECT lakebase_ann_prewarm('items_embedding_idx', scope => 'routing');
Classi di operatore
| Metrica della distanza | Classe operatore | Operatore di interrogazione |
|---|---|---|
| L2 (euclideo) | vector_l2_ops |
<-> |
| Prodotto interno negativo | vector_ip_ops |
<#> |
| Somiglianza coseno | vector_cosine_ops |
<=> |
Scegliere la classe di operatore corrispondente alla modalità di training degli incorporamenti e usare la stessa metrica per l'indice e la query:
-
vector_cosine_ops(<=>) è somiglianza coseno. Usarlo per la maggior parte degli incorporamenti di testo. Questa è la scelta più comune. -
vector_l2_ops(<->) è la distanza Euclidea (L2). Usarlo quando la distanza spaziale assoluta conta e i vettori non vengono normalizzati. -
vector_ip_ops(<#>) è prodotto interno negativo. Usarlo quando i vettori vengono pre normalizzati per la lunghezza dell'unità. Per i vettori di unità, il prodotto interno è uguale alla somiglianza del coseno ed è in genere più veloce.
Informazioni di riferimento sulle opzioni di indice
| Option | Type | Default | Description |
|---|---|---|---|
build_mode |
string | 'standard' |
Controlla il compromesso precisione/velocità. Usalo 'quality' per un ricordo migliore a scapito di una build a indice più lunga.
'fast' rimane supportato per la retrocompatibilità. |
lists |
string | 'auto' |
Imposta la disposizione della partizione IVF. Con 'auto', l'estensione sceglie un valore basandosi sulle statistiche della tabella e sulla configurazione dell'indice. Impostare un singolo intero come '1000' per un indice di un livello, oppure due interi crescenti separati da virgola come per '100, 1000' un indice a due livelli. |
Informazioni di riferimento su GUC
| Parametro | Type | Default | Description |
|---|---|---|---|
lakebase_ann.probes |
string | 'auto' |
Numero di partizioni IVF da scansionare a ogni livello. I valori più elevati migliorano il richiamo al costo della velocità delle query. La forma deve corrispondere all'array lists da lakebase_ann_index_info. |
lakebase_ann.epsilon |
string | 'auto' |
Controlla quanti candidati vengono riclassificati usando distanze a piena precisione. Valori più alti riclassificano più candidati e richiedono più tempo. |
lakebase_ann.prefilter |
enumerazione | off |
Valuta i filtri non vettoriali prima di riclassificare la distanza a piena precisione. I valori validi sono on e off. Ideale per filtri economici che eliminano la maggior parte delle righe candidate. |
Funzioni di utilità
| Function | Returns | Description |
|---|---|---|
lakebase_ann_prewarm(regclass, scope text DEFAULT 'search') |
vuoto | Carica i dati indicizzati frequentemente accesi in memoria. I valori validi scope sono search e routing. |
lakebase_ann_index_info(regclass) |
Testo | Restituisce i metadati dell'indice come testo JSON, inclusi version, lists, default_probes, e default_epsilon. |