En esta página, se describe cómo encontrar vecinos más cercanos aproximados (ANN) y consultar incorporaciones de vectores con las funciones de distancia de ANN.
Cuando un conjunto de datos es pequeño, puedes usar el algoritmo de K-vecinos más cercanos (KNN) para encontrar los vectores k más cercanos exactos. Sin embargo, a medida que crece tu conjunto de datos, también aumentan la latencia y el costo de una búsqueda de KNN. Puedes usar ANN para encontrar los k vecinos más cercanos aproximados con una latencia y un costo significativamente reducidos.
En una búsqueda de ANN, los vectores k devueltos no son los k vecinos más cercanos verdaderos, ya que la búsqueda de ANN calcula distancias aproximadas y es posible que no considere todos los vectores del conjunto de datos. En ocasiones, se devuelven algunos vectores que no se encuentran entre los k vecinos más cercanos. Esto se conoce como pérdida de recuperación. La cantidad de pérdida de recuperación que es aceptable para ti depende del caso de uso, pero, en la mayoría de los casos, perder un poco de recuperación a cambio de un mejor rendimiento de la base de datos es una compensación aceptable.
Para obtener más detalles sobre las funciones de distancia aproximada compatibles con Spanner, consulta las siguientes páginas de referencia de GoogleSQL:
Consulta embeddings de vectores
Spanner acelera las búsquedas de vectores de vecino más cercano aproximado (ANN) con un índice de vectores. Puedes usar un índice de vectores para consultar embeddings de vectores. Para consultar embeddings de vectores, primero debes crear un índice de vectores. Luego, puedes usar cualquiera de las tres funciones de distancia aproximada para encontrar el ANN.
Las restricciones cuando se usan las funciones de distancia aproximada incluyen lo siguiente:
- La función de distancia aproximada debe calcular la distancia entre una columna de incorporación y una expresión constante (por ejemplo, un parámetro o un literal).
- El resultado de la función de distancia aproximada se debe usar en una cláusula
ORDER BY
como la única clave de ordenamiento, y se debe especificar unLIMIT
después delORDER BY
. - La consulta debe filtrar de forma explícita 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 de vectores, a menos que la columna ya esté marcada comoNOT NULL
en la definición de la tabla.
Para obtener una lista detallada de las limitaciones, consulta la página de referencia de la función de distancia aproximada.
Ejemplos
Considera una tabla Documents
que tiene una columna DocEmbedding
de embeddings de texto precalculados de la columna de bytes DocContents
y una columna NullableDocEmbedding
propagada desde otras fuentes que podrían 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 buscar los 100 vectores más cercanos a [1.0, 2.0, 3.0]
, haz lo siguiente:
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 embedding admite valores nulos, sucede lo siguiente:
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
¿Qué sigue?
Obtén más información sobre los índices vectoriales de Spanner.
Obtén más información sobre las funciones
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
yAPPROXIMATE_DOT_PRODUCT()
de GoogleSQL.Obtén más información sobre las sentencias
VECTOR INDEX
de GoogleSQL.Obtén más información sobre las prácticas recomendadas para los índices vectoriales.
Prueba la guía para comenzar a usar la Búsqueda de vectores de Spanner para ver un ejemplo paso a paso del uso de la ANN.