Encontre os vizinhos mais próximos aproximados (ANN) e consulte incorporações de vetores

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 um LIMIT após o ORDER 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 como NOT 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?