Compréhension des images

Vous pouvez ajouter des images aux requêtes Gemini pour effectuer des tâches qui impliquent de comprendre le contenu des images incluses. Cette page explique comment ajouter des images à vos requêtes Gemini dans Vertex AI à l'aide de la console Google Cloud et de l'API Vertex AI.

Modèles compatibles

Le tableau suivant présente les modèles compatibles avec la compréhension d'images :

Modèle Détails de la modalité d'image

Gemini 1.5 Flash

Accéder à la fiche du modèle Gemini 1.5 Pro
Nombre maximal d'images par requête : 3 000

Gemini 1.5 Pro

Accéder à la fiche du modèle Gemini 1.5 Pro
Nombre maximal d'images par requête : 3 000

Gemini 1.0 Pro Vision

Accéder à la fiche du modèle Gemini 1.0 Pro Vision
Nombre maximal d'images par requête : 16

Pour obtenir la liste des langues compatibles avec les modèles Gemini, consultez les informations sur les modèles sur la page Modèles Google. Pour en savoir plus sur la conception de requêtes multimodales, consultez la page Concevoir des requêtes multimodales. Si vous recherchez une méthode pour utiliser Gemini directement à partir de vos applications mobiles et Web, consultez les SDK Vertex AI in Firebase pour les applications Android, Swift, Web et Flutter.

Ajouter des images à une requête

Vous pouvez ajouter une ou plusieurs images dans votre requête à Gemini.

Image unique

Les exemples de code sur chacun des onglets suivants montrent une manière différente d'identifier le contenu d'une image. Cet exemple fonctionne avec tous les modèles multimodaux Gemini.

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API SDK Vertex AI pour Python.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez le paramètre stream dans generate_content.

  response = model.generate_content(contents=[...], stream = True)
  

Pour une réponse sans streaming, supprimez le paramètre ou définissez-le sur False.

Exemple de code

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update project_id and location
vertexai.init(project=PROJECT_ID, location="us-central1")

model = GenerativeModel("gemini-1.5-flash-002")

image_file = Part.from_uri(
    "gs://cloud-samples-data/generative-ai/image/scones.jpg", "image/jpeg"
)

# Query the model
response = model.generate_content([image_file, "what is this image?"])
print(response.text)

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence du SDK Vertex AI pour Java pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode generateContentStream.

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

Pour une réponse non affichée progressivement, utilisez la méthode generateContent.

  public GenerateContentResponse generateContent(Content content)
  

Exemple de code

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.generativeai.ContentMaker;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.PartMaker;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.util.Base64;

public class MultimodalQuery {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";
    String dataImageBase64 = "your-base64-encoded-image";

    String output = multimodalQuery(projectId, location, modelName, dataImageBase64);
    System.out.println(output);
  }


  // Ask the model to recognise the brand associated with the logo image.
  public static String multimodalQuery(String projectId, String location, String modelName,
      String dataImageBase64) throws Exception {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      String output;
      byte[] imageBytes = Base64.getDecoder().decode(dataImageBase64);

      GenerativeModel model = new GenerativeModel(modelName, vertexAI);
      GenerateContentResponse response = model.generateContent(
          ContentMaker.fromMultiModalData(
              "What is this image?",
              PartMaker.fromMimeTypeAndData("image/png", imageBytes)
          ));

      output = ResponseHandler.getText(response);
      return output;
    }
  }
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de l'IA générative à l'aide du SDK Node.js. Pour en savoir plus, consultez la documentation de référence du SDK Node.js pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode generateContentStream.

  const streamingResp = await generativeModel.generateContentStream(request);
  

Pour une réponse non affichée progressivement, utilisez la méthode generateContent.

  const streamingResp = await generativeModel.generateContent(request);
  

Exemple de code

const {VertexAI} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function createNonStreamingMultipartContent(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-1.5-flash-001',
  image = 'gs://generativeai-downloads/images/scones.jpg',
  mimeType = 'image/jpeg'
) {
  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: projectId, location: location});

  // Instantiate the model
  const generativeVisionModel = vertexAI.getGenerativeModel({
    model: model,
  });

  // For images, the SDK supports both Google Cloud Storage URI and base64 strings
  const filePart = {
    fileData: {
      fileUri: image,
      mimeType: mimeType,
    },
  };

  const textPart = {
    text: 'what is shown in this image?',
  };

  const request = {
    contents: [{role: 'user', parts: [filePart, textPart]}],
  };

  console.log('Prompt Text:');
  console.log(request.contents[0].parts[1].text);

  console.log('Non-Streaming Response Text:');

  // Generate a response
  const response = await generativeVisionModel.generateContent(request);

  // Select the text from the response
  const fullTextResponse =
    response.response.candidates[0].content.parts[0].text;

  console.log(fullTextResponse);
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence du SDK Vertex AI pour Go pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode GenerateContentStream.

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

Pour une réponse non affichée progressivement, utilisez la méthode GenerateContent.

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

Exemple de code

import (
	"context"
	"encoding/json"
	"fmt"
	"io"

	"cloud.google.com/go/vertexai/genai"
)

