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 unLIMIT
después delORDER 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 comoNOT 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
Consulta más información sobre los índices vectoriales de Spanner.
Consulta más información sobre las funciones GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
yAPPROXIMATE_DOT_PRODUCT()
.Consulta más información sobre las instrucciones
VECTOR INDEX
de GoogleSQL.Consulta más información sobre las prácticas recomendadas para los índices vectoriales.
Consulta el artículo Primeros pasos con la búsqueda vectorial de Spanner para ver un ejemplo paso a paso de cómo usar ANN.