En este instructivo, se muestra cómo realizar una
búsqueda de similitud en
embeddings almacenados en tablas de BigQuery con la
VECTOR_SEARCH función
y un índice vectorial.
La búsqueda de vectores es una técnica para comparar objetos similares con embeddings y se usa para potenciar los productos de Google, como la Búsqueda de Google, YouTube y Google Play. Puedes usar la búsqueda de vectores para realizar búsquedas semánticas a gran escala o realizar una búsqueda híbrida que combine una búsqueda semántica con una búsqueda léxica (de palabras clave). Cuando usas índices vectoriales con la búsqueda de vectores, puedes aprovechar las tecnologías fundamentales, como la indexación de archivos invertidos (IVF) y el algoritmo ScaNN.
La búsqueda de vectores se basa en embeddings. Las incorporaciones son vectores numéricos de alta dimensión que representan una entidad determinada, como un fragmento de texto o un archivo de audio. Los modelos de aprendizaje automático (AA) usan incorporaciones para codificar la semántica de esas entidades a fin de facilitar el razonamiento y la comparación. Por ejemplo, una operación común en los modelos de agrupamiento en clústeres, clasificación y recomendación es medir la distancia entre vectores en un espacio de embedding para encontrar elementos que sean más semánticamente similares.
Objetivos
- Realizar una búsqueda de similitud en embeddings almacenados en tablas de BigQuery con la función
VECTOR_SEARCH. - Usar un índice vectorial para mejorar el rendimiento de la búsqueda de vectores.
- Realizar una búsqueda que use un índice vectorial y una búsqueda que no use un índice.
- Evaluar la recuperación comparando los resultados de las búsquedas con un índice y las búsquedas sin un índice.
Costos
La función VECTOR_SEARCH usa
los precios de procesamiento de BigQuery.
Se te cobra por la búsqueda de similitud con precios según demanda o de ediciones.
- Según demanda: Se te cobra por la cantidad de bytes analizados en la tabla base, el índice y la consulta de búsqueda.
Precios de ediciones: Se te cobra por las ranuras necesarias para completar el trabajo dentro de tu edición de 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 Google Cloud consola, en la página del selector de proyectos, selecciona o crea un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Seleccionar 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 elresourcemanager.projects.createpermiso. Obtén más información para otorgar roles.
-
Verifica que la facturación esté habilitada para tu Google Cloud proyecto.
-
Habilita la API de BigQuery.
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.
Roles obligatorios
Si quieres obtener los permisos que necesitas para completar este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:
-
Crear conjuntos de datos, tablas e índices vectoriales:
Editor de datos de BigQuery (
roles/bigquery.dataEditor) -
Ejecutar trabajos de BigQuery:
Usuario de trabajo de BigQuery (
roles/bigquery.jobUser)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Crea un conjunto de datos
Para crear un conjunto de datos de BigQuery, selecciona una de las siguientes opciones:
Console
En la Google Cloud consola, ve a la BigQuery.
En el panel de la izquierda, haz clic en Explorador:

Si no ves el panel izquierdo, haz clic en Expandir panel izquierdo para abrirlo.
En Explorer, expande tu proyecto y, luego, haz clic en Conjuntos de datos.
En la página Conjuntos de datos, haz clic en Crear conjunto de datos.
En el panel Crear conjunto de datos, haz lo siguiente:
En ID del conjunto de datos, ingresa
bqml_tutorial.En Ubicación de los datos, selecciona EE.UU..
Deja la configuración predeterminada restante como está.
Haz clic en Crear conjunto de datos.
bq
Para crear un conjunto de datos nuevo, usa el
bq mk --dataset comando.
Crea un conjunto de datos llamado
bqml_tutorialcon la ubicación de los datos establecida enUS:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
Confirma que se haya creado el conjunto de datos:
bq ls
API
Llama al datasets.insert
método con un recurso de conjunto de datos definido:
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
Crea tablas para almacenar datos y embeddings
En esta sección, crearás la tabla patents que contiene las incorporaciones de patentes. Los embeddings se basan en un subconjunto del conjunto de datos públicos Patentes de Google. También crearás la tabla patents2 que contiene una incorporación de patente para encontrar los vecinos más cercanos.
Para crear las tablas, sigue estos pasos:
Para crear la tabla
patents, pega lo siguiente en el editor de consultas y, luego, haz clic en Ejecutar:CREATE TABLE bqml_tutorial.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;
Recibirás un mensaje de confirmación como el siguiente:
This statement created a new table named patents.Para crear la tabla
patents2que contiene una incorporación de patente para encontrar los vecinos más cercanos, pega lo siguiente en el editor de consultas y, luego, haz clic en Ejecutar:CREATE TABLE bqml_tutorial.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
Recibirás un mensaje de confirmación como el siguiente:
This statement created a new table named patents2.
Crea un índice vectorial
Cuando usas VECTOR_SEARCH con un índice vectorial, VECTOR_SEARCH usa el
método de vecinos más cercanos aproximados
para mejorar el rendimiento de la búsqueda de vectores, con la compensación de reducir la
recuperación
y, de esa forma, mostrar resultados más aproximados. Sin un índice vectorial,
VECTOR_SEARCH usa
la búsqueda de fuerza bruta
para medir la distancia de cada registro.
En esta sección, crearás el índice vectorial my_index en la columna embedding_v1 de la tabla patents. Luego, verificarás que el índice esté disponible.
Para crear el índice vectorial, sigue estos pasos:
Para crear el índice vectorial
my_indexen la columnaembedding_v1de lapatentstabla, pega lo siguiente en el editor de consultas y, luego, haz clic en Ejecutar:CREATE OR REPLACE VECTOR INDEX my_index ON bqml_tutorial.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
Recibirás un mensaje de confirmación como el siguiente:
The vector index creation on table bqml_tutorial.patents was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.Para confirmar que el índice vectorial esté listo, pega lo siguiente en el editor de consultas y, luego, haz clic en Ejecutar:
SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;
En los resultados de la consulta, verifica que el
index_statusseaACTIVEy que el valorcoverage_percentagesea100. Es posible quecoverage_percentagetarde varios minutos en alcanzar el valor100.
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 de vecinos más cercanos aproximados
para encontrar el vecino más cercano de la incorporación.
Para usar la función VECTOR_SEARCH con un índice, pega lo siguiente en el
editor de consultas y, luego, haz clic en
Ejecutar:
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 bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.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
En esta sección, usarás la función VECTOR_SEARCH para encontrar el vecino más cercano para 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.
Para usar VECTOR_SEARCH con fuerza bruta, pega lo siguiente en el editor de consultas
y, luego, haz clic en
Ejecutar:
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 bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.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,
pero se reduce la recuperación. Para calcular la recuperación, compara los resultados que muestra la búsqueda vectorial con un índice y los resultados que muestra la búsqueda vectorial con fuerza bruta. El valor publication_number identifica de forma única una patente, por lo que se usa para la comparación en la siguiente consulta.
Para evaluar la recuperación, pega lo siguiente en el editor de consultas y, luego, haz clic en Ejecutar:
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.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 bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.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;
Los resultados se ven de la siguiente manera:
+--------------------------+--------+ | query_publication_number | recall | +--------------------------+--------+ | KR-20180122872-A | 1.0 | +--------------------------+--------+
Si la recuperación es más baja de lo que deseas, puedes aumentar el valor fraction_lists_to_search, pero experimentarás 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.
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
- En la Google Cloud consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
Como alternativa, para conservar el proyecto y borrar los recursos que se usaron en este instructivo, sigue estos pasos:
Ve a la página de BigQuery.
En el panel de la izquierda, expande tu proyecto y, luego, haz clic en Conjuntos de datos.
Para el conjunto de datos
bqml_tutorial, haz clic en Abrir acciones > Borrar.En el cuadro de diálogo Borrar conjunto de datos, haz clic en Borrar para confirmar.