func tryGemini(w io.Writer, projectID string, location string, modelName string) error {
	// location := "us-central1"
	// modelName := "gemini-1.5-flash-001"

	ctx := context.Background()
	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("error creating client: %w", err)
	}
	gemini := client.GenerativeModel(modelName)

	img := genai.FileData{
		MIMEType: "image/jpeg",
		FileURI:  "gs://generativeai-downloads/images/scones.jpg",
	}
	prompt := genai.Text("What is in this image?")

	resp, err := gemini.GenerateContent(ctx, img, prompt)
	if err != nil {
		return fmt.Errorf("error generating content: %w", err)
	}
	rb, err := json.MarshalIndent(resp, "", "  ")
	if err != nil {
		return fmt.Errorf("json.MarshalIndent: %w", err)
	}
	fmt.Fprintln(w, string(rb))
	return nil
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence de Vertex AI en langage C#.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode StreamGenerateContent.

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

Pour une réponse non affichée progressivement, utilisez la méthode GenerateContentAsync.

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

Pour en savoir plus sur la façon dont le serveur peut diffuser des réponses, consultez la section RPC de streaming.

Exemple de code


using Google.Api.Gax.Grpc;
using Google.Cloud.AIPlatform.V1;
using System.Text;
using System.Threading.Tasks;

public class GeminiQuickstart
{
    public async Task<string> GenerateContent(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.5-flash-001"
    )
    {
        // Create client
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        // Initialize content request
        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            GenerationConfig = new GenerationConfig
            {
                Temperature = 0.4f,
                TopP = 1,
                TopK = 32,
                MaxOutputTokens = 2048
            },
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { Text = "What's in this photo?" },
                        new Part { FileData = new() { MimeType = "image/png", FileUri = "gs://generativeai-downloads/images/scones.jpg" } }
                    }
                }
            }
        };

        // Make the request, returning a streaming response
        using PredictionServiceClient.StreamGenerateContentStream response = predictionServiceClient.StreamGenerateContent(generateContentRequest);

        StringBuilder fullText = new();

        // Read streaming responses from server until complete
        AsyncResponseStream<GenerateContentResponse> responseStream = response.GetResponseStream();
        await foreach (GenerateContentResponse responseItem in responseStream)
        {
            fullText.Append(responseItem.Candidates[0].Content.Parts[0].Text);
        }

        return fullText.ToString();
    }
}

Une fois que vous avez configuré votre environnement, vous pouvez utiliser REST pour tester une requête textuelle. L'exemple suivant envoie une requête au point de terminaison du modèle de l'éditeur.

Vous pouvez inclure des images stockées dans Cloud Storage ou utiliser des données d'image encodées en base64.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région dans laquelle traiter la requête.  : saisissez une région compatible. Pour obtenir la liste complète des régions compatibles, consultez la section Emplacements disponibles.
    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID : l'ID de votre projet.
  • FILE_URI : URI ou URL du fichier à inclure dans la requête. Les valeurs acceptées incluent les suivantes :
    • URI du bucket Cloud Storage : l'objet doit être accessible en lecture publique ou se trouver dans le même projet Google Cloud que celui qui envoie la requête.
    • URL HTTP : l'URL du fichier doit être accessible au public. Vous pouvez spécifier un fichier vidéo et jusqu'à 10 fichiers image par requête. Les fichiers audio et les documents ne doivent pas dépasser 15 Mo.
    • URL de la vidéo YouTube : la vidéo YouTube doit être la vôtre ou publique, et vous devez vous être connecté à la console Google Cloud avec le compte correspondant. Une seule URL de vidéo YouTube est acceptée par requête.

    Lorsque vous spécifiez un fileURI, vous devez également spécifier le type de contenu (mimeType) du fichier.

    Si vous ne disposez pas d'un fichier image dans Cloud Storage, vous pouvez utiliser le fichier suivant, accessible au public : gs://cloud-samples-data/generative-ai/image/scones.jpg avec un type MIME image/jpeg. Pour afficher cette image, ouvrez le fichier de l'exemple d'image.

  • MIME_TYPE : type de contenu du fichier spécifié dans les champs data ou fileUri. Les valeurs acceptées incluent les suivantes :
    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • image/webp
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT : instructions textuelles à inclure dans la requête. Par exemple, What is shown in this image?.

Pour envoyer votre requête, choisissez l'une des options suivantes :

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
EOF

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON semblable à la suivante.

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": " The image shows a table with a cup of coffee, a bowl of blueberries, and a plate of scones with blueberries on it. There are also pink flowers on the table."
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.027742893,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.07276838
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.026155617,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.07172113
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.04304285,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.037608635
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.08803312,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.09203286
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 265,
    "candidatesTokenCount": 35,
    "totalTokenCount": 300
  }
}

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région dans laquelle traiter la requête.  : saisissez une région compatible. Pour obtenir la liste complète des régions compatibles, consultez la section Emplacements disponibles.
    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID : l'ID de votre projet.
  • B64_BASE_IMAGE
    Encodage base64 de l'image, du fichier PDF ou de la vidéo à intégrer à la requête. Lorsque vous intégrez du contenu multimédia, vous devez également spécifier le type de contenu multimédia (mimeType) des données.
  • MIME_TYPE : type de contenu du fichier spécifié dans les champs data ou fileUri. Les valeurs acceptées incluent les suivantes :
    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • image/webp
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT : instructions textuelles à inclure dans la requête. Exemple : What is shown in this image?.

