En esta página, se describe cómo usar la búsqueda de vectores en Spanner Graph para encontrar vecinos K-nearest (KNN) y vecinos más cercanos aproximados (ANN). Puedes usar funciones de distancia vectorial para realizar búsquedas vectoriales de KNN y ANN en casos de uso como la búsqueda de similitud o la generación de recuperación aumentada para aplicaciones de IA generativa.
Spanner Graph admite las siguientes funciones de distancia para realizar la búsqueda de similitudes de vectores de 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 embeddings de vectores de tu conjunto de datos están normalizadas, puedes usarDOT_PRODUCT()
como función de distancia.
Para obtener más información, consulta Cómo realizar una búsqueda de similitud vectorial en Spanner a través de la búsqueda de los k-vecinos más cercanos.
Spanner Graph también admite las siguientes funciones de distancia aproximada para realizar la búsqueda 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 incorporaciones de vectores en tu conjunto de datos están normalizadas, puedes usarDOT_PRODUCT()
como función de distancia.
Para obtener más información, consulta Cómo encontrar vecinos más cercanos aproximados, crear un índice vectorial y consultar embeddings de vectores.
Antes de comenzar
Para ejecutar los ejemplos de este documento, primero debes seguir los pasos que se indican en Configura y consulta Spanner Graph para hacer lo siguiente:
- Crea una instancia.
- Crea una base de datos con un esquema de Spanner Graph.
- Inserta datos esenciales del gráfico.
Después de insertar los datos esenciales del gráfico, realiza las siguientes actualizaciones en tu base de datos.
Cómo insertar datos de vectores adicionales en la base de datos de gráficos
Para realizar las actualizaciones necesarias en tu base de datos de gráficos, haz lo siguiente:
Agrega una columna nueva,
nick_name_embeddings
, a la tabla de entradaAccount
.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
Agrega 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 incorporaciones para el texto en la columna
nick_name
y propagarlas en la nueva columnanick_name_embeddings
.Para generar incorporaciones de Vertex AI para tus datos operativos en Spanner Graph, consulta Obtén incorporaciones de texto de Vertex AI.
A modo de ejemplo, 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;
Agrega dos columnas nuevas 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 incorporaciones para el texto en la columna
notes
y replícalas en la columnanotes_embeddings
.Para generar incorporaciones de Vertex AI para tus datos operativos en Spanner Graph, consulta Obtén incorporaciones de texto de Vertex AI.
A modo de ejemplo, 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 agregar columnas nuevas a las tablas de entrada
Account
yAccountTransferAccount
, actualiza la definición del gráfico de propiedades con las siguientes instrucciones. Para obtener más información, consulta Cómo actualizar definiciones de nodos o aristas existentes.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 );
Encuentra los K vecinos más cercanos
En el siguiente ejemplo, usa la función EUCLIDEAN_DISTANCE()
para realizar la búsqueda de vectores de KNN
en los nodos y los bordes de tu base de datos de grafos.
Realiza una búsqueda de vectores de KNN en nodos de grafos
Puedes realizar una búsqueda de vectores de KNN en la propiedad nick_name_embeddings
del nodo Account
. Esta búsqueda de vectores de KNN muestra 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 placer y vacaciones,
que se representa con la incorporación de vectores [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 | Ahorros para unas vacaciones tropicales refrescantes |
Dana | Ahorrar para viajar |
Realiza una búsqueda de vectores de KNN en las aristas del gráfico
Puedes realizar una búsqueda de vectores de KNN en la propiedad notes_embeddings
del borde Owns
. Esta búsqueda de vectores de KNN muestra el name
del propietario de la cuenta y el notes
de la transferencia. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos de K para gastos de comida, que se representa con la incorporación de vectores [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 | por el costo compartido de la cena |
Dana | me encantó el almuerzo |
Crea un índice vectorial y encuentra vecinos más cercanos aproximados
Para realizar una búsqueda de ANN, debes crear un índice de vectores especializado que Spanner Graph use para acelerar la búsqueda de vectores. El índice de vectores debe usar una métrica de distancia específica. Para elegir la métrica de distancia más adecuada para tu caso de uso, configura el parámetro distance_type
en uno de COSINE
, DOT_PRODUCT
o EUCLIDEAN
. Para obtener más información, consulta Sentencias de VECTOR INDEX.
En el siguiente ejemplo, creas un índice vectorial con el tipo de distancia euclidiana 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);
Realiza una búsqueda de vectores de ANN en nodos de grafos
Después de crear un índice de vectores, puedes realizar una búsqueda de vectores de ANN en la propiedad nick_name
del nodo Account
. La búsqueda vectorial de ANN muestra 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 para cuentas de viajes de placer y vacaciones, que se representa con la incorporación de vectores [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 consultas.
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 | Ahorros para unas vacaciones tropicales refrescantes |
Dana | Ahorrar para viajar |
¿Qué sigue?
- Realiza una búsqueda de similitud de vectores en Spanner encontrando los K vecinos más cercanos.
- Encuentra vecinos más cercanos aproximados, crea un índice vectorial y consulta incorporaciones de vectores.
- Obtén incorporaciones de texto de Vertex AI
- Obtén más información sobre las consultas de Spanner Graph.
- Conoce las prácticas recomendadas para ajustar las consultas.