Accéder aux modèles Gemini depuis un workflow à l'aide de Vertex AI

Generative AI sur Vertex AI (également appelé genAI ou gen AI) vous donne accès aux modèles d'IA générative de Google pour plusieurs modalités (texte, code, images, voix). Vous pouvez tester et ajuster ces grands modèles de langage (LLM), puis les déployer pour les utiliser dans vos applications optimisées par l'IA. Pour en savoir plus, consultez la présentation de l'IA générative sur Vertex AI.

Vertex AI propose divers modèles de fondation d'IA générative accessibles via une API, y compris les modèles utilisés dans ce guide. Pour en savoir plus sur le choix d'un modèle, consultez Modèles Google.

Chaque modèle est exposé via un point de terminaison d'éditeur spécifique à votre projetGoogle Cloud . Il n'est donc pas nécessaire de déployer le modèle de fondation, sauf si vous devez le régler pour un cas d'utilisation spécifique. Vous pouvez envoyer un prompt au point de terminaison de l'éditeur. Une requête est une instruction en langage naturel envoyée à un LLM pour déclencher une réponse.

Ce tutoriel présente des workflows qui génèrent des réponses à partir de modèles Vertex AI en envoyant des requêtes textuelles aux points de terminaison de l'éditeur à l'aide d'un connecteur Workflows ou d'une requête HTTP POST. Pour en savoir plus, consultez la présentation du connecteur d'API Vertex AI et la section Envoyer une requête HTTP.

Notez que vous pouvez déployer et exécuter chaque workflow indépendamment les uns des autres.

Déployer un workflow qui décrit une image

Déployez un workflow qui utilise une méthode de connecteur (generateContent) pour envoyer une requête à un point de terminaison d'éditeur de modèle. Cette méthode permet de générer du contenu avec des entrées multimodales.

Le workflow fournit une invite de texte et l'URI d'une image accessible au public dans un bucket Cloud Storage. Vous pouvez afficher l'image et, dans la console Google Cloud , vous pouvez afficher les détails de l'objet.

Le workflow renvoie une description de l'image à partir de la réponse générée par le modèle.

Pour en savoir plus sur les paramètres du corps de la requête HTTP utilisés lors de l'envoi de requêtes au LLM, ainsi que sur les éléments du corps de la réponse, consultez la documentation de référence de l'API Gemini.

Console

  1. Dans la console Google Cloud , accédez à la page Workflows.

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Saisissez un nom pour le nouveau workflow : describe-image.

  4. Dans la liste Région, sélectionnez us-central1 (Iowa).

  5. Pour le champ Compte de service, sélectionnez le compte de service que vous avez créé précédemment.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow :

    main:
        params: [args]
        steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: "us-central1"
                - model: "gemini-2.5-flash"
                - text_combined: ""
        - ask_llm:
            call: googleapis.aiplatform.v1.projects.locations.endpoints.generateContent
            args:
                model: ${"projects/" + project + "/locations/" + location + "/publishers/google/models/" + model}
                region: ${location}
                body:
                    contents:
                        role: user
                        parts:
                        - fileData:
                            mimeType: image/jpeg
                            fileUri: ${args.image_url}
                        - text: Describe this picture in detail
                    generation_config:
                        temperature: 0.4
                        max_output_tokens: 2048
                        top_p: 1
                        top_k: 32
            result: llm_response
        - return_result:
            return:
                image_url: ${args.image_url}
                image_description: ${llm_response.candidates[0].content.parts[0].text}
  8. Cliquez sur Déployer.

gcloud

  1. Créez un fichier de code source pour votre workflow :

    touch describe-image.yaml
  2. Dans un éditeur de texte, copiez le workflow suivant dans votre fichier de code source :

    main:
        params: [args]
        steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: "us-central1"
                - model: "gemini-2.5-flash"
                - text_combined: ""
        - ask_llm:
            call: googleapis.aiplatform.v1.projects.locations.endpoints.generateContent
            args:
                model: ${"projects/" + project + "/locations/" + location + "/publishers/google/models/" + model}
                region: ${location}
                body:
                    contents:
                        role: user
                        parts:
                        - fileData:
                            mimeType: image/jpeg
                            fileUri: ${args.image_url}
                        - text: Describe this picture in detail
                    generation_config:
                        temperature: 0.4
                        max_output_tokens: 2048
                        top_p: 1
                        top_k: 32
            result: llm_response
        - return_result:
            return:
                image_url: ${args.image_url}
                image_description: ${llm_response.candidates[0].content.parts[0].text}
  3. Déployez le workflow en saisissant la commande suivante :

    gcloud workflows deploy describe-image \
        --source=describe-image.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Exécuter le workflow

