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 los K vecinos más cercanos (KNN) y los vecinos más cercanos aproximados (ANN). Puedes usar funciones de distancia vectorial para realizar búsquedas de vectores KNN y ANN para casos de uso como la búsqueda de similitud o la generación aumentada por recuperación para aplicaciones de IA generativa.

Spanner Graph admite las siguientes funciones de distancia para realizar la búsqueda 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 vectoriales correspondientes. Si sabes que todas las incorporaciones 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 Realiza una búsqueda de similitud de vectores en Spanner encontrando 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 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 vectoriales correspondientes. Si sabes que todas las incorporaciones 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 Encuentra vecinos más cercanos aproximados, crea un índice de vectores y consulta incorporaciones 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.

Inserta datos vectoriales 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 de la columna nick_name y propaga la nueva columna nick_name_embeddings.

    Para generar incorporaciones de Agent Platform de Gemini Enterprise para tus datos operativos en Spanner Graph, consulta Obtén incorporaciones de texto de Agent Platform.

    A modo de ilustración, nuestros ejemplos usan valores vectoriales 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 de la columna notes y propaga la columna notes_embeddings.

    Para generar incorporaciones de Agent Platform para tus datos operativos en Spanner Graph, consulta Obtén incorporaciones de texto de Agent Platform.

    A modo de ilustración, nuestros ejemplos usan valores vectoriales 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 Actualiza las 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 KNN en los nodos y las aristas de tu base de datos de gráficos.

Realiza la búsqueda de vectores KNN en los nodos del gráfico

Puedes realizar una búsqueda de vectores KNN en la propiedad nick_name_embeddings del nodo Account. Esta búsqueda de vectores KNN muestra el name y el nick_name de la cuenta. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos principales para cuentas para viajes de placer y vacaciones, que está representado por el embedding 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

nombre nick_name
Alex Fondo para unas vacaciones tropicales refrescantes
Dana Ahorro para viajar

Realiza la búsqueda de vectores KNN en las aristas del gráfico

Puedes realizar una búsqueda de vectores KNN en la propiedad notes_embeddings de la arista Owns. Esta búsqueda de vectores KNN muestra el name del propietario de la cuenta y las notes de la transferencia. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos principales K-nearest neighbors para gastos de comida, que está representado por el [0.2, 0.4, 0.9, 0.6] embedding de vector.

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

nombre notas
Lee para el costo compartido de la cena
Dana Me encantó el almuerzo

Crea un índice de vectores y encuentra los 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. Puedes elegir la métrica de distancia más adecuada para tu caso de uso si configuras el parámetro distance_type en uno de los siguientes valores: COSINE, DOT_PRODUCT o EUCLIDEAN. Para obtener más información, consulta las instrucciones de VECTOR INDEX.

En el siguiente ejemplo, se crea un índice de vectores 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 la búsqueda de vectores ANN en los nodos del gráfico

Después de crear un índice de vectores, puedes realizar una búsqueda de vectores ANN en la propiedad nick_name del nodo Account. La búsqueda de vectores ANN muestra el del propietario de la cuenta name y el nick_name de la cuenta. En el siguiente ejemplo, el resultado muestra los dos vecinos más cercanos aproximados principales para cuentas para viajes de placer y vacaciones, que está representado por el embedding de vector [0.2, 0.4, 0.9, 0.6].

La sugerencia de gráfico obliga al optimizador de consultas a usar el índice de vectores 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

nombre nick_name
Alex Fondo para unas vacaciones tropicales refrescantes
Dana Ahorro para viajar

¿Qué sigue?