Pular para o conteúdo principal

lakebase_vector

A extensão lakebase_vector adiciona busca vetorial de vizinhos mais próximos aproximados (ANN) ao Lakebase através do tipo de índice lakebase_ann. É um complemento direto para pgvector: os mesmos tipos de vetor, operadores de distância e sintaxe de consulta funcionam sem modificação.

Instalar​

Primeiro, habilite a Pesquisa Lakebase nas configurações do seu projeto. Em seguida, instale a extensão:

SQL
CREATE EXTENSION IF NOT EXISTS lakebase_vector CASCADE;

A palavra-chave CASCADE instala automaticamente pgvector como uma dependência.

Upgrade the extension and indexes​

Um novo lançamento do Lakebase Search pode adicionar recursos, correções e melhorias de desempenho. Embora o Lakebase Search seja lançado como parte das atualizações do Lakebase, ele não atualiza tudo automaticamente. Em lakebase_vector, duas coisas são atualizadas separadamente e possuem números de versão que não estão relacionados entre si:

  • The extension version is the version of the SQL objects that CREATE EXTENSION lakebase_vector creates, including its data types, functions, operators, and the lakebase_ann index access method. This version is reported by SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_vector'. ALTER EXTENSION lakebase_vector UPDATE updates this version.
  • The index storage format is the on-disk disposição of a lakebase_ann index. The extension may introduce updated index storage formats in an update, unlocking more recursos and delivering better desempenho. All newly created indexes automatically use the latest storage format, while existing indexes can be upgraded to the new format using REINDEX INDEX CONCURRENTLY after a newer storage format is available.

Upgrading is not urgent. The extension is compatible with SQL objects and index storage formats from older versions, but staying current keeps you on the supported, best-performing path and avoids a larger migration later, so upgrade when convenient rather than deferring indefinitely.

nota

A versão de extensão disponível mais recente é informada por SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_vector'.

A versão mais recente do formato de armazenamento é _2. A seguinte query encontra todos os índices que usam um formato de armazenamento mais antigo. Em seguida, você poderá reconstruí-los para o formato de armazenamento mais recente com REINDEX INDEX ou REINDEX INDEX CONCURRENTLY:

SQL
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';
nota

REINDEX INDEX CONCURRENTLY allows reads and writes to continue, but it takes longer.

Início rápido​

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

Se você estiver carregando incorporações do Unity Catalog em vez de inseri-las diretamente, tabelas sincronizadas podem mapear uma coluna de incorporação de lakehouse diretamente para uma coluna Postgres vector durante a sincronização, em vez do mapeamento default JSONB. Consulte Mapeamento de tipo personalizado para a Lakebase Search.

Configure o índice​

Defina build_mode na criação do índice para controlar a relação entre precisão e velocidade:

  • standard (default): equilibra o recall e o tempo de construção do índice. Use para a maioria das cargas de trabalho.
  • quality: melhora o recall, mas demora mais para construir.
SQL
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (build_mode = 'quality');

O modo de compilação fast permanece suportado para compatibilidade com versões anteriores.

Por default, lakebase_ann escolhe listas com base nas estatísticas da tabela e na configuração do índice. Defina lists para controlar a disposição de partição explicitamente:

SQL
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (lists = '1000');

Tempo de construção do índice​

shared_buffers maiores podem reduzir significativamente o tempo de construção do índice. O Lakebase habilita essa otimização apenas em computes de tamanho fixo maiores. Verifique o valor atual antes de otimizar a criação de um índice:

SQL
SHOW shared_buffers;

Se shared_buffers for de 1 GB ou menos, considere redimensionar temporariamente para um compute de tamanho fixo maior antes de iniciar a construção do índice.

Você também pode acelerar a criação do índice aumentando o número de workers paralelos.

O parâmetro de configuração max_parallel_maintenance_workers define o número máximo de workers paralelos que podem ser começados por um único comando de utilidade, como CREATE INDEX.

O parâmetro de configuração max_parallel_workers define o número máximo de workers que o compute pode dar suporte para operações paralelas. Valores de max_parallel_maintenance_workers acima desse limite não têm efeito.

