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

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

Crie um conjunto de dados

Crie um conjunto de dados do BigQuery:

  1. Na Google Cloud consola, aceda à página do BigQuery.

    Aceda à página do BigQuery

  2. No painel Explorador, clique no nome do projeto.

  3. Clique em Ver ações > Criar conjunto de dados.

    Crie um conjunto de dados para conter os objetos usados no tutorial.

  4. 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

  1. 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;
  2. 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

  1. Crie o índice vetorial my_index na coluna embeddings_v1 da tabela patents:

    CREATE OR REPLACE VECTOR INDEX my_index ON vector_search.patents(embedding_v1)
    STORING(publication_number, title)
    OPTIONS(distance_type='COSINE', index_type='IVF');
  2. 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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.