Buscar vecinos más cercanos aproximados (ANN) y consultar inserciones de vectores

En esta página se describe cómo buscar los vecinos más cercanos aproximados (ANN) y consultar las inserciones de vectores mediante las funciones de distancia de ANN.

Cuando un conjunto de datos es pequeño, puedes usar K-vecinos más cercanos (KNN) para encontrar los vectores más cercanos. Sin embargo, a medida que aumenta el conjunto de datos, también lo hacen la latencia y el coste de una búsqueda de vecinos más cercanos. Puedes usar ANN para encontrar los k vecinos más cercanos aproximados con una latencia y un coste significativamente reducidos.

En una búsqueda de ANN, los k vectores devueltos no son los k vecinos más cercanos reales, ya que la búsqueda de ANN calcula distancias aproximadas y es posible que no tenga en cuenta todos los vectores del conjunto de datos. En ocasiones, se devuelven algunos vectores que no se encuentran entre los k vecinos más cercanos. Este fenómeno se conoce como pérdida de recuerdo. La pérdida de memoria que puedes aceptar depende del caso de uso, pero, en la mayoría de los casos, perder un poco de memoria a cambio de mejorar el rendimiento de la base de datos es una compensación aceptable.

Para obtener más información sobre las funciones de distancia aproximada admitidas en Spanner, consulta las siguientes páginas de referencia de GoogleSQL:

Consultar incrustaciones de vectores

Spanner acelera las búsquedas vectoriales del elemento aproximado más cercano (ANN) mediante un índice vectorial. Puedes usar un índice de vectores para consultar incrustaciones de vectores. Para consultar incrustaciones de vectores, primero debes crear un índice de vectores. Después, puedes usar cualquiera de las tres funciones de distancia aproximada para encontrar el ANN.

Estas son algunas de las restricciones que se aplican al usar las funciones de distancia aproximada:

  • La función de distancia aproximada debe calcular la distancia entre una columna de inserción y una expresión constante (por ejemplo, un parámetro o un literal).
  • La salida de la función de distancia aproximada se debe usar en una cláusula ORDER BY como única clave de ordenación y se debe especificar un LIMIT después del ORDER BY.
  • La consulta debe filtrar explícitamente las filas que no estén indexadas. En la mayoría de los casos, esto significa que la consulta debe incluir una cláusula WHERE <column_name> IS NOT NULL que coincida con la definición del índice vectorial, a menos que la columna ya esté marcada como NOT NULL en la definición de la tabla.

Para ver una lista detallada de las limitaciones, consulta la página de referencia de la función de distancia aproximada.

Ejemplos

Supongamos que tenemos una tabla Documents que tiene una columna DocEmbedding de inserciones de texto precalculadas a partir de la columna DocContents de bytes y una columna NullableDocEmbedding rellenada con datos de otras fuentes que pueden ser nulos.

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 buscar los 100 vectores más cercanos a [1.0, 2.0, 3.0], sigue estos pasos:

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

Si la columna de inserción admite valores nulos:

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

Siguientes pasos