O parâmetro de configuração max_worker_processes define o número máximo de processos em segundo plano que o compute pode dar suporte. O Lakebase gerencia essa configuração com base no tamanho do compute. Valores de max_parallel_workers acima desse limite não têm efeito.

SQL
SHOW max_worker_processes;
-- Set both values to the desired parallelism minus one.
SET max_parallel_workers = 15;
SET max_parallel_maintenance_workers = 15;

Crie índices simultaneamente​

CREATE INDEX CONCURRENTLY e REINDEX INDEX CONCURRENTLY permitem que as leituras e gravações continuem enquanto um índice é criado ou reconstruído:

SQL
CREATE INDEX CONCURRENTLY items_embedding_idx_concurrent ON items
USING lakebase_ann (embedding vector_l2_ops);

REINDEX INDEX CONCURRENTLY items_embedding_idx_concurrent;

Ajuste a precisão da pesquisa​

Antes de ajustar, chame lakebase_ann_index_info(index_name) para obter os valores de lists, default_probes e default_epsilon do índice.

Use lakebase_ann.probes no momento da query para controlar quantas partições IVF são pesquisadas. Valores mais altos melhoram o recall ao custo da velocidade da query. O default é 'auto'. Teste valores diferentes para atingir sua meta de recall.

A forma de probes deve corresponder à forma de lists. Chame lakebase_ann_index_info para encontrar seu array lists, então defina um valor para um índice de um nível ou dois valores separados por vírgulas para um índice de dois níveis:

lists de informações de índice

probes para definir

[] (vazio)

''

[222]

'22'

[3333, 33333]

'33, 333'

lists de informações de índice

probes para definir

[] (vazio)

''

[222]

'22'

[3333, 33333]

'33, 333'

nota

Em um dataset pequeno, lakebase_ann usa pesquisa exata (plana) em vez de particionamento IVF, e lakebase_ann_index_info retorna lists e default_probes vazios. Nesse caso, mantenha probes definido como ''. Quando lists não estiver vazio, um valor probes cuja forma não corresponda a lists causará um erro.

SQL
-- 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 controla quantos candidatos são reclassificados usando distâncias de precisão total. Valores mais altos reclassificam mais candidatos e demoram mais. O valor default de 'auto' funciona bem para a maioria das cargas de trabalho. Durante a busca plana em um dataset pequeno, epsilon ainda controla a reclassificação de precisão total.

Pré-filtro​

Por default, o Postgres aplica condições de filtro não vetoriais após o índice de rede neurais artificiais (ANN) retornar as linhas candidatas. Habilite lakebase_ann.prefilter para avaliar essas condições antes da reclassificação de distância de precisão total:

SQL
SET lakebase_ann.prefilter TO on;

SELECT * FROM items
WHERE id % 100 = 0
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

A pré-filtragem funciona melhor quando o filtro é barato de avaliar e remove a maioria das linhas. Deixe-o desativado para filtros que correspondem a muitas linhas ou exigem cálculos caros, já que avaliar o filtro dentro do índice pode adicionar sobrecarga.

Prewarm an index​

Use lakebase_ann_prewarm after a compute starts to load the frequently accessed parts of an index into memory. The scope argument accepts the following values:

  • search (default): pré-aquece toda a porção quente usada para a pesquisa.
  • routing: pré-aquece apenas as estruturas de roteamento. Esta opção é mais rápida e oferece uma melhor relação custo-desempenho para grandes índices.
SQL
-- 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');

Classes de operador​

Métrica de distância

Classe de operador

Operador de consulta

L2 (Euclidiano)

vector_l2_ops

<->

Produto interno negativo

vector_ip_ops

<#>

Semelhança de cosseno

vector_cosine_ops

<=>

Métrica de distância

Classe de operador

Operador de consulta

L2 (Euclidiano)

vector_l2_ops

<->

Produto interno negativo

vector_ip_ops

<#>

Semelhança de cosseno

vector_cosine_ops

<=>

