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 usarDOT_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 usarDOT_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:
- Crie uma instância.
- Crie uma base de dados com um esquema do gráfico do Spanner.
- 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:
Adicione uma nova coluna,
nick_name_embeddings
, à tabela de entradaAccount
.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
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;
Crie incorporações para o texto na coluna
nick_name
e preencha-as na nova colunanick_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;
Adicione duas novas colunas à
AccountTransferAccount
tabela 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);
Crie incorporações para o texto na coluna
notes
e preencha-as na colunanotes_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;
Depois de adicionar novas colunas às tabelas de entrada
Account
eAccountTransferAccount
, 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?
- Realize uma pesquisa de similaridade vetorial no Spanner encontrando os K vizinhos mais próximos.
- Encontrar os vizinhos mais próximos aproximados, criar um índice de vetores e consultar incorporações de vetores.
- Obtenha incorporações de texto da Vertex AI
- Saiba mais sobre as consultas de gráficos do Spanner.
- Saiba mais sobre as práticas recomendadas para ajustar consultas.