1. Introduction
Présentation
Vertex AI Search and Conversation (anciennement Generative AI App Builder) permet aux développeurs d'exploiter la puissance des modèles de fondation, de l'expertise de la recherche et des technologies d'IA conversationnelle de Google pour créer des applications d'IA générative professionnelles. Cet atelier de programmation porte sur l'utilisation de Vertex AI Search, qui vous permet de créer une application de recherche de qualité Google à partir de vos propres données et d'intégrer une barre de recherche à vos pages Web ou à votre application.
Cloud Run est une plate-forme de calcul gérée qui vous permet d'exécuter des conteneurs directement sur l'infrastructure évolutive de Google. Avec l'option de déploiement basé sur la source, vous pouvez déployer sur Cloud Run du code écrit dans n'importe quel langage de programmation (pouvant être placé dans un conteneur).
Dans cet atelier de programmation, vous allez créer un service Cloud Run à l'aide du déploiement basé sur la source pour récupérer les résultats de recherche de contenu non structuré dans des fichiers PDF stockés dans un bucket Cloud Storage. Pour en savoir plus sur l'ingestion de contenu non structuré, cliquez ici.
Points abordés
- Créer une application Vertex AI Search pour les données non structurées sous forme de PDF ingérés à partir d'un bucket Cloud Storage
- Créer un point de terminaison HTTP à l'aide d'un déploiement basé sur la source dans Cloud Run
- Créer un compte de service en suivant le principe du moindre privilège que le service Cloud Run utilise pour interroger l'application Vertex AI Search
- Comment appeler le service Cloud Run pour interroger l'application Vertex AI Search
2. Préparation
Prérequis
- Vous êtes connecté à la console Cloud.
- Vous avez déjà déployé un service Cloud Run. Par exemple, vous pouvez suivre le guide de démarrage rapide pour déployer un service Web depuis le code source.
Activer Cloud Shell
- Dans Cloud Console, cliquez sur Activer Cloud Shell .
Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire vous explique de quoi il s'agit. Si un écran intermédiaire s'est affiché, cliquez sur Continuer.
Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.
Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute dans Google Cloud, ce qui améliore considérablement les performances du réseau et l'authentification. Une grande partie, voire la totalité, de votre travail dans cet atelier de programmation peut être effectué dans un navigateur.
Une fois connecté à Cloud Shell, vous êtes authentifié et le projet est défini sur votre ID de projet.
- Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
Résultat de la commande
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet:
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si vous obtenez un résultat différent, exécutez cette commande :
gcloud config set project <PROJECT_ID>
Résultat de la commande
Updated property [core/project].
3. Activer les API
Avant de pouvoir utiliser Vertex AI Search, vous devez activer plusieurs API.
Tout d'abord, cet atelier de programmation nécessite l'utilisation des API Vertex AI Search and Conversation, BigQuery et Cloud Storage. Vous pouvez activer ces API ici.
Ensuite, suivez ces étapes pour activer l'API Vertex AI Search and Conversation:
- Dans la console Google Cloud, accédez à la console Vertex AI Search and Conversation.
- Lisez et acceptez les conditions d'utilisation, puis cliquez sur "Continuer" et activez l'API.
4. Créer une application de recherche pour les données non structurées à partir de Cloud Storage
- Dans la console Google Cloud, accédez à la page Rechercher et la page des conversations. Cliquez sur Nouvelle application.
- Dans le volet Sélectionner le type d'application, sélectionnez Recherche.
- Assurez-vous que les fonctionnalités d'entreprise sont activées pour recevoir les réponses directement extraites de vos documents.
- Assurez-vous que l'option Fonctionnalités LLM avancées est activée pour recevoir des résumés de recherches.
- Dans le champ Nom de l'application, saisissez le nom de votre application. L'identifiant de votre application s'affiche sous le nom de l'application.
- Sélectionnez Mondial (Monde) comme emplacement pour votre application, puis cliquez sur Continuer.
- Dans le volet Data stores, cliquez sur Créer un data store.
- Dans le volet Sélectionner une source de données, choisissez Cloud Storage.
- Dans le volet Import data from GCS (Importer des données à partir de GCS), assurez-vous que l'option Folder (Dossier) est sélectionnée.
- Dans le champ gs://, saisissez la valeur suivante:
cloud-samples-data/gen-app-builder/search/stanford-cs-224
. Ce bucket Cloud Storage contient des fichiers PDF provenant d'un dossier Cloud Storage public à des fins de test. - Sélectionnez Documents non structurés, puis cliquez sur Continuer.
- Dans le volet Configurer votre data store, sélectionnez global (Global) comme emplacement pour votre data store.
- Saisissez un nom pour votre data store. Vous utiliserez ce nom plus tard dans cet atelier de programmation lors du déploiement de votre service Cloud Run. Cliquez sur Créer.
- Dans le volet Datastores, sélectionnez votre nouveau data store et cliquez sur Create (Créer).
- Sur la page Données de votre data store, cliquez sur l'onglet Activité pour consulter l'état de votre ingestion de données. Une fois l'importation terminée, la mention Importation terminée s'affiche dans la colonne "État".
- Cliquez sur l'onglet Documents pour afficher le nombre de documents importés.
- Dans le menu de navigation, cliquez sur Aperçu pour tester l'application de recherche.
- Dans la barre de recherche, saisissez
final lab due date
, puis appuyez sur Entrée pour afficher les résultats.
5. Créer le service Cloud Run
Dans cette section, vous allez créer un service Cloud Run qui accepte une chaîne de requête pour vos termes de recherche. Ce service utilisera les bibliothèques clientes Python pour l'API Discovery Engine. Pour les autres environnements d'exécution compatibles, vous pouvez consulter la liste ici.
Créer le code source de la fonction
Tout d'abord, créez un répertoire et utilisez la commande cd pour y accéder.
mkdir docs-search-service-python && cd $_
Ensuite, créez un fichier requirements.txt
avec le contenu suivant:
blinker==1.6.3 cachetools==5.3.1 certifi==2023.7.22 charset-normalizer==3.3.0 click==8.1.7 Flask==3.0.0 google-api-core==2.12.0 google-auth==2.23.3 google-cloud-discoveryengine==0.11.2 googleapis-common-protos==1.61.0 grpcio==1.59.0 grpcio-status==1.59.0 idna==3.4 importlib-metadata==6.8.0 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.3 numpy==1.26.1 proto-plus==1.22.3 protobuf==4.24.4 pyasn1==0.5.0 pyasn1-modules==0.3.0 requests==2.31.0 rsa==4.9 urllib3==2.0.7 Werkzeug==3.0.1 zipp==3.17.0
Ensuite, créez un fichier source main.py
avec le contenu suivant:
from typing import List import json import os from flask import Flask from flask import request app = Flask(__name__) from google.api_core.client_options import ClientOptions from google.cloud import discoveryengine_v1 as discoveryengine project_id = os.environ.get('PROJECT_ID') location = "global" # Values: "global", "us", "eu" data_store_id = os.environ.get('SEARCH_ENGINE_ID') print(project_id) print(data_store_id) @app.route("/") def search_storage(): search_query = request.args.get("searchQuery") result = search_sample(project_id, location, data_store_id, search_query) return result def search_sample( project_id: str, location: str, data_store_id: str, search_query: str, ) -> str: # For more information, refer to: # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store client_options = ( ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com") if location != "global" else None ) # Create a client client = discoveryengine.SearchServiceClient(client_options=client_options) # The full resource name of the search engine serving config # e.g. projects/{project_id}/locations/{location}/dataStores/{data_store_id}/servingConfigs/{serving_config_id} serving_config = client.serving_config_path( project=project_id, location=location, data_store=data_store_id, serving_config="default_config", ) # Optional: Configuration options for search # Refer to the `ContentSearchSpec` reference for all supported fields: # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest.ContentSearchSpec content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec( # For information about snippets, refer to: # https://cloud.google.com/generative-ai-app-builder/docs/snippets snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec( return_snippet=True ), # For information about search summaries, refer to: # https://cloud.google.com/generative-ai-app-builder/docs/get-search-summaries summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec( summary_result_count=5, include_citations=True, ignore_adversarial_query=True, ignore_non_summary_seeking_query=True, ), ) # Refer to the `SearchRequest` reference for all supported fields: # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest request = discoveryengine.SearchRequest( serving_config=serving_config, query=search_query, page_size=10, content_search_spec=content_search_spec, query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec( condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO, ), spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec( mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO ), ) response = client.search(request) return response.summary.summary_text if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Configurer des variables d'environnement
Dans ce code, vous allez créer quelques variables d'environnement pour améliorer la lisibilité des commandes gcloud
utilisées dans cet atelier de programmation.
PROJECT_ID=$(gcloud config get-value project) SERVICE_NAME="search-storage-pdfs-python" SERVICE_REGION="us-central1" # update with your data store name SEARCH_ENGINE_ID=<your-data-store-name>
Créer un compte de service
Dans cet atelier de programmation, vous allez apprendre à créer un compte de service pour que le service Cloud Run puisse accéder à l'API Vertex AI Search.
SERVICE_ACCOUNT="cloud-run-vertex-ai-search" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run Vertex AI Search service account" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/discoveryengine.editor'
Déployer le service Cloud Run
Vous pouvez désormais utiliser un déploiement basé sur la source pour conteneuriser automatiquement votre service Cloud Run.
gcloud run deploy $SERVICE_NAME \ --region=$SERVICE_REGION \ --source=. \ --service-account $SERVICE_ACCOUNT \ --update-env-vars SEARCH_ENGINE_ID=$SEARCH_ENGINE_ID,PROJECT_ID=$PROJECT_ID \ --no-allow-unauthenticated
Vous pouvez ensuite enregistrer l'URL Cloud Run en tant que variable d'environnement pour l'utiliser plus tard.
ENDPOINT_URL="$(gcloud run services describe $SERVICE_NAME --region=$SERVICE_REGION --format='value(status.url)')"
6. Appeler le service Cloud Run
Vous pouvez maintenant appeler votre service Cloud Run avec une chaîne de requête pour demander What is the final lab due date?
.
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "$ENDPOINT_URL?searchQuery=what+is+the+final+lab+due+date"
Vos résultats doivent ressembler à l'exemple ci-dessous:
The final lab is due on Tuesday, March 21 at 4:30 PM [1].
7. Félicitations !
Félicitations ! Vous avez terminé cet atelier de programmation.
Nous vous recommandons de consulter la documentation sur Vertex AI Search et Cloud Run.
Points abordés
- Créer une application Vertex AI Search pour les données non structurées sous forme de PDF ingérés à partir d'un bucket Cloud Storage
- Créer un point de terminaison HTTP à l'aide d'un déploiement basé sur la source dans Cloud Run
- Créer un compte de service en suivant le principe du moindre privilège que le service Cloud Run utilise pour interroger l'application Vertex AI Search.
- Comment appeler le service Cloud Run pour interroger l'application Vertex AI Search
8. Effectuer un nettoyage
Pour éviter des frais accidentels (par exemple, si cette fonction Cloud est invoquée plus de fois que l'allocation mensuelle des appels Cloud Functions dans le niveau sans frais), vous pouvez supprimer la fonction Cloud ou le projet créé à l'étape 2.
Pour supprimer la fonction Cloud, accédez à la console Cloud de la fonction Cloud à l'adresse https://console.cloud.google.com/functions/ et supprimez la fonction imagen_vqa (ou $FUNCTION_NAME au cas où vous auriez utilisé un autre nom).
Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis cliquer sur "Supprimer". Si vous supprimez le projet, vous devrez le modifier dans Cloud SDK. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list
.