Escolha a classe de operador que corresponda a como suas incorporações foram treinadas e utilize a mesma métrica para o índice e a consulta:

  • vector_cosine_ops (<=>) é similaridade de cosseno. Utilize-o para a maioria das incorporações de texto. Esta é a escolha mais comum.
  • vector_l2_ops (<->) é a distância euclidiana (L2). Utilize-o quando a distância espacial absoluta for importante e os vetores não forem normalizados.
  • vector_ip_ops (<#>) é produto interno negativo. Utilize-o quando os vetores forem pré-normalizados para comprimento unitário. Para vetores unitários, o produto interno é igual à similaridade de cosseno e é tipicamente mais rápido.

Referência de opções de índice​

Opção

Tipo

Padrão

Descrição

build_mode

string

'standard'

Controla o equilíbrio entre precisão e velocidade. Use 'quality' para obter melhor recall ao custo de uma construção de índice mais longa. 'fast' permanece suportado para compatibilidade com versões anteriores.

lists

string

'auto'

Define a disposição de partição IVF. Com 'auto', a extensão escolhe um valor com base nas estatísticas da tabela e na configuração do índice. Defina um único número inteiro, como '1000', para um índice de um nível, ou dois números inteiros crescentes separados por vírgulas, como '100, 1000', para um índice de dois níveis.

Opção

Tipo

Padrão

Descrição

build_mode

string

'standard'

Controla o equilíbrio entre precisão e velocidade. Use 'quality' para obter melhor recall ao custo de uma construção de índice mais longa. 'fast' permanece suportado para compatibilidade com versões anteriores.

lists

string

'auto'

Define a disposição de partição IVF. Com 'auto', a extensão escolhe um valor com base nas estatísticas da tabela e na configuração do índice. Defina um único número inteiro, como '1000', para um índice de um nível, ou dois números inteiros crescentes separados por vírgulas, como '100, 1000', para um índice de dois níveis.

Referência GUC​

Parâmetro

Tipo

Padrão

Descrição

lakebase_ann.probes

string

'auto'

Número de partições IVF a serem verificadas em cada nível. Valores mais altos melhoram o recall ao custo da velocidade da query. A forma deve corresponder ao array lists de lakebase_ann_index_info.

lakebase_ann.epsilon

string

'auto'

Controla quantos candidatos são reclassificados usando distâncias de precisão total. Valores mais altos reclassificam mais candidatos e levam mais tempo.

lakebase_ann.prefilter

enumeração

off

Avalia filtros não vetoriais antes da reclassificação de distância de precisão total. Os valores válidos são on e off. Ideal para filtros de baixo custo que removem a maioria das linhas candidatas.

Parâmetro

Tipo

Padrão

Descrição

lakebase_ann.probes

string

'auto'

Número de partições IVF a serem verificadas em cada nível. Valores mais altos melhoram o recall ao custo da velocidade da query. A forma deve corresponder ao array lists de lakebase_ann_index_info.

lakebase_ann.epsilon

string

'auto'

Controla quantos candidatos são reclassificados usando distâncias de precisão total. Valores mais altos reclassificam mais candidatos e levam mais tempo.

lakebase_ann.prefilter

enumeração

off

Avalia filtros não vetoriais antes da reclassificação de distância de precisão total. Os valores válidos são on e off. Ideal para filtros de baixo custo que removem a maioria das linhas candidatas.

Funções de utilidade​

Função

Devolve

Descrição

lakebase_ann_prewarm(regclass, scope text DEFAULT 'search')

vazio

Carrega dados de índice acessados com frequência na memória. Os valores válidos de scope são search e routing.

lakebase_ann_index_info(regclass)

TEXT

Returns index metadata as JSON text, including version, lists, default_probes, and default_epsilon.

Função

Devolve

Descrição

lakebase_ann_prewarm(regclass, scope text DEFAULT 'search')

vazio

Carrega dados de índice acessados com frequência na memória. Os valores válidos de scope são search e routing.

lakebase_ann_index_info(regclass)

TEXT

Returns index metadata as JSON text, including version, lists, default_probes, and default_epsilon.

Passos seguintes​