L'exécution d'un workflow exécute la définition actuelle du workflow associé au workflow.

Console

  1. Dans la console Google Cloud , accédez à la page Workflows.

    Accéder à "Workflows"

  2. Sur la page Workflows, sélectionnez le workflow describe-image pour accéder à sa page d'informations.

  3. Sur la page Détails du workflow, cliquez sur Exécuter.

  4. Pour Entrée, saisissez ce qui suit :

    {"image_url":"gs://generativeai-downloads/images/scones.jpg"}
  5. Cliquez à nouveau sur Exécuter.

  6. Affichez les résultats du workflow dans le volet Output (Résultat).

    La sortie devrait ressembler à ce qui suit :

    {
      "image_description": "There are three pink peony flowers on the right side of the picture[]...]There is a white napkin on the table.",
      "image_url": "gs://generativeai-downloads/images/scones.jpg"
    }

gcloud

  1. Ouvrez un terminal.

  2. Exécutez le workflow :

    gcloud workflows run describe-image \
        --data='{"image_url":"gs://generativeai-downloads/images/scones.jpg"}'

    Les résultats de l'exécution doivent ressembler à ce qui suit :

      Waiting for execution [258b530e-a093-46d7-a4ff-cbf5392273c0] to complete...done.
      argument: '{"image_url":"gs://generativeai-downloads/images/scones.jpg"}'
      createTime: '2024-02-09T13:59:32.166409938Z'
      duration: 4.174708484s
      endTime: '2024-02-09T13:59:36.341118422Z'
      name: projects/1051295516635/locations/us-central1/workflows/describe-image/executions/258b530e-a093-46d7-a4ff-cbf5392273c0
      result: "{\"image_description\":\"The picture shows a rustic table with a white surface,\
        \ on which there are several scones with blueberries, as well as two cups of coffee\
        [...]
        \ on the table. The background of the table is a dark blue color.\",\"image_url\"\
        :\"gs://generativeai-downloads/images/scones.jpg\"}"
      startTime: '2024-02-09T13:59:32.166409938Z'
      state: SUCCEEDED

Déployer un workflow qui génère des historiques de pays

Déployez un workflow qui parcourt une liste de pays en entrée en parallèle et utilise une méthode de connecteur (generateContent) pour envoyer une requête à un point de terminaison d'éditeur de modèle. Cette méthode permet de générer du contenu avec des entrées multimodales.

Le workflow renvoie les historiques des pays générés par le modèle, en les combinant dans une carte.

Pour en savoir plus sur les paramètres du corps de la requête HTTP utilisés lors de l'envoi de requêtes au LLM, ainsi que sur les éléments du corps de la réponse, consultez la documentation de référence de l'API Gemini.

Console

  1. Dans la console Google Cloud , accédez à la page Workflows.

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Saisissez un nom pour le nouveau workflow : gemini-pro-country-histories.

  4. Dans la liste Région, sélectionnez us-central1 (Iowa).

  5. Pour le champ Compte de service, sélectionnez le compte de service que vous avez créé précédemment.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow :

    main:
        params: [args]
        steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: "us-central1"
                - model: "gemini-2.5-flash"
                - histories: {}
        - loop_over_countries:
            parallel:
                shared: [histories]
                for:
                    value: country
                    in: ${args.countries}
                    steps:
                        - ask_llm:
                            call: googleapis.aiplatform.v1.projects.locations.endpoints.generateContent
                            args:
                                model: ${"projects/" + project + "/locations/" + location + "/publishers/google/models/" + model}
                                region: ${location}
                                body:
                                    contents:
                                        role: "USER"
                                        parts:
                                            text: ${"Can you tell me about the history of " + country}
                                    generation_config:
                                        temperature: 0.5
                                        max_output_tokens: 2048
                                        top_p: 0.8
                                        top_k: 40
                            result: llm_response
                        - add_to_histories:
                            assign:
                                - histories[country]: ${llm_response.candidates[0].content.parts[0].text}
        - return_result:
            return: ${histories}
  8. Cliquez sur Déployer.

