Realizar búsquedas semánticas y generación aumentada por recuperación

En este tutorial se explica todo el proceso para crear y usar incrustaciones de texto para la búsqueda semántica y la generación aumentada por recuperación (RAG).

En este tutorial se explican las siguientes tareas:

  • Crear un modelo remoto de BigQuery ML a partir de un modelo de inserción de Vertex AI.
  • Usar el modelo remoto con la función ML.GENERATE_EMBEDDING para generar inserciones a partir del texto de una tabla de BigQuery.
  • Crear un índice de vectores para indexar las incrustaciones y mejorar el rendimiento de la búsqueda.
  • Usar la función VECTOR_SEARCH con las incrustaciones para buscar texto similar.
  • Realiza RAG generando texto con la función ML.GENERATE_TEXT y usando los resultados de la búsqueda vectorial para aumentar la entrada de la petición y mejorar los resultados.

En este tutorial se usa la tabla pública de BigQuery patents-public-data.google_patents_research.publications.

Roles obligatorios

Para completar este tutorial, necesitas los siguientes roles de Gestión de Identidades y Accesos (IAM):

  • Crear y usar conjuntos de datos, conexiones y modelos de BigQuery: Administrador de BigQuery (roles/bigquery.admin).
  • Concede permisos a la cuenta de servicio de la conexión: administrador de gestión de identidades y accesos del proyecto (roles/resourcemanager.projectIamAdmin).

Estos roles predefinidos contienen los permisos necesarios para realizar las tareas descritas en este documento. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

  • Crea un conjunto de datos: bigquery.datasets.create
  • Crear, delegar y usar una conexión: bigquery.connections.*
  • Definir la conexión predeterminada: bigquery.config.*
  • Define los permisos de la cuenta de servicio: resourcemanager.projects.getIamPolicy y resourcemanager.projects.setIamPolicy
  • Crea un modelo y ejecuta la inferencia:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Para obtener más información sobre los precios de BigQuery, consulta la página Precios de BigQuery en la documentación de BigQuery.

Para obtener más información sobre los precios de Vertex AI, consulta la página de precios de Vertex AI.

Antes de empezar

  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, BigQuery Connection, and Vertex AI APIs.

    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 APIs

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

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

    Ir a la página de BigQuery

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

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

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

    • En ID del conjunto de datos, introduce bqml_tutorial.

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

    • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Crear el modelo remoto para generar incrustaciones de texto

Crea un modelo remoto que represente un modelo de generación de inserciones de texto de Vertex AI alojado:

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción:

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    La consulta tarda varios segundos en completarse. Después, el modelo embedding_model aparece en el conjunto de datos bqml_tutorial del panel Explorador. Como la consulta usa una instrucción CREATE MODEL para crear un modelo, no hay resultados de la consulta.

Generar embeddings de texto

Genera incrustaciones de texto a partir de resúmenes de patentes con la función ML.GENERATE_EMBEDDING y, a continuación, escríbelas en una tabla de BigQuery para que se puedan buscar.

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción:

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT *, abstract AS content
        FROM `patents-public-data.google_patents_research.publications`
        WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
      )
    )
    WHERE LENGTH(ml_generate_embedding_status) = 0;

Esta consulta tarda unos 5 minutos en completarse.

La generación de inserciones mediante la función ML.GENERATE_EMBEDDING puede fallar debido a las cuotas de LLM de Vertex AI o a la falta de disponibilidad del servicio. Los detalles del error se devuelven en la columna ml_generate_embedding_status. Una columna ml_generate_embedding_status vacía indica que la generación de la inserción se ha realizado correctamente.

Para ver otros métodos de generación de inserciones de texto en BigQuery, consulta el tutorial sobre cómo insertar texto con modelos de TensorFlow preentrenados.

Crear un índice vectorial

Si creas un índice vectorial en una columna de inserciones, la búsqueda vectorial que se realice en esa columna usará la técnica de búsqueda de vecinos más cercanos aproximados. Esta técnica mejora el rendimiento de la búsqueda vectorial, pero reduce el recuerdo y, por lo tanto, devuelve resultados más aproximados.

Para crear un índice vectorial, usa la instrucción del lenguaje de definición de datos (DDL) CREATE VECTOR INDEX:

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción SQL:

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(ml_generate_embedding_result)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}')

