Esta página descreve como encontrar os vizinhos mais próximos aproximados (ANN) e consultar incorporações de vetores através das funções de distância ANN.
Quando um conjunto de dados é pequeno, pode usar o algoritmo K-nearest neighbors (KNN) para encontrar os vetores k mais próximos exatos. No entanto, à medida que o conjunto de dados cresce, a latência e o custo de uma pesquisa KNN também aumentam. Pode usar a ANN para encontrar os k-vizinhos mais próximos aproximados com uma latência e um custo significativamente reduzidos.
Numa pesquisa ANN, os vetores devolvidos não são os k vizinhos mais próximos verdadeiros, porque a pesquisa ANN calcula distâncias aproximadas e pode não analisar todos os vetores no conjunto de dados. Ocasionalmente, são devolvidos alguns vetores que não estão entre os k vizinhos mais próximos. Este processo é conhecido como perda de memorização. A quantidade de perda de capacidade de memorização aceitável depende do exemplo de utilização, mas, na maioria dos casos, perder um pouco de capacidade de memorização em troca de um desempenho melhorado da base de dados é uma compensação aceitável.
Para mais detalhes acerca das funções de distância aproximada suportadas no Spanner, consulte as seguintes páginas de referência do GoogleSQL:
Consultar incorporações de vetores
O Spanner acelera as pesquisas de vetores de vizinhos mais próximos aproximados (ANN) através de um índice de vetores. Pode usar um índice vetorial para consultar incorporações vetoriais. Para consultar incorporações vetoriais, tem de criar um índice vetorial primeiro. Em seguida, pode usar qualquer uma das três funções de distância aproximada para encontrar o ANN.
As restrições ao usar as funções de distância aproximada incluem o seguinte:
- A função de distância aproximada tem de calcular a distância entre uma coluna de incorporação e uma expressão constante (por exemplo, um parâmetro ou um literal).
- O resultado da função de distância aproximada tem de ser usado numa cláusula
ORDER BY
como a única chave de ordenação, e tem de ser especificado umLIMIT
após oORDER BY
. - A consulta tem de filtrar explicitamente as linhas que não estão indexadas. Na maioria dos casos,
isto significa que a consulta tem de incluir uma cláusula
WHERE <column_name> IS NOT NULL
que corresponda à definição do índice vetorial, a menos que a coluna já esteja marcada comoNOT NULL
na definição da tabela.
Para ver uma lista detalhada das limitações, consulte a página de referência da função de distância aproximada.
Exemplos
Considere uma tabela Documents
que tenha uma coluna DocEmbedding
de incorporações de texto pré-calculadas da coluna de bytes DocContents
e uma coluna NullableDocEmbedding
preenchida a partir de outras origens que podem ser nulas.
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
Para pesquisar os 100 vetores mais próximos de [1.0, 2.0, 3.0]
:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
Se a coluna de incorporação for anulável:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
O que se segue?
Saiba mais sobre os índices vetoriais do Spanner.
Saiba mais sobre as funções GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
eAPPROXIMATE_DOT_PRODUCT()
.Saiba mais acerca das declarações GoogleSQL
VECTOR INDEX
.Saiba mais acerca das práticas recomendadas para o índice vetorial.
Experimente o guia Começar a usar a pesquisa vetorial do Spanner para ver um exemplo passo a passo da utilização da ANN.