gcloud

  1. Créez un fichier de code source pour votre workflow :

    touch gemini-pro-country-histories.yaml
  2. Dans un éditeur de texte, copiez le workflow suivant dans votre fichier de code source :

    main:
        params: [args]
        steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: "us-central1"
                - model: "gemini-2.5-flash"
                - histories: {}
        - loop_over_countries:
            parallel:
                shared: [histories]
                for:
                    value: country
                    in: ${args.countries}
                    steps:
                        - ask_llm:
                            call: googleapis.aiplatform.v1.projects.locations.endpoints.generateContent
                            args:
                                model: ${"projects/" + project + "/locations/" + location + "/publishers/google/models/" + model}
                                region: ${location}
                                body:
                                    contents:
                                        role: "USER"
                                        parts:
                                            text: ${"Can you tell me about the history of " + country}
                                    generation_config:
                                        temperature: 0.5
                                        max_output_tokens: 2048
                                        top_p: 0.8
                                        top_k: 40
                            result: llm_response
                        - add_to_histories:
                            assign:
                                - histories[country]: ${llm_response.candidates[0].content.parts[0].text}
        - return_result:
            return: ${histories}
  3. Déployez le workflow en saisissant la commande suivante :

    gcloud workflows deploy gemini-pro-country-histories \
        --source=gemini-pro-country-histories.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Exécuter le workflow

L'exécution d'un workflow exécute la définition actuelle du workflow associé au workflow.

Console

  1. Dans la console Google Cloud , accédez à la page Workflows.

    Accéder à "Workflows"

  2. Sur la page Workflows, sélectionnez le workflow gemini-pro-country-histories pour accéder à sa page d'informations.

  3. Sur la page Détails du workflow, cliquez sur Exécuter.

  4. Pour Entrée, saisissez ce qui suit :

    {"countries":["Argentina", "Bhutan", "Cyprus", "Denmark", "Ethiopia"]}
  5. Cliquez à nouveau sur Exécuter.

  6. Affichez les résultats du workflow dans le volet Output (Résultat).

    La sortie devrait ressembler à ce qui suit :

    {
      "Argentina": "The history of Argentina is a complex and fascinating one, marked by periods of prosperity and decline, political [...]
      "Bhutan": "The history of Bhutan is a rich and fascinating one, dating back to the 7th century AD. Here is a brief overview: [...]
      "Cyprus": "The history of Cyprus is a long and complex one, spanning over 10,000 years. The island has been ruled by a succession [...]
      "Denmark": "1. **Prehistory and Early History (c. 12,000 BC - 800 AD)**\\n   - The earliest evidence of human habitation in Denmark [...]
      "Ethiopia": "The history of Ethiopia is a long and complex one, stretching back to the earliest human civilizations. The country is [...]
    }

gcloud

  1. Ouvrez un terminal.

  2. Exécutez le workflow :

    gcloud workflows run gemini-pro-country-histories \
        --data='{"countries":["Argentina", "Bhutan", "Cyprus", "Denmark", "Ethiopia"]}' \
        --location=us-central1

    Les résultats de l'exécution doivent ressembler à ce qui suit :

      Waiting for execution [7ae1ccf1-29b7-4c2c-99ec-7a12ae289391] to complete...done.
      argument: '{"countries":["Argentina","Bhutan","Cyprus","Denmark","Ethiopia"]}'
      createTime: '2024-02-09T16:25:16.742349156Z'
      duration: 12.075968673s
      endTime: '2024-02-09T16:25:28.818317829Z'
      name: projects/1051295516635/locations/us-central1/workflows/gemini-pro-country-histories/executions/7ae1ccf1-29b7-4c2c-99ec-7a12ae289391
      result: "{\"Argentina\":\"The history of Argentina can be traced back to the arrival\
        [...]
        n* 2015: Argentina elects Mauricio Macri as president.\",\"Bhutan\":\"The history\
        [...]
        \ natural beauty, ancient monasteries, and friendly people.\",\"Cyprus\":\"The history\
        [...]
        ,\"Denmark\":\"The history of Denmark can be traced back to the Stone Age, with\
        [...]
        \ a high standard of living.\",\"Ethiopia\":\"The history of Ethiopia is long and\
        [...]
      startTime: '2024-02-09T16:25:16.742349156Z'
      state: SUCCEEDED

