Otimização vetorial em tabelas gerenciadas do Unity Catalog
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
SELECTeMODIFYna tabela,USE CATALOGno catálogo eUSE SCHEMAno 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:
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 |
|---|---|
|
|
|
|
|
|
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:
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:
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:
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 |
|
Colunas |
|
Métrica de pontuação |
|
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:
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:
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.
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.