Pour envoyer votre requête, choisissez l'une des options suivantes :

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "inlineData": {
          "data": "B64_BASE_IMAGE",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
EOF

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "inlineData": {
          "data": "B64_BASE_IMAGE",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON semblable à la suivante.

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": " The image shows a table with a cup of coffee, a bowl of blueberries, and a plate of scones with blueberries on it. There are also pink flowers on the table."
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.027742893,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.07276838
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.026155617,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.07172113
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.04304285,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.037608635
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.08803312,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.09203286
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 265,
    "candidatesTokenCount": 35,
    "totalTokenCount": 300
  }
}
Notez les points suivants dans l'URL de cet exemple :
  • Utilisez la méthode generateContent pour demander que la réponse soit renvoyée une fois qu'elle a été entièrement générée. Pour réduire la perception de la latence auprès d'un public humain, affichez la réponse progressivement à mesure qu'elle est générée à l'aide de la méthode streamGenerateContent.
  • L'ID du modèle multimodal se trouve à la fin de l'URL avant la méthode (par exemple, gemini-1.5-flash ou gemini-1.0-pro-vision). Cet exemple peut également s'appliquer à d'autres modèles.
Pour envoyer une requête multimodale à l'aide de la console Google Cloud, procédez comme suit :

  1. Dans la section "Vertex AI" de la console Google Cloud, accédez à la page Vertex AI Studio.

    Accéder à Vertex AI Studio

  2. Cliquez sur Ouvrir en mode libre.

  3. Facultatif : Configurez le modèle et les paramètres :

    • Modèle : sélectionnez un modèle.
    • Région : sélectionnez la région que vous souhaitez utiliser.
    • Température : utilisez le curseur ou la zone de texte pour saisir une valeur de température.

      La température est utilisée pour l'échantillonnage pendant la génération des réponses, qui se produit lorsque topP et topK sont appliqués. La température permet de contrôler le degré de hasard dans la sélection des jetons. Les températures inférieures sont idéales pour les requêtes qui nécessitent une réponse moins ouverte ou créative, tandis que des températures plus élevées peuvent conduire à des résultats plus diversifiés ou créatifs. Une température de 0 signifie que les jetons de probabilité les plus élevés sont toujours sélectionnés. Dans ce cas, les réponses pour une requête donnée sont principalement déterministes, mais une petite quantité de variation est toujours possible.

      Si le modèle renvoie une réponse trop générique ou trop courte, ou s'il renvoie une réponse de remplacement, essayez d'augmenter la température.

    • Limite de jeton : utilisez le curseur ou la zone de texte pour saisir une valeur correspondant à la limite maximale de sortie.

      Nombre maximal de jetons pouvant être générés dans la réponse. Un jeton correspond environ à quatre caractères. 100 jetons correspondent à environ 60-80 mots.

      Spécifiez une valeur inférieure pour obtenir des réponses plus courtes et une valeur supérieure pour des réponses potentiellement plus longues.

    • Ajouter une séquence d'arrêt : facultatif. Saisissez une séquence d'arrêt, qui est une série de caractères incluant des espaces. Si le modèle rencontre une séquence d'arrêt, la génération de réponse s'arrête. La séquence d'arrêt n'est pas incluse dans la réponse, et vous pouvez ajouter jusqu'à cinq séquences d'arrêt.

  4. Facultatif : pour configurer des paramètres avancés, cliquez sur Avancé, puis configurez les paramètres comme suit :

    • Top-K: saisissez une valeur pour le top-K à l'aide du curseur ou de la zone de texte. (non compatible avec Gemini 1.5).

      Top-K modifie la façon dont le modèle sélectionne les jetons pour la sortie. Une valeur top-K de 1 signifie que le prochain jeton sélectionné est le plus probable parmi tous les jetons du vocabulaire du modèle (également appelé décodage glouton), tandis qu'une valeur top-K de 3 signifie que le jeton suivant est sélectionné parmi les trois jetons les plus probables en utilisant la température.

      Pour chaque étape de sélection du jeton, les jetons top-K avec les probabilités les plus élevées sont échantillonnés. Les jetons sont ensuite filtrés en fonction du top-P avec le jeton final sélectionné à l'aide de l'échantillonnage de température.

      Spécifiez une valeur inférieure pour les réponses moins aléatoires et une valeur plus élevée pour les réponses plus aléatoires.

    • Top-P : utilisez le curseur ou la zone de texte pour saisir une valeur. Les jetons sont sélectionnés de la probabilité la plus élevée jusqu'à ce que la somme de leurs probabilités soit égale à la valeur de top-P. Pour obtenir les résultats les moins variables, définissez "top-P" sur 0.
    • Nombre maximal de réponses : utilisez le curseur ou la zone de texte pour saisir une valeur correspondant au nombre de réponses à générer.
    • Diffuser les réponses : permet d'imprimer les réponses au fur et à mesure de leur génération.
    • Seuil de filtre de sécurité : sélectionnez le seuil de probabilité d'affichage de réponses potentiellement dangereuses.
    • Activer la connexion : la connexion n'est pas compatible avec les requêtes multimodales.

  5. Cliquez sur Insérer un média, puis sélectionnez une source pour votre fichier.

    Sélectionnez le fichier que vous souhaitez utiliser, puis cliquez sur Ouvrir.

    Saisissez l'URL du fichier que vous souhaitez utiliser, puis cliquez sur Insérer.

    Sélectionnez le bucket, puis le fichier que vous souhaitez importer, puis cliquez sur Sélectionner.

    1. Choisissez un compte et autorisez Vertex AI Studio à y accéder la première fois que vous sélectionnez cette option. Vous pouvez importer plusieurs fichiers dont la taille totale ne dépasse pas 10 Mo. La taille d'un fichier ne peut pas dépasser 7 Mo.
    2. Cliquez sur le fichier que vous souhaitez ajouter.
    3. Cliquez sur Sélectionner.

      La vignette du fichier s'affiche dans le volet Prompt. Le nombre total de jetons s'affiche également. Si les données de votre requête dépassent la limite de jetons, les jetons sont tronqués et ne sont pas inclus dans le traitement de vos données.

  6. Saisissez votre requête textuelle dans le volet Requête.

  7. Facultatif : Pour afficher les ID de jeton en texte et les ID de jeton, cliquez sur le nombre de jetons dans le volet Requête.

  8. Cliquez sur Envoyer.

  9. Facultatif : pour enregistrer votre requête dans Mes requêtes, cliquez sur Enregistrer.

  10. Facultatif : pour obtenir le code Python ou la commande curl de votre requête, cliquez sur  Obtenir le code.

