Usa la búsqueda de vectores con Spanner Graph

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

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

  1. Agrega una columna nueva, nick_name_embeddings, a la tabla de entrada Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Crea incorporaciones para el texto en la columna nick_name y propagarlas en la nueva columna nick_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;
    
  4. Agrega dos columnas nuevas 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 incorporaciones para el texto en la columna notes y replícalas en la columna notes_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;
    
  6. Después de agregar columnas nuevas a las tablas de entrada Account y AccountTransferAccount, 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?