Use 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). Pode usar funções de distância vetorial para realizar a pesquisa vetorial KNN e ANN para casos de utilização, como a pesquisa de semelhanças ou a geração aumentada de recuperação para aplicações de IA generativa.

O Spanner Graph suporta as seguintes funções de distância para realizar uma pesquisa de similaridade de vetores KNN:

  • COSINE_DISTANCE(): mede a distância mais curta 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 souber que todas as incorporações de vetores no seu conjunto de dados estão normalizadas, pode usar DOT_PRODUCT() como uma função de distância.

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

O Spanner Graph também suporta as seguintes funções de distância aproximada para realizar uma pesquisa de similaridade de vetores ANN:

  • APPROX_COSINE_DISTANCE: mede a distância mais curta aproximada 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 souber que todas as incorporações de vetores no seu conjunto de dados estão normalizadas, pode usar DOT_PRODUCT() como uma função de distância.

Para mais informações, consulte os artigos Encontre os vizinhos mais próximos aproximados, crie um índice de vetores e consulte incorporações de vetores.

Antes de começar

Para executar os exemplos neste documento, primeiro tem de seguir os passos em Configurar e consultar o Spanner Graph para fazer o seguinte:

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

Depois de inserir os dados essenciais do gráfico, faça as seguintes atualizações à sua base de dados.

Insira dados vetoriais adicionais na base de dados de grafos

Para fazer as atualizações necessárias à base de dados de grafos, 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-as na nova coluna nick_name_embeddings.

    Para gerar incorporações do Vertex AI para os seus dados operacionais no Spanner Graph, consulte o artigo Obtenha incorporações de texto do Vertex AI.

    Para fins ilustrativos, os nossos exemplos usam valores vetoriais artificiais 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 à AccountTransferAccounttabela de entradanotes: notes_embeddings e.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Crie incorporações para o texto na coluna notes e preencha-as na coluna notes_embeddings.

    Para gerar incorporações do Vertex AI para os seus dados operacionais no Spanner Graph, consulte o artigo Obtenha incorporações de texto do Vertex AI.

    Para fins ilustrativos, os nossos exemplos usam valores vetoriais artificiais 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 com as seguintes declarações. Para mais informações, consulte o artigo Atualize as definições de nós ou arestas 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
    );
    

Encontre os K vizinhos mais próximos

No exemplo seguinte, use a função EUCLIDEAN_DISTANCE() para realizar uma pesquisa de vetores KNN nos nós e nas arestas da base de dados de grafos.

Realize uma pesquisa de vetores KNN em nós do gráfico

Pode executar uma pesquisa de vetores KNN na propriedade nick_name_embeddings do nó Account. Esta pesquisa de vetores KNN devolve o name do proprietário da conta e o nick_name da conta. No exemplo seguinte, o resultado mostra os dois vizinhos mais próximos para contas para viagens de lazer e férias, que é representado pela incorporação do 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 Junte dinheiro para umas férias tropicais refrescantes
Dana Poupar para viagens

Realize uma pesquisa de vetores KNN em arestas do gráfico

Pode executar uma pesquisa de vetores KNN na propriedade notes_embeddings da aresta Owns. Esta pesquisa de vetores KNN devolve o name do proprietário da conta e o notes da transferência. No exemplo seguinte, o resultado mostra os dois principais vizinhos mais próximos para despesas com alimentação, que é representado pela incorporação do 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 notas
Lee para o custo partilhado do jantar
Dana adorei o almoço

Crie um índice vetorial e encontre os vizinhos mais próximos aproximados

Para realizar uma pesquisa ANN, tem de criar um índice de vetores especializado que o Spanner Graph usa para acelerar a pesquisa de vetores. O índice vector tem de usar uma métrica de distância específica. Pode escolher a métrica de distância mais adequada para o seu exemplo de utilização definindo o parâmetro distance_type como um dos seguintes: COSINE, DOT_PRODUCT ou EUCLIDEAN. Para mais informações, consulte as declarações VECTOR INDEX.

No exemplo seguinte, 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);

Realize uma pesquisa vetorial de ANN em nós do gráfico

Depois de criar um índice vetorial, pode fazer uma pesquisa vetorial ANN na propriedade nick_name do nó Account. A pesquisa de vetores ANN devolve o name do proprietário da conta e o nick_name da conta. No exemplo seguinte, o resultado mostra os dois vizinhos mais próximos aproximados para contas de viagens de lazer e férias, que é representado pela incorporação do vetor [0.2, 0.4, 0.9, 0.6].

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

nome nick_name
Alex Junte dinheiro para umas férias tropicais refrescantes
Dana Poupar para viagens

O que se segue?