A pesquisa vetorial no Spanner Omni é um recurso integrado de alto desempenho que permite a pesquisa semântica e a correspondência de similaridade em dados vetoriais de alta dimensão. Ao armazenar e indexar embeddings de vetor diretamente no banco de dados transacional, o Spanner Omni elimina bancos de dados de vetores separados e pipelines complexos de extração, transformação e carregamento (ETL).
Os tópicos neste documento se aplicam ao Spanner Omni da mesma forma que ao Spanner.
Como a pesquisa vetorial funciona
Com a pesquisa vetorial, é possível encontrar itens semanticamente semelhantes representando dados como vetores numéricos (embeddings). O Spanner Omni oferece suporte a dois métodos principais de pesquisa:
Vizinho mais próximo (KNN): realiza uma pesquisa exata calculando a distância entre a consulta e todos os vetores no conjunto de dados. Ele oferece o maior recall, mas pode ser caro em termos de computação para grandes conjuntos de dados.
Vizinhos mais próximos aproximados (ANN): usa um índice de vetor para encontrar correspondências rapidamente em grandes conjuntos de dados. Ele troca uma pequena quantidade de acurácia (recall) por ganhos em velocidade e escalonabilidade.
A pesquisa vetorial é ainda mais eficiente quando combinada com outros recursos:
| Combinação | Benefício |
|---|---|
| Pesquisa vetorial com filtragem SQL | Combine de forma eficiente a pesquisa vetorial com filtros (por exemplo, "Encontrar imagens semelhantes em que categoria = 'sapatos' e preço < 100"). |
| Pesquisa vetorial + pesquisa de texto completo | Combine a similaridade semântica com a precisão das palavras-chave usando a fusão de classificação recíproca (RRF, na sigla em inglês) para melhorar a relevância da pesquisa. |
| Vetor + gráfico | Use a pesquisa vetorial para encontrar pontos de entrada (nós) relevantes em um gráfico de propriedades e percorrer relações complexas. |
Para mais informações, consulte a Visão geral da pesquisa vetorial do Spanner na documentação do Spanner.
Realizar uma pesquisa de vizinhos mais próximos
O Spanner Omni é compatível com a pesquisa de vizinhos k-mais próximos (KNN) usando funções de distância integradas. Você pode fornecer um embedding de vetor como um parâmetro de entrada para encontrar os vetores mais próximos no espaço N-dimensional.
As seguintes funções de distância estão disponíveis:
COSINE_DISTANCE(): mede o cosseno do ângulo entre dois vetores.EUCLIDEAN_DISTANCE(): mede a menor distância em linha reta entre dois vetores.DOT_PRODUCT(): calcula o cosseno do ângulo multiplicado pelo produto das magnitudes do vetor (ideal para dados normalizados).
Para mais informações, consulte Realizar pesquisa de similaridade vetorial encontrando os vizinhos K mais próximos na documentação do Spanner.
Escolher a melhor função de distância do vetor
A escolha da função de distância adequada depende dos seus dados e do modelo usado para gerar incorporações.
| Função | Descrição | Relação com o aumento da similaridade |
|---|---|---|
| Produto escalar | Calcula o cosseno do ângulo multiplicado pelo produto das magnitudes dos vetores correspondentes. | Aumenta |
| Distância do cosseno | Mede o cosseno do ângulo entre dois vetores (1 - similaridade de cosseno). | Diminui |
| Distância euclidiana | Mede a distância em linha reta entre dois vetores. | Diminui |
Se os embeddings forem normalizados (magnitude = 1,0), DOT_PRODUCT() será uma escolha eficiente. Para dados não normalizados, faça testes com COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() para determinar qual produz os melhores resultados para seu caso de uso.
Para mais informações, consulte Escolher entre funções de distância de vetor na documentação do Spanner.
Vizinhos mais próximos aproximados (ANN)
A pesquisa de ANN é projetada para conjuntos de dados muito grandes em que a pesquisa exata de KNN se torna muito lenta ou cara. Ele usa um índice vetorial para fornecer resultados rápidos com uma pequena compensação no recall.
Sem trabalhadores de computação dedicados, a pesquisa de ANN no Spanner Omni é compatível com conjuntos de dados de até 1 milhão de vetores para vetores de até 128 dimensões de comprimento. Se os vetores tiverem mais dimensões, o número de vetores compatíveis vai diminuir proporcionalmente. O Spanner Omni é compatível com tabelas maiores quando você implanta workers para criar seus índices de vetores. Para mais informações, consulte Criar e gerenciar índices de vetores.
Realizar uma pesquisa de ANN com índices de vetor
Para realizar uma pesquisa de ANN, use funções de distância aproximada, como APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE() ou APPROX_DOT_PRODUCT(). Essas funções exigem:
Um índice vetorial na coluna de embedding.
Uma cláusula
ORDER BYusando a função de distância aproximada.Uma cláusula
LIMITpara especificar o número de resultados.
Para mais informações, consulte Encontrar vizinhos mais próximos aproximados (ANN) e consultar embeddings de vetores na documentação do Spanner.
Criar e gerenciar índices vetoriais
Ao criar um índice de vetores, especifique o vector_length da coluna de embedding e use a cláusula STORING para incluir outras colunas e acelerar a filtragem.
Confira um exemplo de como criar um índice vetorial:
CREATE VECTOR INDEX INDEX_NAME
ON TABLE_NAME(EMBEDDING_COLUMN)
OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);
Para mais informações, consulte Criar e gerenciar índices de vetores na documentação do Spanner.
A criação de índices vetoriais em tabelas grandes que excedem os limites em Vizinhos mais próximos aproximados (ANN) exige trabalhadores de computação dedicados para descarregar o processamento dos servidores do Spanner Omni. Para mais informações, consulte Implantar e gerenciar workers.
Usar amostragem ao criar um índice de vetores
Para conjuntos de dados grandes, como tabelas com dezenas de milhões de linhas ou mais, é possível reduzir o tempo de criação do índice de vetor especificando uma porcentagem de amostragem. Use a opção clustering_sampling_percentage na
instrução CREATE VECTOR INDEX para criar uma amostra de um subconjunto do conjunto de dados ao
criar a árvore de índice inicial.
Como diretriz geral, tente ter pelo menos 50 linhas amostradas por folha. Por exemplo, para um conjunto de dados de 10 milhões de linhas com 10.000 folhas, uma taxa de amostragem de 5% (clustering_sampling_percentage = 5) amostra 500.000 linhas ou 50 linhas por folha, como mostra o exemplo a seguir:
CREATE VECTOR INDEX VectorIndex
ON BaseTable(Embedding)
WHERE Embedding IS NOT NULL
OPTIONS (
tree_depth = 3,
num_leaves = 10000,
num_branches = 100,
leaf_scatter_factor = 32,
distance_type = 'COSINE',
min_branch_splits = 10,
min_leaf_splits = 10,
clustering_sampling_percentage = 5
);
Em comparação com a criação de um índice no conjunto de dados completo sem amostragem, a amostragem aumenta a latência de consulta e o uso da CPU por consulta para a mesma capacidade de recall desejada. Aumentar a porcentagem de amostragem aumenta o tempo de criação do índice, mas reduz a latência da consulta e o custo de CPU por consulta. Escolha uma porcentagem de amostragem que equilibre o tempo de criação do índice e o desempenho da consulta com base nos recursos de computação disponíveis para a criação do índice.
Práticas recomendadas de indexação vetorial
Para manter um alto desempenho e recall da pesquisa:
Ajustar opções de índice: ajuste
num_leavesenum_leaves_to_searchcom base no tamanho dos dados e nos requisitos de performance.Recrie periodicamente: recrie o índice se a distribuição dos vetores mudar significativamente com o tempo.
Use a filtragem de maneira eficaz: armazene colunas filtradas com frequência no índice para melhorar a eficiência da pesquisa.
Para mais informações, consulte Práticas recomendadas de indexação vetorial na documentação do Spanner.