En esta página se describe cómo usar la búsqueda vectorial en Spanner Graph para encontrar los K vecinos más cercanos (KNN) y los vecinos más cercanos aproximados (ANN). Puedes usar funciones de distancia de vectores para realizar búsquedas de vectores KNN y ANN en casos prácticos como la búsqueda de similitudes o la generación aumentada por recuperación para aplicaciones de IA generativa.
Spanner Graph admite las siguientes funciones de distancia para realizar búsquedas de similitud de vectores KNN:
COSINE_DISTANCE()
: mide la distancia más corta entre dos vectores.EUCLIDEAN_DISTANCE()
: mide el coseno del ángulo entre dos vectores.DOT_PRODUCT()
: calcula el coseno del ángulo multiplicado por el producto de las magnitudes de los vectores correspondientes. Si sabes que todas las inserciones vectoriales de tu conjunto de datos están normalizadas, puedes usarDOT_PRODUCT()
como función de distancia.
Para obtener más información, consulta Realizar una búsqueda de similitud de vectores en Spanner buscando los K vecinos más cercanos.
Spanner Graph también admite las siguientes funciones de distancia aproximada para realizar búsquedas de similitud de vectores de ANN:
APPROX_COSINE_DISTANCE
: mide la distancia más corta aproximada entre dos vectores.APPROX_EUCLIDEAN_DISTANCE
: mide el coseno aproximado del ángulo entre dos vectores.APPROX_DOT_PRODUCT
: calcula el coseno aproximado del ángulo multiplicado por el producto de las magnitudes de los vectores correspondientes. Si sabes que todas las inserciones vectoriales de tu conjunto de datos están normalizadas, puedes usarDOT_PRODUCT()
como función de distancia.
Para obtener más información, consulta Buscar los vecinos más cercanos aproximados, crear un índice vectorial y consultar incrustaciones de vectores.
Antes de empezar
Para ejecutar los ejemplos de este documento, primero debes seguir los pasos que se indican en Configurar y consultar Spanner Graph para hacer lo siguiente:
- Crea una instancia.
- Crea una base de datos con un esquema de Spanner Graph.
- Inserta los datos esenciales del gráfico.
Después de insertar los datos esenciales del gráfico, haz los siguientes cambios en tu base de datos.
Insertar datos de vectores adicionales en la base de datos de grafos
Para hacer los cambios necesarios en tu base de datos de grafos, sigue estos pasos:
Añade una nueva columna,
nick_name_embeddings
, a la tabla de entradaAccount
.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
Añada datos a la columna
nick_name
.UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7; UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16; UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;
Crea las inserciones del texto de la columna
nick_name
y colócalas en la nueva columnanick_name_embeddings
.Para generar inserciones de Vertex AI para tus datos operativos en Spanner Graph, consulta Obtener inserciones de texto de Vertex AI.
Con fines ilustrativos, en nuestros ejemplos se usan valores de vectores artificiales de baja dimensión.
UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;
Añada dos columnas a la tabla de entrada
AccountTransferAccount
:notes
ynotes_embeddings
.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
Crea las inserciones del texto de la columna
notes
y rellena la columnanotes_embeddings
con ellas.Para generar inserciones de Vertex AI para tus datos operativos en Spanner Graph, consulta Obtener inserciones de texto de Vertex AI.
Con fines ilustrativos, en nuestros ejemplos se usan valores de vectores artificiales de baja dimensión.
UPDATE AccountTransferAccount SET notes = "for shared cost of dinner", notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = "fees for tuition", notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7] WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'loved the lunch', notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9] WHERE id = 20 AND to_id = 16;
Después de añadir nuevas columnas a las tablas de entrada
Account
yAccountTransferAccount
, actualice la definición del gráfico de propiedades con las siguientes instrucciones. Para obtener más información, consulta Actualizar definiciones de nodos o aristas.CREATE OR REPLACE PROPERTY GRAPH FinGraph NODE TABLES (Account, Person) EDGE TABLES ( PersonOwnAccount SOURCE KEY (id) REFERENCES Person (id) DESTINATION KEY (account_id) REFERENCES Account (id) LABEL Owns, AccountTransferAccount SOURCE KEY (id) REFERENCES Account (id) DESTINATION KEY (to_id) REFERENCES Account (id) LABEL Transfers );
Buscar los vecinos más cercanos
En el siguiente ejemplo, se usa la función EUCLIDEAN_DISTANCE()
para realizar una búsqueda de vectores KNN en los nodos y los bordes de la base de datos de grafos.
Realizar una búsqueda vectorial de k vecinos más cercanos en nodos de gráficos
Puedes realizar una búsqueda de vectores KNN en la propiedad nick_name_embeddings
del nodo Account
. Esta búsqueda de vectores de KNN devuelve el name
del propietario de la cuenta y el nick_name
de la cuenta. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos de K para cuentas de viajes de ocio y vacaciones, que se representa mediante la inserción de vector [0.2, 0.4, 0.9, 0.6]
.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Resultados
name | nick_name |
---|---|
Alex | Fondo para unas vacaciones tropicales refrescantes |
Dana | Ahorrar para viajar |
Realizar una búsqueda vectorial de los k vecinos más cercanos en las aristas de un gráfico
Puedes realizar una búsqueda de vectores KNN en la propiedad notes_embeddings
del borde Owns
. Esta búsqueda de vectores de KNN devuelve el name
del propietario de la cuenta y el notes
de la transferencia. En el ejemplo siguiente, el resultado muestra los dos vecinos más cercanos de gastos en comida, que se representa mediante la inserción de vector [0.2, 0.4, 0.9, 0.6]
.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
-- An illustrative vector embedding for 'food expenses'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Resultados
name | notas |
---|---|
Lee | para compartir el coste de la cena |
Dana | Me ha encantado la comida |
Crear un índice vectorial y buscar los vecinos más cercanos aproximados
Para realizar una búsqueda de ANN, debes crear un índice de vectores especializado
que Spanner Graph usa para acelerar la búsqueda de vectores. El índice vector
debe usar una métrica de distancia específica. Puedes elegir la métrica de distancia que mejor se adapte a tu caso práctico configurando el parámetro distance_type
con uno de los siguientes valores: COSINE
, DOT_PRODUCT
o EUCLIDEAN
. Para obtener más información, consulta las instrucciones VECTOR INDEX.
En el siguiente ejemplo, se crea un índice vectorial con el tipo de distancia euclídea en la columna nick_name_embedding
de la tabla de entrada Account
:
CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);
Realizar búsquedas vectoriales de ANN en nodos de gráficos
Después de crear un índice vectorial, puedes realizar una búsqueda vectorial de ANN en la propiedad nick_name
del nodo Account
. La búsqueda vectorial de ANN devuelve el name
del propietario de la cuenta y el nick_name
de la cuenta. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos aproximados de cuentas de viajes de ocio y vacaciones, que se representa mediante la inserción de vector [0.2, 0.4, 0.9, 0.6]
.
La sugerencia de gráfico obliga al optimizador de consultas a usar el índice vectorial especificado en el plan de ejecución de la consulta.
GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2
NEXT
MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;
Resultados
name | nick_name |
---|---|
Alex | Fondo para unas vacaciones tropicales refrescantes |
Dana | Ahorrar para viajar |
Siguientes pasos
- Realiza una búsqueda de similitud de vectores en Spanner encontrando los K vecinos más cercanos.
- Encuentra los vecinos más cercanos aproximados, crea un índice de vectores y consulta las incrustaciones de vectores.
- Obtener las inserciones de texto de Vertex AI
- Consulta más información sobre las consultas de gráficos de Spanner.
- Consulta las prácticas recomendadas para optimizar las consultas.