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 vetores 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 carga (ETL).
Os tópicos neste documento se aplicam ao Spanner Omni da mesma forma que ao Spanner.
Visão geral da pesquisa vetorial
Com a pesquisa vetorial, é possível encontrar itens semanticamente semelhantes representando dados como vetores numéricos (embeddings). O Spanner Omni é compatível com dois métodos principais de pesquisa:
K-vizinhos mais próximos (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 aproximados mais próximos (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 é especialmente eficiente quando combinada com outros recursos:
| Combinação | Benefício |
|---|---|
| Pesquisa vetorial com filtragem SQL | Combine de maneira eficiente a pesquisa vetorial com filtros (por exemplo, "Encontrar imagens semelhantes em que a categoria é 'sapatos' e o preço é inferior a 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 de vetor 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 perto (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 em um 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 vetorial
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 foi criada 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 troca no recall.
A pesquisa de vizinho mais próximo aproximado (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 aceitos diminuirá proporcionalmente.
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 BYque usa 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 vetor na documentação do Spanner.
Criar e gerenciar índices vetoriais
Ao criar um índice de vetor, é necessário especificar o vector_length da coluna de incorporação e usar a cláusula STORING para incluir outras colunas e acelerar a filtragem.
Confira um exemplo de como criar um índice de vetor:
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.
Práticas recomendadas para indexação vetorial
Para manter um alto desempenho de pesquisa e recall:
Ajuste as opções de índice: ajuste
num_leavesenum_leaves_to_searchcom base no tamanho dos dados e nos requisitos de desempenho.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.