Images multiples

Chacun des onglets suivants vous montre une manière différente d'inclure plusieurs images dans une requête. Chaque exemple accepte deux ensembles parmi les entrées suivantes :

  • Image d'un monument célèbre
  • Type de média de l'image
  • Texte indiquant la ville et le monument sur l'image

L'exemple utilise également une troisième image et un type de contenu multimédia, mais pas de texte. L'exemple renvoie une réponse textuelle indiquant la ville et le monument sur la troisième image.

Ces exemples d'images fonctionnent avec tous les modèles multimodaux Gemini.

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API SDK Vertex AI pour Python.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez le paramètre stream dans generate_content.

  response = model.generate_content(contents=[...], stream = True)
  

Pour une réponse sans streaming, supprimez le paramètre ou définissez-le sur False.

Exemple de code

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update project_id and location
vertexai.init(project=PROJECT_ID, location="us-central1")

# Load images from Cloud Storage URI
image_file1 = Part.from_uri(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png",
    mime_type="image/png",
)
image_file2 = Part.from_uri(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark2.png",
    mime_type="image/png",
)
image_file3 = Part.from_uri(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark3.png",
    mime_type="image/png",
)

model = GenerativeModel("gemini-1.5-flash-002")
response = model.generate_content(
    [
        image_file1,
        "city: Rome, Landmark: the Colosseum",
        image_file2,
        "city: Beijing, Landmark: Forbidden City",
        image_file3,
    ]
)
print(response.text)

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence du SDK Vertex AI pour Java pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode generateContentStream.

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

Pour une réponse non affichée progressivement, utilisez la méthode generateContent.

  public GenerateContentResponse generateContent(Content content)
  

Exemple de code

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.Content;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.generativeai.ContentMaker;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.PartMaker;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MultimodalMultiImage {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";

    multimodalMultiImage(projectId, location, modelName);
  }

  // Generates content from multiple input images.
  public static void multimodalMultiImage(String projectId, String location, String modelName)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      GenerativeModel model = new GenerativeModel(modelName, vertexAI);

      Content content = ContentMaker.fromMultiModalData(
          PartMaker.fromMimeTypeAndData("image/png", readImageFile(
              "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark1.png")),
          "city: Rome, Landmark: the Colosseum",
          PartMaker.fromMimeTypeAndData("image/png", readImageFile(
              "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark2.png")),
          "city: Beijing, Landmark: Forbidden City",
          PartMaker.fromMimeTypeAndData("image/png", readImageFile(
              "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark3.png"))
      );

      GenerateContentResponse response = model.generateContent(content);

      String output = ResponseHandler.getText(response);
      System.out.println(output);
    }
  }

  // Reads the image data from the given URL.
  public static byte[] readImageFile(String url) throws IOException {
    URL urlObj = new URL(url);
    HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
    connection.setRequestMethod("GET");

    int responseCode = connection.getResponseCode();

    if (responseCode == HttpURLConnection.HTTP_OK) {
      InputStream inputStream = connection.getInputStream();
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

      byte[] buffer = new byte[1024];
      int bytesRead;
      while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
      }

      return outputStream.toByteArray();
    } else {
      throw new RuntimeException("Error fetching file: " + responseCode);
    }
  }
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de l'IA générative à l'aide du SDK Node.js. Pour en savoir plus, consultez la documentation de référence du SDK Node.js pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode generateContentStream.

  const streamingResp = await generativeModel.generateContentStream(request);
  

Pour une réponse non affichée progressivement, utilisez la méthode generateContent.

  const streamingResp = await generativeModel.generateContent(request);
  

Exemple de code

const {VertexAI} = require('@google-cloud/vertexai');
const axios = require('axios');

