Utiliser Vertex AI Search sur des PDF (données non structurées) dans Cloud Storage à partir d'un service Cloud Run

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

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

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.

d95252b003979716.png

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

7833d5e1c5d18f54.png

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.

  1. 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`
  1. 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 :

  1. Dans la console Google Cloud, accédez à la console Vertex AI Search and Conversation.
  2. 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

  1. Dans la console Google Cloud, accédez à la page Search and Conversation. Cliquez sur Nouvelle application.
  2. Dans le volet Sélectionner le type d'application, sélectionnez Recherche.
  3. Assurez-vous que les fonctionnalités Enterprise sont activées pour recevoir des réponses directement extraites de vos documents.
  4. Assurez-vous que l'option Fonctionnalités LLM avancées est activée pour recevoir des résumés de recherche.
  5. 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.
  6. Sélectionnez global (Global) comme emplacement pour votre application, puis cliquez sur Continuer.
  7. Dans le volet Data stores, cliquez sur Créer un data store.
  8. Dans le volet Sélectionner une source de données, choisissez Cloud Storage.
  9. Dans le volet Importer des données depuis GCS, assurez-vous que Dossier est sélectionné.
  10. 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.
  11. Sélectionnez Documents non structurés, puis cliquez sur Continuer.
  12. Dans le volet Configurer votre datastore, sélectionnez global (Global) comme emplacement pour votre datastore.
  13. 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.
  14. Dans le volet Data stores, sélectionnez votre nouveau data store, puis cliquez sur Créer.
  15. 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".
  16. Cliquez sur l'onglet Documents pour afficher le nombre de documents importés.
  17. Dans le menu de navigation, cliquez sur Aperçu pour tester l'application de recherche.
  18. 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.