Usar la búsqueda vectorial con Spanner Graph

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 usar DOT_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 usar DOT_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:

  1. Crea una instancia.
  2. Crea una base de datos con un esquema de Spanner Graph.
  3. 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:

  1. Añade una nueva columna, nick_name_embeddings, a la tabla de entrada Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Crea las inserciones del texto de la columna nick_name y colócalas en la nueva columna nick_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;
    
  4. Añada dos columnas a la tabla de entrada AccountTransferAccount: notes y notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Crea las inserciones del texto de la columna notes y rellena la columna notes_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;
    
  6. Después de añadir nuevas columnas a las tablas de entrada Account y AccountTransferAccount, 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