async function getBase64(url) {
  const image = await axios.get(url, {responseType: 'arraybuffer'});
  return Buffer.from(image.data).toString('base64');
}

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function sendMultiModalPromptWithImage(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-1.5-flash-001'
) {
  // For images, the SDK supports base64 strings
  const landmarkImage1 = await getBase64(
    'https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark1.png'
  );
  const landmarkImage2 = await getBase64(
    'https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark2.png'
  );
  const landmarkImage3 = await getBase64(
    'https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark3.png'
  );

  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: projectId, location: location});

  const generativeVisionModel = vertexAI.getGenerativeModel({
    model: model,
  });

  // Pass multimodal prompt
  const request = {
    contents: [
      {
        role: 'user',
        parts: [
          {
            inlineData: {
              data: landmarkImage1,
              mimeType: 'image/png',
            },
          },
          {
            text: 'city: Rome, Landmark: the Colosseum',
          },

          {
            inlineData: {
              data: landmarkImage2,
              mimeType: 'image/png',
            },
          },
          {
            text: 'city: Beijing, Landmark: Forbidden City',
          },
          {
            inlineData: {
              data: landmarkImage3,
              mimeType: 'image/png',
            },
          },
        ],
      },
    ],
  };

  // Create the response
  const response = await generativeVisionModel.generateContent(request);
  // Wait for the response to complete
  const aggregatedResponse = await response.response;
  // Select the text from the response
  const fullTextResponse =
    aggregatedResponse.candidates[0].content.parts[0].text;

  console.log(fullTextResponse);
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence du SDK Vertex AI pour Go pour Gemini.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode GenerateContentStream.

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

Pour une réponse non affichée progressivement, utilisez la méthode GenerateContent.

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

Exemple de code

import (
	"context"
	"fmt"
	"io"
	"mime"
	"path/filepath"

	"cloud.google.com/go/vertexai/genai"
)

// generateMultimodalContent shows how to generate a text from a multimodal prompt using the Gemini model,
// writing the response to the provided io.Writer.
func generateMultimodalContent(w io.Writer, projectID, location, modelName string) error {
	// location := "us-central1"
	// modelName := "gemini-1.5-flash-001"
	ctx := context.Background()

	// create prompt image parts
	colosseum := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext("landmark1.png")),
		FileURI:  "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png",
	}
	forbiddenCity := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext("landmark2.png")),
		FileURI:  "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark2.png",
	}
	newImage := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext("landmark3.png")),
		FileURI:  "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark3.png",
	}
	// create a multimodal (multipart) prompt
	prompt := []genai.Part{
		colosseum,
		genai.Text("city: Rome, Landmark: the Colosseum "),
		forbiddenCity,
		genai.Text("city: Beijing, Landmark: the Forbidden City "),
		newImage,
	}

	// generate the response
	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)

	res, err := model.GenerateContent(ctx, prompt...)
	if err != nil {
		return fmt.Errorf("unable to generate contents: %w", err)
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de Vertex AI. Pour en savoir plus, consultez la documentation de référence de Vertex AI en langage C#.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Réponses en streaming et sans streaming

Vous pouvez choisir si le modèle génère des réponses en streaming ou sans streaming. Pour les réponses en streaming, vous recevez chaque réponse dès que son jeton de sortie est généré. Pour les réponses qui ne sont pas en streaming, vous recevez toutes les réponses une fois tous les jetons de sortie sont générés.

Pour une réponse en streaming, utilisez la méthode StreamGenerateContent.

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

Pour une réponse non affichée progressivement, utilisez la méthode GenerateContentAsync.

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

Pour en savoir plus sur la façon dont le serveur peut diffuser des réponses, consultez la section RPC de streaming.

Exemple de code


using Google.Api.Gax.Grpc;
using Google.Cloud.AIPlatform.V1;
using Google.Protobuf;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

public class MultimodalMultiImage
{
    public async Task<string> GenerateContent(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.5-flash-001"
    )
    {
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        ByteString colosseum = await ReadImageFileAsync(
            "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark1.png");

        ByteString forbiddenCity = await ReadImageFileAsync(
            "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark2.png");

        ByteString christRedeemer = await ReadImageFileAsync(
            "https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark3.png");

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { InlineData = new() { MimeType = "image/png", Data = colosseum }},
                        new Part { Text = "city: Rome, Landmark: the Colosseum" },
                        new Part { InlineData = new() { MimeType = "image/png", Data = forbiddenCity }},
                        new Part { Text = "city: Beijing, Landmark: Forbidden City"},
                        new Part { InlineData = new() { MimeType = "image/png", Data = christRedeemer }}
                    }
                }
            }
        };

        using PredictionServiceClient.StreamGenerateContentStream response = predictionServiceClient.StreamGenerateContent(generateContentRequest);

        StringBuilder fullText = new();

        AsyncResponseStream<GenerateContentResponse> responseStream = response.GetResponseStream();
        await foreach (GenerateContentResponse responseItem in responseStream)
        {
            fullText.Append(responseItem.Candidates[0].Content.Parts[0].Text);
        }
        return fullText.ToString();
    }

    private static async Task<ByteString> ReadImageFileAsync(string url)
    {
        using HttpClient client = new();
        using var response = await client.GetAsync(url);
        byte[] imageBytes = await response.Content.ReadAsByteArrayAsync();
        return ByteString.CopyFrom(imageBytes);
    }
}

