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.create
bigquery.tables.updateData
bigquery.jobs.create
Para criar um índice vetorial, precisa da autorização
bigquery.tables.createIndex
na tabela onde está a criar o índice.Para eliminar um índice vetorial, precisa da autorização
bigquery.tables.deleteIndex
na 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.create
permission. 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.enable
permission. 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
US
multirregiã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
patents
que 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
patents2
que 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_index
na colunaembeddings_v1
da 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.