Analiza archivos PDF en una canalización de generación mejorada por recuperación
En este instructivo, se explica el proceso para crear una canalización de generación mejorada por recuperación (RAG) basada en el contenido de PDF analizado.
Los archivos PDF, como los documentos financieros, pueden ser difíciles de usar en las canalizaciones de RAG debido a su estructura compleja y combinación de texto, figuras y tablas. En este instructivo, se muestra cómo usar las funciones de BigQuery ML en combinación con el analizador de diseño de Document AI para compilar una canalización de RAG basada en información clave extraída de un archivo PDF.
Como alternativa, puedes realizar este instructivo con un notebook de Colab Enterprise.
Objetivos
En este instructivo, se abarcan las siguientes tareas:
- Crea un bucket de Cloud Storage y sube un archivo PDF de muestra.
- Crear una conexión de recursos de Cloud para que puedas conectarte a Cloud Storage y Vertex AI desde BigQuery
- Crear una tabla de objetos sobre el archivo PDF para que esté disponible en BigQuery
- Crear un procesador de Document AI que puedes usar para analizar el archivo PDF
- Crear un modelo remoto que te permita usar la API de Document AI para acceder al procesador de documentos desde BigQuery
- Usar el modelo remoto con la
función
ML.PROCESS_DOCUMENT
para analizar el contenido de un PDF en fragmentos y, luego, escribir ese contenido en una tabla de BigQuery - Extraer el contenido de PDF de los datos JSON que muestra la función
ML.PROCESS_DOCUMENT
y, luego, escribir ese contenido en una tabla de BigQuery - Crear un
modelo remoto
que te permita usar el modelo de generación de incorporaciones
text-embedding-004
de Vertex AI desde BigQuery. - Usar el modelo remoto con la
función
ML.GENERATE_EMBEDDING
para generar incorporaciones a partir del contenido de PDF analizado y, luego, escribir esas incorporaciones en una tabla de BigQuery Las incorporaciones son representaciones numéricas del contenido de PDF que te permiten realizar búsquedas y recuperaciones semánticas en el contenido de PDF. - Usar la
función
VECTOR_SEARCH
en las incorporaciones para identificar contenido de PDF semánticamente similar - Crear un
modelo remoto
que te permita usar el modelo de generación de texto
gemini-1.5-flash
de Vertex AI desde BigQuery. - Realizar la generación de aumento de recuperación (RAG) con el modelo remoto
con la
función
ML.GENERATE_TEXT
para generar texto, usando los resultados de la búsqueda vectorial para aumentar la entrada de instrucciones y mejorar los resultados.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
- BigQuery: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to Vertex AI models.
- Document AI: You incur costs for calls to the Document AI API.
- Cloud Storage: You incur costs for object storage in Cloud Storage.
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Para obtener más información, consulta las siguientes páginas de precios:
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, BigQuery Connection, Vertex AI, Document AI, and Cloud Storage APIs.
Roles obligatorios
Para crear objetos y buckets de Cloud Storage, debes tener membresía en el rol
roles/storage.storageAdmin
.Para crear un procesador de Document AI, necesitas membresía en el rol
roles/documentai.editor
.Para crear una conexión, necesitas membresía en el rol
roles/bigquery.connectionAdmin
.Para otorgar permisos a la cuenta de servicio de la conexión, necesitas ser miembro del rol
roles/resourcemanager.projectIamAdmin
.En este instructivo, los permisos de IAM necesarios para las operaciones de BigQuery restantes se incluyen en los siguientes dos roles:
- Editor de datos de BigQuery (
roles/bigquery.dataEditor
) para crear modelos, índices y tablas - Usuario de BigQuery (
roles/bigquery.user
) para ejecutar trabajos de BigQuery.
- Editor de datos de BigQuery (
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:
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
bqml_tutorial
.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.
Crear una conexión
Crea una conexión de recurso de Cloud y obtén la cuenta de servicio de la conexión. Crea la conexión en la misma ubicación.
Selecciona una de las siguientes opciones:
Console
Ve a la página de BigQuery.
Para crear una conexión, haz clic en
Agregar y, luego, en Conexiones a fuentes de datos externas.En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).
En el campo ID de conexión, escribe un nombre para tu conexión.
Haz clic en Crear conexión (Create connection).
Haz clic en Ir a la conexión.
En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
bq
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_id
anula el proyecto predeterminado.Reemplaza lo siguiente:
REGION
: tu región de conexiónPROJECT_ID
: El ID del proyecto de Google Cloud.CONNECTION_ID
: Es un ID para tu conexión.
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado es similar a este:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Usa el recurso google_bigquery_connection
.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
En el siguiente ejemplo, se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection
en la región US
:
Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.
Prepara Cloud Shell
- Inicia Cloud Shell
-
Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.
Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.
Prepara el directorio
Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).
-
En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión
.tf
, por ejemplo,main.tf
. En este instructivo, el archivo se denominamain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.
Copia el código de muestra en el
main.tf
recién creado.De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.
- Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
- Guarda los cambios.
-
Inicializa Terraform. Solo debes hacerlo una vez por directorio.
terraform init
De manera opcional, incluye la opción
-upgrade
para usar la última versión del proveedor de Google:terraform init -upgrade
Aplica los cambios
-
Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
terraform plan
Corrige la configuración según sea necesario.
-
Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe
yes
cuando se te solicite:terraform apply
Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.
- Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.
Otorga acceso a la cuenta de servicio
Elige una de las opciones siguientes:
Console
Ir a la página IAM y administración
Haz clic en
Otorgar acceso.Se abre el cuadro de diálogo Agregar principales.
En el campo Principales nuevas, escribe el ID de la cuenta de servicio que copiaste antes.
En el campo Elegir un rol, elige Document AI y, luego, Visualizador de Document AI.
Haz clic en Agregar otro rol.
En el campo Elige una función, elige Cloud Storage y, luego,Visualizador de objetos de Storage.
Haz clic en Agregar otra función.
En el campo Selecciona un rol, selecciona Vertex AI y, luego, Usuario de Vertex AI.
Haz clic en Guardar.
gcloud
Usa el comando gcloud projects add-iam-policy-binding
:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/documentai.viewer' --condition=None gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/storage.objectViewer' --condition=None gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
Reemplaza lo siguiente:
PROJECT_NUMBER
: Es el número de tu proyecto.MEMBER
: Es el ID de la cuenta de servicio que copiaste antes.
Sube el PDF de ejemplo a Cloud Storage
Para subir el PDF de muestra a Cloud Storage, sigue estos pasos:
- Para descargar el PDF de muestra de
scf23.pdf
, ve a https://www.federalreserve.gov/publications/files/scf23.pdf y haz clic en Descargar . - Crea buckets de Cloud Storage.
- Sube el archivo
scf23.pdf
al bucket.
Crea una tabla de objetos
Crea una tabla de objetos sobre el archivo PDF en Cloud Storage:
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.pdf` WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://BUCKET/scf23.pdf']);
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
.BUCKET
: Es el bucket de Cloud Storage que contiene el archivoscf23.pdf
. El valor completo de la opciónuri
debería ser similar a['gs://mybucket/scf23.pdf']
.
Crea un procesador de documentos
Crea un procesador de documentos basado en el procesador de analizador de diseño en la multirregión us
.
Crea el modelo remoto para el procesador de documentos
Crea un modelo remoto para acceder al procesador de Document AI:
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
CREATE OR REPLACE MODEL `bqml_tutorial.parser_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS(remote_service_type = 'CLOUD_AI_DOCUMENT_V1', document_processor = 'PROCESSOR_ID');
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
.PROCESSOR_ID
: El ID del procesador de documentos. Para encontrar este valor, consulta los detalles del procesador y, luego, observa la fila ID en la sección Información básica.
Analiza el archivo PDF en fragmentos
Usa el procesador de documentos con la función ML.PROCESS_DOCUMENT
para analizar el archivo PDF en fragmentos y, luego, escribe ese contenido en una tabla. La función ML.PROCESS_DOCUMENT
muestra los fragmentos de PDF en formato JSON.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
CREATE or REPLACE TABLE
bqml_tutorial.chunked_pdf
AS ( SELECT * FROM ML.PROCESS_DOCUMENT( MODELbqml_tutorial.parser_model
, TABLEbqml_tutorial.pdf
, PROCESS_OPTIONS => (JSON '{"layout_config": {"chunking_config": {"chunk_size": 250}}}') ) );
Analiza los datos de los fragmentos de PDF en columnas separadas
Extrae el contenido del PDF y la información de metadatos de los datos JSON que muestra la función ML.PROCESS_DOCUMENT
y, luego, escribe ese contenido en una tabla:
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente sentencia para analizar el contenido del PDF:
CREATE OR REPLACE TABLE
bqml_tutorial.parsed_pdf
AS ( SELECT uri, JSON_EXTRACT_SCALAR(json , '$.chunkId') AS id, JSON_EXTRACT_SCALAR(json , '$.content') AS content, JSON_EXTRACT_SCALAR(json , '$.pageFooters[0].text') AS page_footers_text, JSON_EXTRACT_SCALAR(json , '$.pageSpan.pageStart') AS page_span_start, JSON_EXTRACT_SCALAR(json , '$.pageSpan.pageEnd') AS page_span_end FROMbqml_tutorial.chunked_pdf
, UNNEST(JSON_EXTRACT_ARRAY(ml_process_document_result.chunkedDocument.chunks, '$')) json );En el editor de consultas, ejecuta la siguiente sentencia para ver un subconjunto del contenido del PDF analizado:
SELECT * FROM `bqml_tutorial.parsed_pdf` ORDER BY id LIMIT 5;
El resultado es similar a este:
+-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+ | uri | id | content | page_footers_text | page_span_start | page_span_end | +-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+ | gs://mybucket/scf23.pdf | c1 | •BOARD OF OF FEDERAL GOVERN NOR RESERVE SYSTEM RESEARCH & ANALYSIS | NULL | 1 | 1 | | gs://mybucket/scf23.pdf | c10 | • In 2022, 20 percent of all families, 14 percent of families in the bottom half of the usual ... | NULL | 8 | 9 | | gs://mybucket/scf23.pdf | c100 | The SCF asks multiple questions intended to capture whether families are credit constrained, ... | NULL | 48 | 48 | | gs://mybucket/scf23.pdf | c101 | Bankruptcy behavior over the past five years is based on a series of retrospective questions ... | NULL | 48 | 48 | | gs://mybucket/scf23.pdf | c102 | # Percentiles of the Distributions of Income and Net Worth | NULL | 48 | 49 | +-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+
Crea el modelo remoto para la generación de incorporaciones
Crea un modelo remoto que represente un modelo de generación de incorporación de texto de Vertex AI alojado:
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'text-embedding-004');
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
.
Genera embeddings
Genera incorporaciones para el contenido de PDF analizado y, luego, escríbelas en una tabla:
En la consola de Google Cloud, ve a la página de BigQuery.
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`, TABLE `bqml_tutorial.parsed_pdf` );
Ejecuta una búsqueda vectorial
Ejecuta una búsqueda vectorial en el contenido del PDF analizado.
La siguiente consulta toma la entrada de texto, crea una incorporación para esa entrada
con la función ML.GENERATE_EMBEDDING
y, luego, usa la función VECTOR_SEARCH
para hacer coincidir la incorporación de entrada con las incorporaciones de contenido de PDF
más similares. Los resultados son los diez fragmentos de PDF más similares semánticamente
a la entrada.
Ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente instrucción de SQL:
SELECT query.query, base.id AS pdf_chunk_id, base.content, distance 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 'Did the typical family net worth increase? If so, by how much?' AS content) ) ), top_k => 10, OPTIONS => '{"fraction_lists_to_search": 0.01}') ORDER BY distance DESC;
El resultado es similar al siguiente:
+-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | query | pdf_chunk_id | content | distance | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c9 | ## Assets | 0.31113668174119469 | | | | | | | | | The homeownership rate increased slightly between 2019 and 2022, to 66.1 percent. For ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c50 | # Box 3. Net Housing Wealth and Housing Affordability | 0.30973592073929113 | | | | | | | | | For families that own their primary residence ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c50 | 3 In the 2019 SCF, a small portion of the data collection overlapped with early months of | 0.29270064592817646 | | | | the COVID- ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+
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:
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
CREATE OR REPLACE MODEL `bqml_tutorial.text_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'gemini-1.5-flash-002');
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
.
Genera texto aumentado por resultados de la búsqueda vectorial
Realizar una búsqueda vectorial en las incorporaciones para identificar contenido de PDF similar semánticamente
y, luego, usar la función ML.GENERATE_TEXT
con los resultados de la búsqueda
vectorial para aumentar la entrada de instrucciones y mejorar los resultados de la generación de texto
En este caso, la consulta usa información de los fragmentos de PDF para responder una pregunta sobre el cambio en el patrimonio neto de la familia en la última década.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
SELECT ml_generate_text_llm_result AS generated FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_model`, ( SELECT CONCAT( 'Did the typical family net worth change? How does this compare the SCF survey a decade earlier? Be concise and use the following context:', STRING_AGG(FORMAT("context: %s and reference: %s", base.content, base.uri), ',\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 'Did the typical family net worth change? How does this compare the SCF survey a decade earlier?' AS content ) ) ), top_k => 10, OPTIONS => '{"fraction_lists_to_search": 0.01}') ), STRUCT(512 AS max_output_tokens, TRUE AS flatten_json_output) );
El resultado es similar al siguiente:
+-------------------------------------------------------------------------------+ | generated | +-------------------------------------------------------------------------------+ | Between the 2019 and 2022 Survey of Consumer Finances (SCF), real median | | family net worth surged 37 percent to $192,900, and real mean net worth | | increased 23 percent to $1,063,700. This represents the largest three-year | | increase in median net worth in the history of the modern SCF, exceeding the | | next largest by more than double. In contrast, between 2010 and 2013, real | | median net worth decreased 2 percent, and real mean net worth remained | | unchanged. | +-------------------------------------------------------------------------------+
Limpia
- 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.