Une fois que vous avez configuré votre environnement, vous pouvez utiliser REST pour tester une requête textuelle. L'exemple suivant envoie une requête au point de terminaison du modèle de l'éditeur.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région dans laquelle traiter la requête.  : saisissez une région compatible. Pour obtenir la liste complète des régions compatibles, consultez la section Emplacements disponibles.
    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID : l'ID de votre projet.
  • FILE_URI1 : URI ou URL du fichier à inclure dans la requête. Les valeurs acceptées incluent les suivantes :
    • URI du bucket Cloud Storage : l'objet doit être accessible en lecture publique ou se trouver dans le même projet Google Cloud que celui qui envoie la requête.
    • URL HTTP : l'URL du fichier doit être accessible au public. Vous pouvez spécifier un fichier vidéo et jusqu'à 10 fichiers image par requête. Les fichiers audio et les documents ne doivent pas dépasser 15 Mo.
    • URL de la vidéo YouTube : la vidéo YouTube doit être la vôtre ou publique, et vous devez vous être connecté à la console Google Cloud avec le compte correspondant. Une seule URL de vidéo YouTube est acceptée par requête.

    Lorsque vous spécifiez un fileURI, vous devez également spécifier le type de contenu (mimeType) du fichier.

    Si vous ne disposez pas d'un fichier image dans Cloud Storage, vous pouvez utiliser le fichier suivant, accessible au public : gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png avec un type MIME image/png. Pour afficher cette image, ouvrez le fichier de l'exemple d'image.

  • MIME_TYPE : type de contenu du fichier spécifié dans les champs data ou fileUri. Les valeurs acceptées incluent les suivantes :
    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • image/webp
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
    Par souci de simplicité, cet exemple utilise le même type de contenu multimédia pour les trois images d'entrée.
  • TEXT1 : instructions textuelles à inclure dans la requête. Par exemple, city: Rome, Landmark: the Colosseum.
  • FILE_URI2 : URI ou URL du fichier à inclure dans la requête. Les valeurs acceptées incluent les suivantes :
    • URI du bucket Cloud Storage : l'objet doit être accessible en lecture publique ou se trouver dans le même projet Google Cloud que celui qui envoie la requête.
    • URL HTTP : l'URL du fichier doit être accessible au public. Vous pouvez spécifier un fichier vidéo et jusqu'à 10 fichiers image par requête. Les fichiers audio et les documents ne doivent pas dépasser 15 Mo.
    • URL de la vidéo YouTube : la vidéo YouTube doit être la vôtre ou publique, et vous devez vous être connecté à la console Google Cloud avec le compte correspondant. Une seule URL de vidéo YouTube est acceptée par requête.

    Lorsque vous spécifiez un fileURI, vous devez également spécifier le type de contenu (mimeType) du fichier.

    Si vous ne disposez pas d'un fichier image dans Cloud Storage, vous pouvez utiliser le fichier suivant, accessible au public : gs://cloud-samples-data/vertex-ai/llm/prompts/landmark2.png avec un type MIME image/png. Pour afficher cette image, ouvrez le fichier de l'image exemple.

  • TEXT2 : instructions textuelles à inclure dans la requête. Par exemple, city: Beijing, Landmark: Forbidden City.
  • FILE_URI3 : URI ou URL du fichier à inclure dans la requête. Les valeurs acceptées incluent les suivantes :
    • URI du bucket Cloud Storage : l'objet doit être accessible en lecture publique ou se trouver dans le même projet Google Cloud que celui qui envoie la requête.
    • URL HTTP : l'URL du fichier doit être accessible au public. Vous pouvez spécifier un fichier vidéo et jusqu'à 10 fichiers image par requête. Les fichiers audio et les documents ne doivent pas dépasser 15 Mo.
    • URL de la vidéo YouTube : la vidéo YouTube doit être la vôtre ou publique, et vous devez vous être connecté à la console Google Cloud avec le compte correspondant. Une seule URL de vidéo YouTube est acceptée par requête.

    Lorsque vous spécifiez un fileURI, vous devez également spécifier le type de contenu (mimeType) du fichier.

    Si vous ne disposez pas d'un fichier image dans Cloud Storage, vous pouvez utiliser le fichier suivant, accessible au public : gs://cloud-samples-data/vertex-ai/llm/prompts/landmark3.png avec un type MIME image/png. Pour afficher cette image, ouvrez le fichier de l'exemple d'image.

