Busca incorporaciones con la búsqueda vectorial
En este instructivo, se muestra cómo realizar una búsqueda de similitud en las incorporaciones almacenadas en tablas de BigQuery con la función VECTOR_SEARCH y, de forma opcional, un índice de vectores.
Cuando usas VECTOR_SEARCH con un índice vectorial, VECTOR_SEARCH usa el método de vecino más cercano aproximado para mejorar el rendimiento de la búsqueda vectorial, con la compensación de reducir la recuperación y, por lo tanto, mostrar resultados más aproximados. Sin un índice de vectores, VECTOR_SEARCH usa la búsqueda de fuerza bruta para medir la distancia de cada registro.
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.createbigquery.tables.updateDatabigquery.jobs.create
Para crear un índice vectorial, necesitas el permiso
bigquery.tables.createIndexen la tabla en la que creas el índice.Para descartar un índice vectorial, necesitas el permiso
bigquery.tables.deleteIndexen 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
La función VECTOR_SEARCH usa los precios de procesamiento de BigQuery.
Se te cobra por la búsqueda por similitud, con precios según demanda o por ediciones.
- Según demanda: Se te cobra por la cantidad de bytes analizados en la tabla base, el índice y la búsqueda.
Precios de las ediciones: Se te cobra por las ranuras necesarias para completar el trabajo en la edición de tu reserva. Los cálculos de similitud más grandes y complejos generan más cargos.
Si deseas obtener más información, consulta los Precios de BigQuery.
Antes de comenzar
-
En la consola de Google Cloud , en la página del selector de proyectos, selecciona o crea un proyecto de Google Cloud .
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
-
Habilita la API de BigQuery.
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene el permisoserviceusage.services.enable. Obtén más información para otorgar roles.
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery:
En la consola de Google Cloud , ve a la página 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
patentsque 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
patents2que 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_indexen la columnaembeddings_v1de la tablapatents:CREATE OR REPLACE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
Espera varios minutos para que se cree el índice vector. Luego, ejecuta la siguiente consulta y confirma que el valor
coverage_percentagesea100: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.
Usa la función VECTOR_SEARCH con un í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}');
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
- En la Google Cloud consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.