Usar a pesquisa vetorial com o Spanner Graph

Esta página descreve como usar a pesquisa vetorial no Spanner Graph para encontrar os K vizinhos mais próximos (KNN) e os vizinhos mais próximos aproximados (ANN). É possível usar funções de distância de vetor para realizar pesquisas de vetor KNN e ANN em casos de uso como pesquisa de similaridade ou geração aumentada por recuperação para aplicativos de IA generativa.

O Spanner Graph é compatível com as seguintes funções de distância para realizar pesquisa de similaridade de vetores KNN:

  • COSINE_DISTANCE(): mede a menor distância entre dois vetores.
  • EUCLIDEAN_DISTANCE(): mede o cosseno do ângulo entre dois vetores.
  • DOT_PRODUCT(): calcula o cosseno do ângulo multiplicado pelo produto das magnitudes dos vetores correspondentes. Se você souber que todos os embeddings de vetor no seu conjunto de dados estão normalizados, use DOT_PRODUCT() como uma função de distância.

Para mais informações, consulte Realizar pesquisa de similaridade vetorial no Spanner encontrando os vizinhos K mais próximos.

O Spanner Graph também é compatível com as seguintes funções de distância aproximada para realizar a pesquisa de similaridade de vetores ANN:

  • APPROX_COSINE_DISTANCE: mede a distância aproximada mais curta entre dois vetores.
  • APPROX_EUCLIDEAN_DISTANCE: mede o cosseno aproximado do ângulo entre dois vetores.
  • APPROX_DOT_PRODUCT: calcula o cosseno aproximado do ângulo multiplicado pelo produto das magnitudes dos vetores correspondentes. Se você souber que todos os embeddings de vetor no seu conjunto de dados estão normalizados, use DOT_PRODUCT() como uma função de distância.

Para mais informações, consulte Encontrar vizinhos mais próximos aproximados, criar índice vetorial e consultar embeddings de vetor.

Antes de começar

Para executar os exemplos neste documento, primeiro siga as etapas em Configurar e consultar o Spanner Graph para fazer o seguinte:

  1. Crie uma instância.
  2. Crie um banco de dados com um esquema do Spanner Graph.
  3. Inserir dados essenciais do gráfico.

Depois de inserir os dados essenciais do gráfico, faça as seguintes atualizações no seu banco de dados.

Inserir mais dados vetoriais no banco de dados de grafos

Para fazer as atualizações necessárias no banco de dados de gráficos, faça o seguinte:

  1. Adicione uma nova coluna, nick_name_embeddings, à tabela de entrada Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. Adicione dados à coluna 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. Crie incorporações para o texto na coluna nick_name e preencha a nova coluna nick_name_embeddings com elas.

    Para gerar embeddings do Gemini Enterprise Agent Platform para seus dados operacionais no Spanner Graph, consulte Receber embeddings de texto da Agent Platform.

    Para fins ilustrativos, nossos exemplos usam valores de vetor artificiais e de baixa dimensão.

    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. Adicione duas novas colunas à tabela de entrada AccountTransferAccount: notes e notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Crie embeddings para o texto na coluna notes e preencha a coluna notes_embeddings.

    Para gerar embeddings da Agent Platform para seus dados operacionais no Spanner Graph, consulte Receber embeddings de texto da Agent Platform.

    Para fins ilustrativos, nossos exemplos usam valores de vetor artificiais e de baixa dimensão.

    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. Depois de adicionar novas colunas às tabelas de entrada Account e AccountTransferAccount, atualize a definição do gráfico de propriedades usando as instruções a seguir. Para mais informações, consulte Atualizar definições de nós ou arestas.

    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
    );
    

Encontrar os K vizinhos mais próximos

No exemplo a seguir, use a função EUCLIDEAN_DISTANCE() para realizar uma pesquisa de vetor KNN nos nós e nas arestas do banco de dados de gráficos.

Realizar pesquisa de vetor KNN em nós de gráfico

É possível realizar uma pesquisa de vetor KNN na propriedade nick_name_embeddings do nó Account. Essa pesquisa de vetor KNN retorna o name do proprietário da conta e o nick_name da conta. No exemplo a seguir, o resultado mostra os dois principais vizinhos mais próximos de K para contas de viagens de lazer e férias, que é representado pelo embedding de vetor [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

nome nick_name
Alex Fundo para férias tropicais revigorantes
Dana Economizar para viajar

Realizar pesquisa de vetor KNN em arestas de gráfico

É possível realizar uma pesquisa de vetor KNN na propriedade notes_embeddings da aresta Owns. Essa pesquisa de vetor KNN retorna o name do proprietário da conta e o notes da transferência. No exemplo a seguir, o resultado mostra os dois principais vizinhos mais próximos de K para gastos com alimentação, que é representado pelo embedding de vetor [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

nome IA
Lee para dividir o custo do jantar
Dana adorei o almoço

Criar um índice vetorial e encontrar vizinhos mais próximos aproximados

Para realizar uma pesquisa de ANN, crie um índice de vetor especializado que o Spanner Graph usa para acelerar a pesquisa de vetor. O índice de vetor precisa usar uma métrica de distância específica. Para escolher a métrica de distância mais adequada ao seu caso de uso, defina o parâmetro distance_type como COSINE, DOT_PRODUCT ou EUCLIDEAN. Para mais informações, consulte Instruções VECTOR INDEX.

No exemplo a seguir, você cria um índice vetorial usando o tipo de distância euclidiana na coluna nick_name_embedding da tabela 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 pesquisa de vetor de ANN em nós de gráfico

Depois de criar um índice de vetor, é possível realizar uma pesquisa de vetor de ANN na propriedade nick_name do nó Account. A pesquisa de vetor ANN retorna o name do proprietário da conta e o nick_name da conta. No exemplo a seguir, o resultado mostra os dois vizinhos mais próximos aproximados para contas de viagens de lazer e férias, que é representado pelo embedding de vetor [0.2, 0.4, 0.9, 0.6].

A dica de gráfico força o otimizador de consultas a usar o índice de vetor especificado no plano de execução da 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

nome nick_name
Alex Fundo para férias tropicais revigorantes
Dana Economizar para viajar

A seguir