Pesquise incorporações com a pesquisa vetorial
Este tutorial mostra como realizar uma pesquisa de similaridade em incorporações armazenadas em tabelas do BigQuery através da função VECTOR_SEARCH e, opcionalmente, de um índice de vetores.
Quando usa VECTOR_SEARCH com um índice vetorial, VECTOR_SEARCH usa o método
Approximate Nearest Neighbor
para melhorar o desempenho da pesquisa vetorial, com a contrapartida de reduzir a
recolha
e, por isso, devolver resultados mais aproximados. Sem um índice vetorial,
o VECTOR_SEARCH usa a
pesquisa de força bruta
para medir a distância de cada registo.
Autorizações necessárias
Para executar este tutorial, precisa das seguintes autorizações de gestão de identidade e de acesso (IAM):
- Para criar um conjunto de dados, precisa da autorização
bigquery.datasets.create. Para criar uma tabela, precisa das seguintes autorizações:
bigquery.tables.createbigquery.tables.updateDatabigquery.jobs.create
Para criar um índice vetorial, precisa da autorização
bigquery.tables.createIndexna tabela onde está a criar o índice.Para eliminar um índice vetorial, precisa da autorização
bigquery.tables.deleteIndexna tabela onde está a eliminar o índice.
Cada uma das seguintes funções de IAM predefinidas inclui as autorizações de que precisa para trabalhar com índices vetoriais:
- Proprietário de dados do BigQuery (
roles/bigquery.dataOwner) - Editor de dados do BigQuery (
roles/bigquery.dataEditor)
Custos
A função VECTOR_SEARCH usa os preços de computação do BigQuery.
A pesquisa de semelhanças é-lhe cobrada através dos preços a pedido ou das edições.
- A pedido: é-lhe cobrado o número de bytes analisados na tabela base, no índice e na consulta de pesquisa.
Preços das edições: é cobrado o número de espaços necessários para concluir a tarefa na edição da reserva. Os cálculos de semelhança maiores e mais complexos geram mais custos.
Para mais informações, consulte os preços do BigQuery.
Antes de começar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
Crie um conjunto de dados
Crie um conjunto de dados do BigQuery:
Na Google Cloud consola, aceda à página do BigQuery.
No painel Explorador, clique no nome do projeto.
Clique em Ver ações > Criar conjunto de dados.

Na página Criar conjunto de dados, faça o seguinte:
Para o ID do conjunto de dados, introduza
vector_search.Em Tipo de localização, selecione Várias regiões e, de seguida, selecione EUA (várias regiões nos Estados Unidos).
Os conjuntos de dados públicos são armazenados na
USmultirregião. Para simplificar, armazene o conjunto de dados na mesma localização.Deixe as restantes predefinições como estão e clique em Criar conjunto de dados.
Crie tabelas de teste
Crie a tabela
patentsque contém incorporações de patentes, com base num subconjunto do conjunto de dados público do Google Patents:CREATE TABLE vector_search.patents AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE ARRAY_LENGTH(embedding_v1) > 0 AND publication_number NOT IN ('KR-20180122872-A') LIMIT 1000000;
Crie a tabela
patents2que contém uma incorporação de patentes para encontrar os vizinhos mais próximos para:CREATE TABLE vector_search.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
Crie um índice vetorial
Crie o índice vetorial
my_indexna colunaembeddings_v1da tabelapatents:CREATE OR REPLACE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
Aguarde vários minutos para que o índice vetorial seja criado e, em seguida, execute a consulta seguinte e confirme que o valor
coverage_percentageé100:SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;
Use a função VECTOR_SEARCH com um índice
Depois de criar e preencher o índice vetorial, use a função VECTOR_SEARCH
para encontrar o vizinho mais próximo da incorporação na coluna embedding_v1
na tabela patents2. Esta consulta usa o índice de vetores na pesquisa, pelo que o VECTOR_SEARCH usa um método de vizinho mais próximo aproximado para encontrar o vizinho mais próximo da incorporação.
Use a função VECTOR_SEARCH com um índice:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}');
Os resultados têm um aspeto semelhante ao seguinte:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.14471956347590609 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.17472108931171348 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642917 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
Use a função VECTOR_SEARCH com força bruta
Use a função VECTOR_SEARCH
para encontrar o vizinho mais próximo da incorporação na coluna embedding_v1
na tabela patents2. Esta consulta não usa o índice vetorial na pesquisa, pelo que VECTOR_SEARCH encontra o vizinho mais próximo exato da incorporação.
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}');
Os resultados têm um aspeto semelhante ao seguinte:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.1447195634759062 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.1747210893117136 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642928 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
Avalie a capacidade de recordar
Quando faz uma pesquisa vetorial com um índice, são devolvidos resultados aproximados, com a desvantagem de reduzir a capacidade de memorização. Pode calcular a capacidade de memorização comparando os resultados devolvidos pela pesquisa vetorial com um índice e pela pesquisa vetorial com força bruta. Neste conjunto de dados, o valor publication_number identifica de forma exclusiva uma patente, pelo que é usado para comparação.
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}') ), exact_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}') ) SELECT a.query_publication_number, SUM(CASE WHEN a.base_publication_number = e.base_publication_number THEN 1 ELSE 0 END) / 5 AS recall FROM exact_results e LEFT JOIN approx_results a ON e.query_publication_number = a.query_publication_number GROUP BY a.query_publication_number
Se a capacidade de memorização for inferior ao desejado, pode aumentar o valor de fraction_lists_to_search, com a desvantagem de uma latência e uma utilização de recursos potencialmente mais elevadas. Para otimizar a pesquisa vetorial, pode experimentar várias execuções de VECTOR_SEARCH com diferentes valores de argumentos, guardar os resultados em tabelas e, em seguida, comparar os resultados.
Limpar
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.