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, useDOT_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, useDOT_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:
- Crie uma instância.
- Crie um banco de dados com um esquema do Spanner Graph.
- 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:
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_namee preencha a nova colunanick_name_embeddingscom 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;Adicione duas novas colunas à tabela de entrada
AccountTransferAccount:notesenotes_embeddings.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);Crie embeddings para o texto na coluna
notese preencha a colunanotes_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;Depois de adicionar novas colunas às tabelas de entrada
AccounteAccountTransferAccount, 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
- Realizar pesquisa de similaridade vetorial no Spanner encontrando os vizinhos K mais próximos.
- Encontrar vizinhos mais próximos aproximados, criar um índice de vetor e consultar embeddings de vetor.
- Acessar embeddings de texto da Agent Platform
- Saiba mais sobre consultas de gráficos do Spanner.
- Conheça as práticas recomendadas para ajustar consultas.