Crear un índice vectorial suele tardar solo unos segundos. El índice vectorial tarda otros 2 o 3 minutos en rellenarse y estar listo para usarse.

Verificar que el índice vectorial está listo

El índice vectorial se rellena de forma asíncrona. Para comprobar si el índice está listo para usarse, consulta la vista INFORMATION_SCHEMA.VECTOR_INDEXES y verifica que el valor de la columna coverage_percentage sea mayor que 0 y que el valor de la columna last_refresh_time no sea NULL.

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción SQL:

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`

    Sustituye PROJECT_ID por el ID del proyecto.

Realizar una búsqueda de similitud de texto mediante el índice vectorial

Usa la función VECTOR_SEARCH para buscar patentes relevantes que coincidan con las incrustaciones generadas a partir de una consulta de texto.

El argumento top_k determina el número de coincidencias que se van a devolver, que en este caso es cinco. La opción fraction_lists_to_search determina el porcentaje de listas de índices vectoriales que se van a buscar. El índice vectorial que has creado tiene 500 listas, por lo que el valor fraction_lists_to_search de .01 indica que esta búsqueda vectorial analiza cinco de esas listas. Un valor de fraction_lists_to_search más bajo, como se muestra aquí, proporciona una recuperación más baja y un rendimiento más rápido. Para obtener más información sobre las listas de índices vectoriales, consulta la num_lists opción de índice vectorial.

El modelo que uses para generar las inserciones en esta consulta debe ser el mismo que el que uses para generar las inserciones en la tabla con la que estás comparando. De lo contrario, los resultados de búsqueda no serán precisos.

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción SQL:

    SELECT query.query, base.publication_number, base.title, base.abstract
    FROM VECTOR_SEARCH(
      TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
      (
      SELECT ml_generate_embedding_result, content AS query
      FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT 'improving password security' AS content))
      ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')

    El resultado debería ser similar al siguiente:

    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    |            query            | publication_number |                       title                     |                      abstract                   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    | improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
    | improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
    | improving password security | SG-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
    | improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
    | improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

Crear el modelo remoto para la generación de texto

Crea un modelo remoto que represente un modelo de generación de texto de Vertex AI alojado:

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción:

    CREATE OR REPLACE MODEL `bqml_tutorial.text_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'gemini-2.0-flash-001');

    La consulta tarda varios segundos en completarse. Después, el modelo text_model aparece en el conjunto de datos bqml_tutorial del panel Explorador. Como la consulta usa una instrucción CREATE MODEL para crear un modelo, no hay resultados de la consulta.

Generar texto aumentado con resultados de búsqueda vectorial

Proporcionar los resultados de búsqueda como peticiones para generar texto con la función ML.GENERATE_TEXT

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción:

    SELECT ml_generate_text_llm_result AS generated, prompt
    FROM ML.GENERATE_TEXT(
      MODEL `bqml_tutorial.text_model`,
      (
        SELECT CONCAT(
          'Propose some project ideas to improve user password security using the context below: ',
          STRING_AGG(
            FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
            ',\n')
          ) AS prompt,
        FROM VECTOR_SEARCH(
          TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
          (
            SELECT ml_generate_embedding_result, content AS query
            FROM ML.GENERATE_EMBEDDING(
              MODEL `bqml_tutorial.embedding_model`,
             (SELECT 'improving password security' AS content)
            )
          ),
        top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
      ),
      STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));

    El resultado debería ser similar al siguiente:

    +------------------------------------------------+------------------------------------------------------------+
    |            generated                           | prompt                                                     |
    +------------------------------------------------+------------------------------------------------------------+
    | These patents suggest several project ideas to | Propose some project ideas to improve user password        |
    | improve user password security.  Here are      | security using the context below: patent title: Active     |
    | some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
    | upon:                                          | of adherence to password policy, patent abstract:          |
    |                                                | An active new password entry dialog provides a compact     |
    | **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
    | entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
    | adherence to password policy":**               | applicable password policies is included in the display    |
    |                                                | and updated as new password characters are being...        |
    +------------------------------------------------+------------------------------------------------------------+
     

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.

Siguientes pasos