Pular para o conteúdo principal

Otimização vetorial em tabelas gerenciadas do Unity Catalog

info

Beta

Este recurso está na versão Beta.

A otimização vetorial acelera as pesquisas de similaridade em colunas vetoriais em tabelas gerenciadas pelo Unity Catalog. Na execução de uma query de pesquisa vetorial com APPROX NEAREST BY, o Databricks pode usar a otimização vetorial para restringir a pesquisa aos dados com probabilidade de conter as correspondências mais próximas. Isso reduz a quantidade de dados verificados, especialmente para tabelas grandes.

Para usar a otimização vetorial, crie um índice vetorial em uma coluna e especifique uma métrica de pontuação: similaridade de cosseno, produto interno ou distância L2. A Otimização preditiva refresh automaticamente o índice conforme seus dados mudam. Queries elegíveis que usam a coluna indexada e a função de comparação correspondente usam a otimização; outras queries usam busca de força bruta. Para obter a sintaxe e exemplos de query, consulte Cláusula NEAREST BY.

Requisitos​

Para criar um índice vetorial em uma tabela:

  • Use o Databricks Runtime 19 ou acima.
  • Você deve ter permissões SELECT e MODIFY na tabela, USE CATALOG no catálogo e USE SCHEMA no esquema.
  • A tabela deve ser uma tabela Delta Lake ou Iceberg gerenciada pelo Unity Catalog.
  • Crie o índice no mesmo catálogo e esquema que a tabela.
  • A Otimização Preditiva deve estar habilitada na tabela para refresh automaticamente o índice.
  • O acompanhamento de linhas deve ser habilitado antes de você criar o índice. Consulte Acompanhamento de linhas no Databricks.
  • A tabela deve conter dados quando você criar o índice.
  • A coluna de vetor deve ter o tipo de dados ARRAY<FLOAT>, e todos os vetores devem ter o mesmo número de elementos.

Para usar a otimização de vetor em um join APPROX NEAREST BY, coloque a tabela com o índice de vetor à direita e use a função de comparação que corresponde à métrica de pontuação do índice. A tabela de vetor de query à esquerda também deve estar com o acompanhamento de linha habilitado.

Criar um índice de vetores​

Use CREATE VECTOR INDEX para criar um índice para uma coluna e métrica de pontuação. Por exemplo, esta instrução cria um índice com similaridade de cosseno para a coluna embedding:

SQL
CREATE VECTOR INDEX main.analytics.documents_embedding_cosine_idx
ON main.analytics.documents (embedding)
OPTIONS (scoring_metric = 'cosine_similarity');

Você pode criar vários índices de vetor na mesma coluna para dar suporte a diferentes métricas de pontuação.

Cada métrica de pontuação corresponde a uma função de query:

Métrica de pontuação

Função de query

cosine_similarity

vector_cosine_similarity

inner_product

vector_inner_product

l2_distance

vector_l2_distance

Métrica de pontuação

Função de query

cosine_similarity

vector_cosine_similarity

inner_product

vector_inner_product

l2_distance

vector_l2_distance

importante

Use a função de query que corresponde à métrica de pontuação do índice em sua query APPROX NEAREST BY. Se nenhum índice correspondente existir, a query terá execução sem otimização vetorial.

query dados com otimização vetorial​

Coloque a tabela com o índice vetorial no lado direito de um join APPROX NEAREST BY. Você pode filtrar a tabela de vetor de query à esquerda enquanto ainda usa otimização vetorial. O seguinte join em lote retorna até 10 documentos por vetor de query:

SQL
SELECT
q.query_id,
d.document_id
FROM main.analytics.query_vectors AS q
INNER JOIN main.analytics.documents AS d
APPROX NEAREST 10 BY SIMILARITY
vector_cosine_similarity(q.embedding, d.embedding);

Manutenção e status do índice​

Depois de criar um índice vetorial, a Otimização preditiva refresh automaticamente à medida que a tabela muda. Queries incluem linhas anexadas recentemente imediatamente, mesmo antes de essas linhas terem sido indexadas.

Para localizar os índices associados a uma tabela, execução DESCRIBE EXTENDED:

SQL
DESCRIBE EXTENDED main.analytics.documents;

A seção # Indexes da saída mostra o nome de cada índice e seu nome totalmente qualificado. Por exemplo:

# Indexes
documents_embedding_cosine_idx main.analytics.documents_embedding_cosine_idx

Para inspecionar o índice, use seu nome totalmente qualificado:

SQL
DESCRIBE INDEX main.analytics.documents_embedding_cosine_idx;

A saída inclui informações sobre a coluna indexada e a métrica de pontuação. Por exemplo:

propriedade

Valor

Nome

documents_embedding_cosine_idx

Colunas

embedding

Métrica de pontuação

cosine_similarity

propriedade

Valor

Nome

documents_embedding_cosine_idx

Colunas

embedding

Métrica de pontuação

cosine_similarity

O Otimizador Preditivo faz o refresh do índice, mas não o treina novamente automaticamente. Se a distribuição de vetores em sua tabela mudar significativamente, o retreinamento poderá ajudar a manter a qualidade da pesquisa.

Para retreinar o índice, remova e recrie-o com a mesma coluna e métrica de pontuação. Por exemplo:

SQL
DROP INDEX main.analytics.documents_embedding_cosine_idx;

CREATE VECTOR INDEX main.analytics.documents_embedding_cosine_idx
ON main.analytics.documents (embedding)
OPTIONS (scoring_metric = 'cosine_similarity');

Descartar um índice vetorial​

Use DROP INDEX para remover um índice de vetor:

SQL
DROP INDEX main.analytics.documents_embedding_cosine_idx;

Depois de remover o índice, as queries que dependiam dele entrarão em execução sem a aceleração desse índice.

nota

Antes de renomear, descartar ou alterar o tipo de uma coluna indexada, descarte todos os índices vetoriais nessa coluna.

Limitações​

  • Ao criar o índice, a tabela pode ter até 1 bilhão de linhas e os vetores podem conter até 4.096 elementos.

  • Nos seguintes casos, as queries usam pesquisa de força bruta em vez de otimização vetorial:

    • A query usa viagem do tempo na tabela indexada.
    • A tabela tem filtros de linha, máscaras de coluna ou políticas de controle de acesso baseadas em atributos (ABAC).
    • A tabela é uma fonte ou um destino do OpenSharing.

    Isso se aplica mesmo que você adicione essas políticas ou comece o compartilhamento da tabela depois de criar o índice.