Déployer un workflow qui résume un document volumineux

Déployez un workflow qui divise un grand document en parties plus petites, en envoyant des requêtes http.post à un point de terminaison d'éditeur de modèle en parallèle afin que le modèle puisse résumer chaque partie simultanément. Le workflow combine enfin tous les résumés partiels en un résumé complet.

Pour en savoir plus sur les paramètres du corps de la requête HTTP utilisés lors de l'envoi de requêtes au LLM, ainsi que sur les éléments du corps de la réponse, consultez la documentation de référence de l'API Gemini.

La définition du workflow suppose que vous avez créé un bucket Cloud Storage dans lequel vous pouvez importer un fichier texte. Pour en savoir plus sur le connecteur Workflows (googleapis.storage.v1.objects.get) utilisé pour récupérer des objets du bucket Cloud Storage, consultez la documentation de référence sur les connecteurs.

Une fois le workflow déployé, vous pouvez l'exécuter en créant un déclencheur Eventarc approprié, puis en important un fichier dans le bucket. Pour en savoir plus, consultez Acheminer des événements Cloud Storage vers Workflows. Notez que des API supplémentaires doivent être activées et des rôles supplémentaires doivent être attribués, y compris le rôle Utilisateur des objets Storage (roles/storage.objectUser) à votre compte de service, qui permet d'utiliser les objets Cloud Storage. Pour en savoir plus, consultez la section Se préparer à créer un déclencheur.

Console

  1. Dans la console Google Cloud , accédez à la page Workflows.

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Saisissez un nom pour le nouveau workflow : gemini-pro-summaries.

  4. Dans la liste Région, sélectionnez us-central1 (Iowa).

  5. Pour le champ Compte de service, sélectionnez le compte de service que vous avez créé précédemment.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow :

    main:
        params: [input]
        steps:
        - assign_file_vars:
            assign:
                - file_size: ${int(input.data.size)}
                - chunk_size: 64000
                - n_chunks: ${int(file_size / chunk_size)}
                - summaries: []
                - all_summaries_concatenated: ""
        - loop_over_chunks:
            parallel:
                shared: [summaries]
                for:
                    value: chunk_idx
                    range: ${[0, n_chunks]}
                    steps:
                        - assign_bounds:
                            assign:
                                - lower_bound: ${chunk_idx * chunk_size}
                                - upper_bound: ${(chunk_idx + 1) * chunk_size}
                                - summaries: ${list.concat(summaries, "")}
                        - dump_file_content:
                            call: http.get
                            args:
                                url: ${"https://storage.googleapis.com/storage/v1/b/" + input.data.bucket + "/o/" + input.data.name + "?alt=media"}
                                auth:
                                    type: OAuth2
                                headers:
                                    Range: ${"bytes=" + lower_bound + "-" + upper_bound}
                            result: file_content
                        - assign_chunk:
                            assign:
                                - chunk: ${file_content.body}
                        - generate_chunk_summary:
                            call: ask_gemini_for_summary
                            args:
                                textToSummarize: ${chunk}
                            result: summary
                        - assign_summary:
                            assign:
                                - summaries[chunk_idx]: ${summary}
        - concat_summaries:
            for:
                value: summary
                in: ${summaries}
                steps:
                    - append_summaries:
                        assign:
                            - all_summaries_concatenated: ${all_summaries_concatenated + "\n" + summary}
        - reduce_summary:
            call: ask_gemini_for_summary
            args:
                textToSummarize: ${all_summaries_concatenated}
            result: final_summary
        - return_result:
            return:
                - summaries: ${summaries}
                - final_summary: ${final_summary}
    
    ask_gemini_for_summary:
        params: [textToSummarize]
        steps:
            - init:
                assign:
                    - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - location: "us-central1"
                    - model: "gemini-2.5-pro"
                    - summary: ""
            - call_gemini:
                call: http.post
                args:
                    url: ${"https://" + location + "-aiplatform.googleapis.com" + "/v1/projects/" + project + "/locations/" + location + "/publishers/google/models/" + model + ":generateContent"}
                    auth:
                        type: OAuth2
                    body:
                        contents:
                            role: user
                            parts:
                                - text: '${"Make a summary of the following text:\n\n" + textToSummarize}'
                        generation_config:
                            temperature: 0.2
                            maxOutputTokens: 2000
                            topK: 10
                            topP: 0.9
                result: gemini_response
            # Sometimes, there's no text, for example, due to safety settings
            - check_text_exists:
                switch:
                - condition: ${not("parts" in gemini_response.body.candidates[0].content)}
                  next: return_summary
            - extract_text:
                assign:
                    - summary: ${gemini_response.body.candidates[0].content.parts[0].text}
            - return_summary:
                return: ${summary}
  8. Cliquez sur Déployer.

