Busca incorporaciones con la búsqueda vectorial

En este instructivo, se muestra cómo buscar incorporaciones almacenadas en tablas de BigQuery con la función VECTOR_SEARCH y, de forma opcional, un índice vectorial.

Permisos necesarios

Para ejecutar este instructivo, necesitas los siguientes permisos de Identity and Access Management (IAM):

  • Para crear una conjunto de datos, necesitas el permiso bigquery.datasets.create.
  • Para crear una tabla, necesitas los siguientes permisos:

    • bigquery.tables.create
    • bigquery.tables.updateData
    • bigquery.jobs.create
  • Para crear un índice vectorial, necesitas el permiso bigquery.tables.createIndex en la tabla en la que creas el índice.

  • Para descartar un índice vectorial, necesitas el permiso bigquery.tables.deleteIndex en la tabla en la que quitarás el índice.

Cada uno de los siguientes roles predefinidos de IAM incluyen los permisos que necesitas para trabajar con índices de búsqueda:

  • Propietario de datos de BigQuery (roles/bigquery.dataOwner)
  • Editor de datos de BigQuery (roles/bigquery.dataEditor)

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • BigQuery: You incur costs for index storage and data processing in BigQuery.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Si deseas obtener más información, consulta los Precios de BigQuery.

Antes de comenzar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API.

    Enable the API

Crea un conjunto de datos

Crea un conjunto de datos de BigQuery:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haz clic en Ver acciones > Crear conjunto de datos.

    Crea un conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, ingresa vector_search.

    • En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).

      Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

    • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

Crea tablas de prueba

  1. Crea la tabla patents que contiene las incorporaciones de patentes, basada en un subconjunto del conjunto de datos públicos Patentes de Google:

    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. Crea la tabla patents2 que contiene una incorporación de patente para encontrar los vecinos más cercanos para lo siguiente:

    CREATE TABLE vector_search.patents2 AS
    SELECT * FROM `patents-public-data.google_patents_research.publications`
    WHERE publication_number = 'KR-20180122872-A';

Crea un índice vectorial

  1. Crea el índice vectorial my_index en la columna embeddings_v1 de la tabla patents:

    CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1)
    OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
  2. Espera varios minutos para que se cree el índice vector. Luego, ejecuta la siguiente consulta y confirma que el valor coverage_percentage sea 100:

    SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;

Usa la función VECTOR_SEARCH con un índice

Después de crear y propagar el índice vectorial, usa la función VECTOR_SEARCH con el objetivo de encontrar el vecino más cercano para la incorporación en la columna embedding_v1 de la tabla patents2. Esta consulta usa el índice vectorial en la búsqueda, por lo que VECTOR_SEARCH usa un método vecinos aproximados para encontrar el vecino más cercano de la incorporación:

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}');

Los resultados son similares a los siguientes:

+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
| 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 |
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+

Usa la función VECTOR_SEARCH con fuerza bruta

Usa la función VECTOR_SEARCH para encontrar el vecino más cercano a la incorporación en la columna embedding_v1 de la tabla patents2. En esta consulta, no se usa el índice vectorial en la búsqueda, por lo que VECTOR_SEARCH encuentra el vecino más cercano exacto de la incorporación:

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}');

Los resultados son similares a los siguientes:

+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
| 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 |
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+

Evalúa la recuperación

Cuando realizas una búsqueda vectorial con un índice, se muestran resultados aproximados, con la compensación de reducir la recuperación. Para calcular la recuperación, compara los resultados que muestra la búsqueda vectorial con un índice y mediante la búsqueda vectorial con fuerza bruta. En este conjunto de datos, el valor publication_number identifica de forma única una patente, por lo que se usa para la comparación.

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

Si la recuperación es más baja de lo que deseas, puedes aumentar el valor fraction_lists_to_search, con la desventaja de una latencia y un uso de recursos potencialmente más altos. Para ajustar tu búsqueda de vectores, puedes probar varias ejecuciones de VECTOR_SEARCH con diferentes valores de argumento, guarda los resultados en tablas y, luego, compararlos.

Realiza una limpieza

  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.