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.
Si deseas obtener más información, consulta los Precios de BigQuery.
Antes de comenzar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery:
En la consola de Google Cloud, ve a la página de BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haz clic en
Ver acciones > Crear conjunto de datos.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
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;
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
Crea el índice vectorial
my_index
en la columnaembeddings_v1
de la tablapatents
:CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
Espera varios minutos para que se cree el índice vector. Luego, ejecuta la siguiente consulta y confirma que el valor
coverage_percentage
sea100
: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
- 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.