Pour envoyer votre requête, choisissez l'une des options suivantes :

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI1",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT1"
      },
      {
        "fileData": {
          "fileUri": "FILE_URI2",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT2"
      },
      {
        "fileData": {
          "fileUri": "FILE_URI3",
          "mimeType": "MIME_TYPE"
        }
      }
    ]
  }
}
EOF

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI1",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT1"
      },
      {
        "fileData": {
          "fileUri": "FILE_URI2",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT2"
      },
      {
        "fileData": {
          "fileUri": "FILE_URI3",
          "mimeType": "MIME_TYPE"
        }
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Exécutez ensuite la commande suivante pour envoyer votre requête REST :

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON semblable à la suivante.

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "city: Rio de Janeiro, Landmark: Christ the Redeemer statue \n"
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.05340333,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.08740791
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.13050689,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.10338596
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.05399884,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.09947021
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "probabilityScore": 0.10576342,
          "severity": "HARM_SEVERITY_NEGLIGIBLE",
          "severityScore": 0.066934206
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 791,
    "candidatesTokenCount": 14,
    "totalTokenCount": 805
  }
}
Notez les points suivants dans l'URL de cet exemple :
  • Utilisez la méthode generateContent pour demander que la réponse soit renvoyée une fois qu'elle a été entièrement générée. Pour réduire la perception de la latence auprès d'un public humain, affichez la réponse progressivement à mesure qu'elle est générée à l'aide de la méthode streamGenerateContent.
  • L'ID du modèle multimodal se trouve à la fin de l'URL avant la méthode (par exemple, gemini-1.5-flash ou gemini-1.0-pro-vision). Cet exemple peut également s'appliquer à d'autres modèles.
Pour envoyer une requête multimodale à l'aide de la console Google Cloud, procédez comme suit :

  1. Dans la section "Vertex AI" de la console Google Cloud, accédez à la page Vertex AI Studio.

    Accéder à Vertex AI Studio

  2. Cliquez sur Ouvrir en mode libre.

  3. Facultatif : Configurez le modèle et les paramètres :

    • Modèle : sélectionnez un modèle.
    • Région : sélectionnez la région que vous souhaitez utiliser.
    • Température : utilisez le curseur ou la zone de texte pour saisir une valeur de température.

      La température est utilisée pour l'échantillonnage pendant la génération des réponses, qui se produit lorsque topP et topK sont appliqués. La température permet de contrôler le degré de hasard dans la sélection des jetons. Les températures inférieures sont idéales pour les requêtes qui nécessitent une réponse moins ouverte ou créative, tandis que des températures plus élevées peuvent conduire à des résultats plus diversifiés ou créatifs. Une température de 0 signifie que les jetons de probabilité les plus élevés sont toujours sélectionnés. Dans ce cas, les réponses pour une requête donnée sont principalement déterministes, mais une petite quantité de variation est toujours possible.

      Si le modèle renvoie une réponse trop générique ou trop courte, ou s'il renvoie une réponse de remplacement, essayez d'augmenter la température.

    • Limite de jeton : utilisez le curseur ou la zone de texte pour saisir une valeur correspondant à la limite maximale de sortie.

      Nombre maximal de jetons pouvant être générés dans la réponse. Un jeton correspond environ à quatre caractères. 100 jetons correspondent à environ 60-80 mots.

      Spécifiez une valeur inférieure pour obtenir des réponses plus courtes et une valeur supérieure pour des réponses potentiellement plus longues.

    • Ajouter une séquence d'arrêt : facultatif. Saisissez une séquence d'arrêt, qui est une série de caractères incluant des espaces. Si le modèle rencontre une séquence d'arrêt, la génération de réponse s'arrête. La séquence d'arrêt n'est pas incluse dans la réponse, et vous pouvez ajouter jusqu'à cinq séquences d'arrêt.

  4. Facultatif : pour configurer des paramètres avancés, cliquez sur Avancé, puis configurez les paramètres comme suit :

    • Top-K: saisissez une valeur pour le top-K à l'aide du curseur ou de la zone de texte. (non compatible avec Gemini 1.5).

      Top-K modifie la façon dont le modèle sélectionne les jetons pour la sortie. Une valeur top-K de 1 signifie que le prochain jeton sélectionné est le plus probable parmi tous les jetons du vocabulaire du modèle (également appelé décodage glouton), tandis qu'une valeur top-K de 3 signifie que le jeton suivant est sélectionné parmi les trois jetons les plus probables en utilisant la température.

      Pour chaque étape de sélection du jeton, les jetons top-K avec les probabilités les plus élevées sont échantillonnés. Les jetons sont ensuite filtrés en fonction du top-P avec le jeton final sélectionné à l'aide de l'échantillonnage de température.

      Spécifiez une valeur inférieure pour les réponses moins aléatoires et une valeur plus élevée pour les réponses plus aléatoires.

    • Top-P : utilisez le curseur ou la zone de texte pour saisir une valeur. Les jetons sont sélectionnés de la probabilité la plus élevée jusqu'à ce que la somme de leurs probabilités soit égale à la valeur de top-P. Pour obtenir les résultats les moins variables, définissez "top-P" sur 0.
    • Nombre maximal de réponses : utilisez le curseur ou la zone de texte pour saisir une valeur correspondant au nombre de réponses à générer.
    • Diffuser les réponses : permet d'imprimer les réponses au fur et à mesure de leur génération.
    • Seuil de filtre de sécurité : sélectionnez le seuil de probabilité d'affichage de réponses potentiellement dangereuses.
    • Activer la connexion : la connexion n'est pas compatible avec les requêtes multimodales.

  5. Cliquez sur Insérer un média, puis sélectionnez une source pour votre fichier.

    Sélectionnez le fichier que vous souhaitez utiliser, puis cliquez sur Ouvrir.

    Saisissez l'URL du fichier que vous souhaitez utiliser, puis cliquez sur Insérer.

    Sélectionnez le bucket, puis le fichier que vous souhaitez importer, puis cliquez sur Sélectionner.

    1. Choisissez un compte et autorisez Vertex AI Studio à y accéder la première fois que vous sélectionnez cette option. Vous pouvez importer plusieurs fichiers dont la taille totale ne dépasse pas 10 Mo. La taille d'un fichier ne peut pas dépasser 7 Mo.
    2. Cliquez sur le fichier que vous souhaitez ajouter.
    3. Cliquez sur Sélectionner.

      La vignette du fichier s'affiche dans le volet Prompt. Le nombre total de jetons s'affiche également. Si les données de votre requête dépassent la limite de jetons, les jetons sont tronqués et ne sont pas inclus dans le traitement de vos données.

  6. Saisissez votre requête textuelle dans le volet Requête.

  7. Facultatif : Pour afficher les ID de jeton en texte et les ID de jeton, cliquez sur le nombre de jetons dans le volet Requête.

  8. Cliquez sur Envoyer.

  9. Facultatif : pour enregistrer votre requête dans Mes requêtes, cliquez sur Enregistrer.

  10. Facultatif : pour obtenir le code Python ou la commande curl de votre requête, cliquez sur  Obtenir le code.

