Realiza una búsqueda semántica y una generación de aumento de recuperación

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

En este instructivo, se abarcan las siguientes tareas:

  • Crea un modelo remoto de BigQuery ML en un modelo de incorporación de Vertex AI.
  • Usar el modelo remoto con la función ML.GENERATE_EMBEDDING para generar incorporaciones a partir de texto en una tabla de BigQuery
  • Crear un índice vectorial para indexar las incorporaciones y mejorar el rendimiento de la búsqueda
  • Usar la función VECTOR_SEARCH con las incorporaciones para buscar texto similar
  • Realizar la RAG a través de la generación de texto con la función ML.GENERATE_TEXT y el uso de los resultados de la búsqueda vectorial para aumentar la entrada de instrucciones y mejorar los resultados.

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

Roles obligatorios

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

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

Estos roles predefinidos contienen los permisos necesarios para realizar las tareas de este documento. Para ver los permisos exactos que son necesarios, expande la sección Permisos necesarios:

Permisos necesarios

  • Crea un conjunto de datos: bigquery.datasets.create
  • Crea, delega y usa una conexión: bigquery.connections.*
  • Establece la conexión predeterminada: bigquery.config.*
  • Configura 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 o con otros roles predefinidos.

Costos

En este documento, usarás 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 costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios Google Cloud nuevos cumplan con los requisitos para obtener una prueba gratuita.

Para obtener más información sobre los precios de BigQuery, consulta 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 Precios de Vertex AI.

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

    Enable the APIs

Crea un conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA.

Console

  1. En la consola de Google Cloud , 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. Haz clic en Ver acciones > Crear conjunto de datos.

    La opción de menú Crear conjunto de datos

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

    • En ID del conjunto de datos, ingresa bqml_tutorial.

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

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

bq

Para crear un conjunto de datos nuevo, usa el comando bq mk con la marca --location. Para obtener 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 establecida en US y una descripción de 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 omites -d y --dataset, el comando crea un conjunto de datos de manera predeterminada.

  2. Confirma que se haya 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"
  }
}

Permite trabajar con BigQuery DataFrames.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

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

import google.cloud.bigquery

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

Crea el modelo remoto para la generación de incorporaciones de texto

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

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente declaració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 de eso, el modelo embedding_model aparece en el conjunto de datos bqml_tutorial en el panel Explorador. Debido a que la consulta usa una declaración CREATE MODEL para crear un modelo, no hay resultados de consultas.

Generar incorporaciones de texto

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

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente declaració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 aproximadamente 5 minutos en completarse.

La generación de embedding con la función ML.GENERATE_EMBEDDING puede fallar debido a cuotas de Vertex AI LLM o a la falta de disponibilidad del servicio. Los detalles del error se muestran en la columna ml_generate_embedding_status. Una columna ml_generate_embedding_status vacía indica que la generación de embeddings se realizó de forma correcta.

Para conocer otros métodos de generación de embeddings de texto en BigQuery, consulta el instructivo sobre cómo incorporar texto con modelos de TensorFlow previamente entrenados.

Crea un índice vectorial

Si creas un índice vectorial en una columna de incorporación, la búsqueda de vectores que se realice en esa columna usará la técnica de búsqueda de vecino más cercano aproximado. Esta técnica mejora el rendimiento de la búsqueda de vectores, con la compensación de reducir la recuperación y, por lo tanto, mostrar resultados más aproximados.

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

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción de 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}')

Por lo general, la creación de un índice vectorial solo tarda unos segundos. El índice vectorial tarda otros 2 o 3 minutos en propagarse y estar listo para usarse.

Verifica la preparación del índice vectorial

El índice vectorial se propaga de forma asíncrona. Para verificar 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 de BigQuery.

    Ir a BigQuery

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

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

    Reemplaza PROJECT_ID con el ID del proyecto.

Realiza una búsqueda de similitud de texto con el índice vectorial

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

El argumento top_k determina la cantidad de coincidencias que se devolverán, en este caso, cinco. La opción fraction_lists_to_search determina el porcentaje de listas de índices de vectores que se buscarán. El índice de vectores que creaste tiene 500 listas, por lo que el valor de fraction_lists_to_search de .01 indica que esta búsqueda de vectores explora cinco de esas listas. Un valor de fraction_lists_to_search más bajo, como se muestra aquí, proporciona un 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 incorporaciones en esta consulta debe ser el mismo que usas para generar las incorporaciones en la tabla con la que comparas; de lo contrario, los resultados de la búsqueda no serán precisos.

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente instrucción de 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 es 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...       |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

Crea 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 consola de Google Cloud , ve a la página BigQuery.

    Ir a BigQuery

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

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

    La consulta tarda varios segundos en completarse, después de eso, el modelo text_model aparece en el conjunto de datos bqml_tutorial en el panel Explorador. Debido a que la consulta usa una declaración CREATE MODEL para crear un modelo, no hay resultados de consultas.

Genera texto aumentado por resultados de la búsqueda vectorial

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

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

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente declaració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 es 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...        |
    +------------------------------------------------+------------------------------------------------------------+
     

Limpia

  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.

¿Qué sigue?