gcloud

  1. Créez un fichier de code source pour votre workflow :

    touch gemini-pro-summaries.yaml
  2. Dans un éditeur de texte, copiez le workflow suivant dans votre fichier de code source :

    main:
        params: [input]
        steps:
        - assign_file_vars:
            assign:
                - file_size: ${int(input.data.size)}
                - chunk_size: 64000
                - n_chunks: ${int(file_size / chunk_size)}
                - summaries: []
                - all_summaries_concatenated: ""
        - loop_over_chunks:
            parallel:
                shared: [summaries]
                for:
                    value: chunk_idx
                    range: ${[0, n_chunks]}
                    steps:
                        - assign_bounds:
                            assign:
                                - lower_bound: ${chunk_idx * chunk_size}
                                - upper_bound: ${(chunk_idx + 1) * chunk_size}
                                - summaries: ${list.concat(summaries, "")}
                        - dump_file_content:
                            call: http.get
                            args:
                                url: ${"https://storage.googleapis.com/storage/v1/b/" + input.data.bucket + "/o/" + input.data.name + "?alt=media"}
                                auth:
                                    type: OAuth2
                                headers:
                                    Range: ${"bytes=" + lower_bound + "-" + upper_bound}
                            result: file_content
                        - assign_chunk:
                            assign:
                                - chunk: ${file_content.body}
                        - generate_chunk_summary:
                            call: ask_gemini_for_summary
                            args:
                                textToSummarize: ${chunk}
                            result: summary
                        - assign_summary:
                            assign:
                                - summaries[chunk_idx]: ${summary}
        - concat_summaries:
            for:
                value: summary
                in: ${summaries}
                steps:
                    - append_summaries:
                        assign:
                            - all_summaries_concatenated: ${all_summaries_concatenated + "\n" + summary}
        - reduce_summary:
            call: ask_gemini_for_summary
            args:
                textToSummarize: ${all_summaries_concatenated}
            result: final_summary
        - return_result:
            return:
                - summaries: ${summaries}
                - final_summary: ${final_summary}
    
    ask_gemini_for_summary:
        params: [textToSummarize]
        steps:
            - init:
                assign:
                    - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - location: "us-central1"
                    - model: "gemini-2.5-pro"
                    - summary: ""
            - call_gemini:
                call: http.post
                args:
                    url: ${"https://" + location + "-aiplatform.googleapis.com" + "/v1/projects/" + project + "/locations/" + location + "/publishers/google/models/" + model + ":generateContent"}
                    auth:
                        type: OAuth2
                    body:
                        contents:
                            role: user
                            parts:
                                - text: '${"Make a summary of the following text:\n\n" + textToSummarize}'
                        generation_config:
                            temperature: 0.2
                            maxOutputTokens: 2000
                            topK: 10
                            topP: 0.9
                result: gemini_response
            # Sometimes, there's no text, for example, due to safety settings
            - check_text_exists:
                switch:
                - condition: ${not("parts" in gemini_response.body.candidates[0].content)}
                  next: return_summary
            - extract_text:
                assign:
                    - summary: ${gemini_response.body.candidates[0].content.parts[0].text}
            - return_summary:
                return: ${summary}
  3. Déployez le workflow en saisissant la commande suivante :

    gcloud workflows deploy gemini-pro-summaries \
        --source=gemini-pro-summaries.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com