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, l'expertise en recherche et les technologies d'IA conversationnelle de Google pour créer des applications d'IA générative de niveau entreprise. Cet atelier de programmation se concentre sur l'utilisation de Vertex AI Search, qui vous permet de créer une application de recherche de qualité Google basée sur vos propres données et d'intégrer une barre de recherche sur les pages de votre site Web ou dans 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. Vous pouvez déployer du code écrit dans n'importe quel langage de programmation sur Cloud Run (qui peut être placé dans un conteneur) à l'aide de l'option de déploiement basé sur la source.
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 d'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 du déploiement basé sur la source dans Cloud Run
- Comment créer un compte de service en appliquant le principe du moindre privilège pour que le service Cloud Run puisse 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 à partir du code source pour commencer.
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 s'affiche pour vous expliquer de quoi il s'agit. Si cet écran 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 sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.
Une fois connecté à Cloud Shell, vous êtes en principe 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 activer l'API".
4. Créer une application de recherche pour les données non structurées issues de Cloud Storage
- Dans la console Google Cloud, accédez à la page Search and Conversation. Cliquez sur Nouvelle application.
- Dans le volet Sélectionner le type d'application, sélectionnez Recherche.
- Assurez-vous que les fonctionnalités Enterprise sont activées pour recevoir des 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 recherche.
- Dans le champ Nom de l'application, saisissez le nom de votre application. L'ID de votre application s'affiche sous le nom de l'application.
- Sélectionnez global (Global) 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 Importer des données depuis GCS, assurez-vous que Dossier est sélectionné.
- 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 accessible au public à des fins de test. - Sélectionnez Documents non structurés, puis cliquez sur Continuer.
- Dans le volet Configurer votre datastore, sélectionnez global (Global) comme emplacement pour votre datastore.
- Attribuez un nom à votre data store. Vous utiliserez ce nom plus tard dans cet atelier de programmation lorsque vous déploierez votre service Cloud Run. Cliquez sur Créer.
- Dans le volet Data stores, sélectionnez votre nouveau data store, puis cliquez sur Créer.
- Sur la page Données de votre data store, cliquez sur l'onglet Activité pour consulter l'état de l'ingestion de vos données. Une fois le processus d'importation terminé, 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, cliquez ici pour afficher la liste.
Créer le code source de la fonction
Commencez par créer un répertoire et utilisez la commande cd pour y accéder.
mkdir docs-search-service-python && cd $_
Créez ensuite 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
Créez ensuite 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
Cet atelier de programmation vous montre comment créer un compte de service que le service Cloud Run peut utiliser pour 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 ultérieurement.
ENDPOINT_URL="$(gcloud run services describe $SERVICE_NAME --region=$SERVICE_REGION --format='value(status.url)')"
6. Appeler le service Cloud Run
Vous pouvez désormais 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 devraient ressembler à l'exemple de résultat ci-dessous :
The final lab is due on Tuesday, March 21 at 4:30 PM [1].
7. Félicitations !
Bravo ! 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 du déploiement basé sur la source dans Cloud Run
- Comment créer un compte de service en appliquant le principe du moindre privilège pour que le service Cloud Run puisse 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 involontaires (par exemple, si cette fonction Cloud est invoquée par inadvertance plus de fois que votre allocation mensuelle d'invocations de fonctions Cloud dans le niveau sans frais), vous pouvez supprimer la fonction Cloud ou le projet que vous avez créé à l'étape 2.
Pour supprimer la fonction Cloud, accédez à la console Cloud Functions sur https://console.cloud.google.com/functions/ et supprimez la fonction imagen_vqa (ou $FUNCTION_NAME si vous avez 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 choisir "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.