Définir des paramètres de modèle facultatifs

Chaque modèle est associé à un ensemble de paramètres facultatifs que vous pouvez définir. Pour en savoir plus, consultez la section Paramètres de génération de contenu.

Exigences liées aux images

Les modèles multimodaux Gemini sont compatibles avec les types vidéo MIME suivants :

Type MIME de l'image Gemini 1.5 Flash Gemini 1.5 Pro Gemini 1.0 Pro Vision
PNG - image/png
JPEG - image/jpeg
WebP - image/webp

Il n'y a pas de limite spécifique au nombre de pixels dans une image. Cependant, les images plus volumineuses sont réduites et remplies pour correspondre à une résolution maximale de 3072 x 3072, tout en préservant leur format d'origine.

Voici le nombre maximal de fichiers image autorisés dans une requête d'invite :

  • Gemini 1.0 Pro Vision : 16 images
  • Gemini 1.5 Flash et Gemini 1.5 Pro : 3 000 images

Voici comment les jetons sont calculés pour les images :

  • Pour Gemini 1.0 Pro Vision, chaque image compte pour 258 jetons.
  • Pour Gemini 1.5 Flash et Gemini 1.5 Pro :
    • Si les deux dimensions d'une image sont inférieures ou égales à 384 pixels, 258 jetons sont utilisés.
    • Si l'une des dimensions d'une image est supérieure à 384 pixels, l'image est recadrée en vignettes. Chaque taille de vignette est définie par défaut sur la plus petite dimension (largeur ou hauteur), divisée par 1,5. Si nécessaire, chaque vignette est ajustée pour qu'elle ne soit pas inférieure à 256 et ne dépasse pas 768. Chaque vignette est ensuite redimensionnée au format 768x768 et utilise 258 jetons.

Bonnes pratiques

Lorsque vous utilisez des images, suivez les bonnes pratiques et les informations ci-dessous pour obtenir de meilleurs résultats :

  • Si vous souhaitez détecter du texte dans une image, utilisez des requêtes avec une seule image pour obtenir de meilleurs résultats qu'avec des requêtes comportant plusieurs images.
  • Si votre requête contient une seule image, placez-la avant la requête textuelle.
  • Si votre requête contient plusieurs images, et que vous souhaitez les référencer ultérieurement dans votre requête ou demander au modèle de les référencer dans la réponse du modèle, il peut être utile d'attribuer à chaque image un index la précédant. Utilisez a b c ou image 1 image 2 image 3 pour votre index. Voici un exemple d'utilisation d'images indexées dans une requête :
    image 1 
    image 2 
    image 3 
    
    Write a blogpost about my day using image 1 and image 2. Then, give me ideas
    for tomorrow based on image 3.
  • Utilisez des images en haute résolution pour obtenir de meilleurs résultats.
  • Incluez quelques exemples dans la requête.
  • Faites pivoter les images dans l'orientation appropriée avant de les ajouter à la requête.
  • Évitez les images floues.

Limites

Bien que les modèles multimodaux Gemini soient puissants dans de nombreux cas d'utilisation multimodaux, il est important de comprendre les limites des modèles :

  • Modération de contenus : les modèles refusent de fournir des réponses sur des images qui ne respectent pas nos règles de sécurité.
  • Raisonnement spatial : les modèles ne parviennent pas à localiser précisément du texte ou des objets dans des images. Ils peuvent ne renvoyer que des décomptes approximatifs d'objets.
  • Utilisations médicales : les modèles ne conviennent pas à l'interprétation d'images médicales (par exemple, les radiographies et les scanners), ni à la fourniture de conseils médicaux.
  • Reconnaissance de personnes : les modèles ne sont pas conçus pour identifier des personnes qui ne sont pas des célébrités sur des images.
  • Précision : les modèles peuvent halluciner ou faire des erreurs lors de l'interprétation d'images de mauvaise qualité, retournées ou d'extrêmement basse résolution. Les modèles peuvent également halluciner lors de l'interprétation de texte manuscrit dans des documents image.

Étape suivante