Analyser des PDF dans un pipeline de génération augmentée par récupération
Ce tutoriel vous explique comment créer un pipeline de génération augmentée par récupération (RAG) basé sur le contenu PDF analysé.
Les fichiers PDF, tels que les documents financiers, peuvent être difficiles à utiliser dans les pipelines de classification par risque et opportunité en raison de leur structure complexe et de leur mélange de texte, de chiffres et de tableaux. Ce tutoriel explique comment utiliser les fonctionnalités BigQuery ML en combinaison avec l'analyseur de mise en page de Document AI pour créer un pipeline de RAG basé sur les informations clés extraites d'un fichier PDF.
Vous pouvez également suivre ce tutoriel à l'aide d'un notebook Colab Enterprise.
Objectifs
Ce tutoriel couvre les tâches suivantes :
- Créer un bucket Cloud Storage et importer un exemple de fichier PDF
- Créez une connexion à une ressource cloud pour pouvoir vous connecter à Cloud Storage et à Vertex AI depuis BigQuery.
- Créer une table d'objets sur le fichier PDF pour le rendre disponible dans BigQuery.
- Créer un processeur Document AI que vous pouvez utiliser pour analyser le fichier PDF.
- Créez un modèle distant qui vous permet d'utiliser l'API Document AI pour accéder au processeur de documents à partir de BigQuery.
- Utilisation du modèle distant avec la fonction
ML.PROCESS_DOCUMENT
pour analyser le contenu PDF en segments, puis écrire ce contenu dans une table BigQuery. - Extraction du contenu PDF à partir des données JSON renvoyées par la fonction
ML.PROCESS_DOCUMENT
, puis écriture de ce contenu dans une table BigQuery. - Créer un modèle distant qui vous permet d'utiliser le modèle de génération d'embeddings
text-embedding-004
de Vertex AI à partir de BigQuery. - Utilisation du modèle distant avec la fonction
ML.GENERATE_EMBEDDING
pour générer des représentations vectorielles continues à partir du contenu PDF analysé, puis écrire ces représentations vectorielles continues dans une table BigQuery. Les représentations vectorielles continues sont des représentations numériques du contenu PDF qui vous permettent d'effectuer des recherches et des récupérations sémantiques sur le contenu PDF. - Utiliser la fonction
VECTOR_SEARCH
sur les représentations vectorielles continues pour identifier le contenu PDF sémantiquement similaire. - Créer un modèle distant qui vous permet d'utiliser le modèle de génération de texte
gemini-1.5-flash
de Vertex AI à partir de BigQuery. - Effectuez une génération augmentée de récupération (RAG) à l'aide du modèle distant avec la fonction
ML.GENERATE_TEXT
pour générer du texte, en utilisant les résultats de recherche vectorielle pour augmenter la saisie de la requête et améliorer les résultats.
Coûts
Dans ce document, vous utilisez les composants facturables suivants 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.
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Pour en savoir plus, consultez les pages des tarifs suivantes:
Avant de commencer
-
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.
Rôles requis
Pour créer des buckets et des objets Cloud Storage, vous devez être membre du rôle
roles/storage.storageAdmin
.Pour créer un processeur Document AI, vous devez être membre du rôle
roles/documentai.editor
.Pour créer une connexion, vous devez disposer du rôle
roles/bigquery.connectionAdmin
.Pour accorder des autorisations au compte de service de la connexion, vous devez être membre du rôle
roles/resourcemanager.projectIamAdmin
.Les autorisations IAM requises dans ce tutoriel pour les opérations BigQuery restantes sont incluses dans les deux rôles suivants :
- Éditeur de données BigQuery (
roles/bigquery.dataEditor
) pour créer des modèles, des tables et des index. - Utilisateur BigQuery (
roles/bigquery.user
) pour exécuter des tâches BigQuery.
- Éditeur de données BigQuery (
Créer un ensemble de données
Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :
Dans la console Google Cloud, accédez à la page "BigQuery".
Dans le volet Explorateur, cliquez sur le nom de votre projet.
Cliquez sur
Afficher les actions > Créer un ensemble de données.Sur la page Créer un ensemble de données, procédez comme suit :
Dans le champ ID de l'ensemble de données, saisissez
bqml_tutorial
.Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).
Les ensembles de données publics sont stockés dans l'emplacement multirégional
US
. Par souci de simplicité, stockez votre ensemble de données dans le même emplacement.Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.
Créer une connexion
Créez une connexion de ressource cloud et obtenez le compte de service de la connexion. Créez la connexion dans le même emplacement.
Sélectionnez l'une des options suivantes :
Console
Accédez à la page BigQuery.
Pour créer une connexion, cliquez sur
Ajouter, puis sur Connexions aux sources de données externes.Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).
Dans le champ ID de connexion, saisissez un nom pour votre connexion.
Cliquez sur Create connection (Créer une connexion).
Cliquez sur Accéder à la connexion.
Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.
bq
Dans un environnement de ligne de commande, créez une connexion :
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
Le paramètre
--project_id
remplace le projet par défaut.Remplacez les éléments suivants :
REGION
: votre région de connexionPROJECT_ID
: ID de votre projet Google CloudCONNECTION_ID
: ID de votre connexion
Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.
Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
Le résultat ressemble à ce qui suit :
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Utilisez la ressource google_bigquery_connection
.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
L'exemple suivant crée une connexion de ressources Cloud nommée my_cloud_resource_connection
dans la région US
:
Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.
Préparer Cloud Shell
- Lancez Cloud Shell.
-
Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.
Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.
Préparer le répertoire
Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).
-
Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension
.tf
, par exemplemain.tf
. Dans ce tutoriel, le fichier est appelémain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.
Copiez l'exemple de code dans le fichier
main.tf
que vous venez de créer.Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.
- Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
- Enregistrez les modifications.
-
Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
terraform init
Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option
-upgrade
:terraform init -upgrade
Appliquer les modifications
-
Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
terraform plan
Corrigez les modifications de la configuration si nécessaire.
-
Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant
yes
lorsque vous y êtes invité :terraform apply
Attendez que Terraform affiche le message "Apply completed!" (Application terminée).
- Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.
Accorder l'accès au compte de service
Sélectionnez l'une des options suivantes :
Console
Accédez à la page IAM et administration.
Cliquez sur
Accorder l'accès.La boîte de dialogue Ajouter des comptes principaux s'ouvre.
Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.
Dans le champ Sélectionner un rôle, sélectionnez Document AI, puis Lecteur Document AI.
Cliquez sur Ajouter un autre rôle.
Dans le champ Sélectionnez un rôle, sélectionnez Cloud Storage, puis Lecteur d'objets Storage.
Cliquez sur Ajouter un autre rôle.
Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.
Cliquez sur Enregistrer.
gcloud
Exécutez la commande 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
Remplacez les éléments suivants :
PROJECT_NUMBER
: votre numéro de projet.MEMBER
: ID du compte de service que vous avez copié précédemment
Importer l'exemple de fichier PDF dans Cloud Storage
Pour importer l'exemple de fichier PDF dans Cloud Storage, procédez comme suit:
- Téléchargez l'exemple de PDF
scf23.pdf
en accédant à https://www.federalreserve.gov/publications/files/scf23.pdf et en cliquant sur Télécharger . - Créez un bucket Cloud Storage.
- Importez le fichier
scf23.pdf
dans le bucket.
Créer une table d'objets
Créez une table d'objets pour le fichier PDF dans Cloud Storage:
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.pdf` WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://BUCKET/scf23.pdf']);
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_ID
: ID de votre connexion BigQuery.Lorsque vous affichez les détails de la connexion dans la console Google Cloud,
CONNECTION_ID
correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple,projects/myproject/locations/connection_location/connections/myconnection
).BUCKET
: bucket Cloud Storage contenant le fichierscf23.pdf
. La valeur complète de l'optionuri
doit ressembler à['gs://mybucket/scf23.pdf']
.
Créer un outil de traitement de documents
Créez un outil de traitement de documents basé sur l'outil de traitement de la mise en page dans la zone multirégionale us
.
Créer le modèle distant pour le processeur de documents
Créez un modèle distant pour accéder au processeur Document AI:
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
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');
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_ID
: ID de votre connexion BigQuery.Lorsque vous affichez les détails de la connexion dans la console Google Cloud,
CONNECTION_ID
correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple,projects/myproject/locations/connection_location/connections/myconnection
).PROCESSOR_ID
: ID du processeur de documents Pour trouver cette valeur, affichez les détails du processeur, puis examinez la ligne ID dans la section Informations de base.
Analyser le fichier PDF en fragments
Utilisez le processeur de documents avec la fonction ML.PROCESS_DOCUMENT
pour analyser le fichier PDF en segments, puis écrivez ce contenu dans une table. La fonction ML.PROCESS_DOCUMENT
renvoie les segments PDF au format JSON.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
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}}}') ) );
Analyser les données de blocs PDF dans des colonnes distinctes
Extrayez le contenu PDF et les informations de métadonnées à partir des données JSON renvoyées par la fonction ML.PROCESS_DOCUMENT
, puis écrivez ce contenu dans un tableau:
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requêtes, exécutez l'instruction suivante pour analyser le contenu du fichier 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 );Dans l'éditeur de requêtes, exécutez l'instruction suivante pour afficher un sous-ensemble du contenu PDF analysé:
SELECT * FROM `bqml_tutorial.parsed_pdf` ORDER BY id LIMIT 5;
Le résultat ressemble à ce qui suit :
+-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+ | 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 | +-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+
Créer le modèle distant pour la génération d'embeddings
Créez un modèle distant représentant un modèle de génération de représentations vectorielles continues de texte Vertex AI hébergé :
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'text-embedding-004');
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_ID
: ID de votre connexion BigQuery.Lorsque vous affichez les détails de la connexion dans la console Google Cloud,
CONNECTION_ID
correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple,projects/myproject/locations/connection_location/connections/myconnection
).
Générer des embeddings
Générez des représentations vectorielles continues pour le contenu PDF analysé, puis écrivez-les dans une table:
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, TABLE `bqml_tutorial.parsed_pdf` );
Exécuter une recherche vectorielle
Exécutez une recherche vectorielle sur le contenu PDF analysé.
La requête suivante reçoit une entrée textuelle, crée un embedding pour cette entrée à l'aide de la fonction ML.GENERATE_EMBEDDING
, puis utilise la fonction VECTOR_SEARCH
pour mettre en correspondance l'embedding d'entrée avec les embeddings de contenu PDF les plus similaires. Les résultats sont les dix fragments PDF les plus sémantiquement similaires à l'entrée.
Accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction SQL suivante :
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;
Le résultat ressemble à ce qui suit :
+-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | 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- ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+
Créer le modèle distant pour la génération de texte
Créez un modèle distant représentant un modèle de génération de texte Vertex AI hébergé :
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
CREATE OR REPLACE MODEL `bqml_tutorial.text_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'gemini-1.5-flash-002');
Remplacez les éléments suivants :
LOCATION
: emplacement de la connexionCONNECTION_ID
: ID de votre connexion BigQuery.Lorsque vous affichez les détails de la connexion dans la console Google Cloud,
CONNECTION_ID
correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple,projects/myproject/locations/connection_location/connections/myconnection
).
Générer du texte augmenté par les résultats de recherche vectorielle
Effectuez une recherche vectorielle sur les représentations vectorielles continues pour identifier le contenu PDF sémantiquement similaire, puis utilisez la fonction ML.GENERATE_TEXT
avec les résultats de la recherche vectorielle pour augmenter la saisie de la requête et améliorer les résultats de génération de texte. Dans ce cas, la requête utilise les informations des segments PDF pour répondre à une question sur l'évolution de la valeur nette familiale au cours de la dernière décennie.
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, exécutez l'instruction suivante :
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) );
Le résultat ressemble à ce qui suit :
+-------------------------------------------------------------------------------+ | 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. | +-------------------------------------------------------------------------------+
Effectuer un nettoyage
- 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.