Obtenir des embeddings multimodaux

Le modèle d'embeddings multimodaux génère des vecteurs multidimensionnels en fonction de l'entrée que vous fournissez, qui peut inclure une combinaison de données d'image, textuelles et vidéo. Les vecteurs d'embedding peuvent ensuite être utilisés pour des tâches ultérieures, telles que la classification d'images ou la modération de contenus vidéo.

Les vecteurs d'embedding d'image et de texte se trouvent dans le même espace sémantique avec la même dimensionnalité. Par conséquent, ces vecteurs peuvent être utilisés de manière interchangeable pour les cas d'utilisation comme la recherche d'image par texte ou la recherche de vidéo par image.

Pour les cas d'utilisation d'embeddings uniquement basées sur du texte, nous vous recommandons d'utiliser plutôt l'API d'embeddings textuels Gemini Enterprise Agent Platform. Par exemple, l'API d'embeddings textuels peut être plus efficace pour la recherche sémantique basée sur du texte, le clustering, l'analyse de longs documents et d'autres cas d'utilisation, comme la récupération de texte ou les systèmes de questions-réponses. Pour en savoir plus, consultez Obtenir des embeddings textuels.

Modèles compatibles

Vous pouvez obtenir des embeddings multimodaux à l'aide des modèles suivants :

  • gemini-embedding-2

  • multimodalembedding@001

Bonnes pratiques

Tenez compte des aspects d'entrée suivants lorsque vous utilisez le modèle d'embeddings multimodaux :

  • Texte dans les images : le modèle peut distinguer du texte dans les images, comme la reconnaissance optique des caractères (OCR). Si vous devez faire la distinction entre une description du contenu de l'image et le texte présent dans l'image, envisagez d'utiliser le prompt engineering pour spécifier votre contenu cible. Par exemple, au lieu de simplement indiquer "chat", spécifiez "image d'un chat" ou "le texte 'chat'", selon votre cas d'utilisation.




    le texte "chat"

    Le mot "chat" est affiché en gras.
    Le mot "chat" rendu dans une grande police en gras.




    image d'un chat

    Un chat assis sur un plancher en bois.
    Crédit image : Manja Vitolic sur Unsplash.
  • Similarités des embeddings : le produit scalaire des embeddings n'est pas une probabilité calibrée. Le produit scalaire est une métrique de similarité et peut avoir des distributions de scores différentes pour différents cas d'utilisation. Par conséquent, évitez d'utiliser un seuil de valeur fixe pour mesurer la qualité. Utilisez plutôt des approches de classement pour la récupération ou la fonction sigmoïde pour la classification.

Utiliser gemini-embedding-2

Le modèle gemini-embedding-2 accepte les entrées entrelacées pour les modalités image, texte, document, audio et vidéo.

Spécifier des instructions de tâche pour améliorer les performances

Vous pouvez utiliser des embeddings pour un large éventail de tâches, de la classification à la recherche de documents. En spécifiant la bonne instruction de tâche, vous pouvez optimiser les embeddings pour les relations souhaitées, ce qui maximise la précision et l'efficacité.

Les tableaux suivants montrent des exemples de mise en forme des requêtes et des documents pour les cas d'utilisation symétriques et asymétriques à l'aide du modèle gemini-embedding-2.

Cas d'utilisation de la récupération (format asymétrique)

Cas d'utilisation Structure d'une requête Structure du document
Requête de recherche task: search result | query: {content} title: {title} | text: {content}

Si aucun titre n'est défini, utilisez title: none.
Systèmes de questions-réponses task: question answering | query: {content} title: {title} | text: {content}
Fact-checking task: fact checking | query: {content} title: {title} | text: {content}
Récupération du code task: code retrieval | query: {content} title: {title} | text: {content}

Cas d'utilisation à entrée unique (format symétrique)

Cas d'utilisation Structure d'entrée
Classification task: classification | query: {content}
Clustering task: clustering | query: {content}
Similarité sémantique task: sentence similarity | query: {content}

Ne pas utiliser pour la recherche ou la récupération. Elle est destinée à la similarité textuelle sémantique.

Exemple d'utilisation en Python

Python

# Generate embedding for a search query
def prepare_query(query):
    return f"task: search result | query: {query}"

# Generate embedding for a search document
def prepare_document(content, title=None):
    if title is None:
        title = "none"
    return f"title: {title} | text: {content}"

# Generate embedding for classification
def prepare_classification_input(content):
    return f"task: classification | query: {content}"
      

Utilisation de l'API

Limites d'API

Les limites suivantes s'appliquent lorsque vous utilisez le modèle gemini-embedding-2.

Limite Valeur et description
Données textuelles, d'image, de document, vidéo et audio
Limite de jetons d'entrée 8 192 jetons

Les entrées de plus de 8 192 jetons sont tronquées en mode silencieux. Toutes les modalités partagent la fenêtre de contexte de 8 192 jetons. Le nombre de jetons est comptabilisé comme suit par modalité :
  • Audio : 25 jetons par seconde
  • Vidéo : 66 jetons par frame
  • Image : 258 jetons par image
  • Document (PDF) : rendu sous forme d'image, soit 258 jetons par page. Des jetons de texte supplémentaires sont extraits si l'OCR est activée.
Dimensionnalité de la sortie 3 072 (valeur par défaut, configurable à l'aide du paramètre output_dimensionality)
Limites concernant les images 6 images par requête
Formats d'image JPEG, PNG, WebP, BMP, HEIC, HEIF, AVIF
Dimensions de l'image 16 384 x 16 384 pixels maximum par image
Limites de documents Un fichier par demande, jusqu'à six pages

Pour une qualité optimale, nous vous recommandons d'utiliser un fichier PDF par page.
Formats de documents PDF
Données vidéo et audio
Limites pour les vidéos Une vidéo par requête, jusqu'à 120 images

La limite de 120 secondes est basée sur le paramètre par défaut de 1 FPS. La durée varie lorsque vous définissez différents FPS : durée = 120 / FPS.
Par défaut, l'extraction audio est désactivée pour les vidéos. Lorsque l'option d'extraction de la piste audio est activée, la durée est soumise à la durée audio maximale de 180 secondes. La durée totale de la vidéo est limitée à la fois par la limite audio et par la fenêtre de contexte des jetons (8 192 jetons).
Formats vidéo Conteneur : MOV, MP4. Codec : AV1, H264, H265, VP9.
Limites audio 180 secondes par requête

La prise en charge audio est optimisée pour la parole. Il est possible que le son ambiant et la musique ne soient pas de la meilleure qualité.
Formats audio MP3, WAV

Durée de la vidéo avec extraction audio

Étant donné que toutes les modalités partagent la fenêtre de contexte de 8 192 jetons, la durée maximale de la vidéo varie lorsque vous activez audio_track_extraction :

Modalité Nombre de jetons
Audio 25 jetons par seconde
Image vidéo 66 jetons par frame
Codes temporels 10 jetons par seconde (deux codes temporels par seconde au format "mm:ss")
FPS Déterminé par le paramètre FPS (1 par défaut)

La durée totale de la vidéo est limitée à la fois par la durée maximale de l'assistance audio (180 secondes) et par la fenêtre de contexte de 8 192 jetons.

Exemple de calcul :

Si vous traitez une vidéo avec une fréquence d'échantillonnage par défaut de 1 FPS et que vous activez l'extraction audio :

  • Taux de consommation : chaque seconde de vidéo consomme 66 jetons (1 image) + 25 jetons (1 seconde d'audio) + 10 jetons (codes temporels) = 101 jetons.
  • Durée maximale : avec une limite de 8 192 jetons, la durée maximale est d'environ 8 192 / 101 ≈ 81 secondes.

Si l'entrée dépasse la fenêtre de contexte, la partie excédentaire sera tronquée sans avertissement.

Obtenir des embeddings multimodaux

REST

PROJECT_ID="YOUR_PROJECT_ID"
LOCATION="us"

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.${LOCATION}.rep.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/gemini-embedding-2:embedContent" \
  -d '{
  "content": {
    "parts": [
      {
        "text": "Whats this"
      },
      {
        "file_data": {
          "mime_type": "video/mp4",
          "file_uri": "gs://cloud-samples-data/generative-ai/video/pixel8.mp4"
        }
      }
    ]
  }
}'
      

Python

from google import genai
from google.genai import types

# Initialize the client.
client = genai.Client(vertexai=True, project="YOUR_PROJECT_ID", location="us")

content = types.Content(
    parts=[
        types.Part.from_text(text="Audio AI"),
        types.Part.from_uri(
            file_uri="gs://cloud-samples-data/generative-ai/audio/Chirp-3-Docs-Dive.mp3",
            mime_type="audio/mpeg",
        ),
    ],
)

response = client.models.embed_content(
    model="gemini-embedding-2",
    contents=[content]
)

print(response.embeddings[0].values)
      

Emplacements

Un emplacement est une région que vous pouvez spécifier dans une requête pour contrôler l'emplacement de stockage des données au repos. Pour obtenir la liste des régions disponibles, consultez Emplacements Agent Platform.

Quotas

Pour vérifier la limite de quota pour gemini-embedding-2, consultez Quotas et limites système de l'IA générative sur Gemini Enterprise Agent Platform.

Dimensions

Lorsque vous utilisez le modèle gemini-embedding-2, vous pouvez spécifier des dimensions inférieures à l'aide du paramètre output_dimensionality dans EmbedContentConfig.

L'exemple suivant renvoie un vecteur de dimension 128. Pour gemini-embedding-2, les embeddings de sortie sont déjà normalisés L2 pour les dimensions non définies par défaut (contrairement à gemini-embedding-001).

Python

import numpy as np
from google import genai
from google.genai import types

# Initialize the client.
client = genai.Client(vertexai=True, project="YOUR_PROJECT_ID", location="us")

content = types.Content(
    parts=[
        types.Part.from_uri(
            file_uri="gs://cloud-samples-data/generative-ai/audio/Chirp-3-Docs-Dive.mp3",
            mime_type="audio/mpeg",
        ),
    ],
)

response = client.models.embed_content(
    model="gemini-embedding-2",
    contents=[content],
    config=types.EmbedContentConfig(output_dimensionality=128),
)

embedding_values_np = np.array(response.embeddings[0].values)

print(f"Embedding length: {len(embedding_values_np)}")
print(f"Norm of embedding: {np.linalg.norm(embedding_values_np):.6f}") # Should be very close to 1
      

Paramètres

La fréquence d'échantillonnage vidéo par défaut est d'une image par seconde (FPS). Vous pouvez ajouter des paramètres supplémentaires à l'aide de video_metadata :

Python

from google import genai
from google.genai import types

# Initialize the client.
client = genai.Client(vertexai=True, project="YOUR_PROJECT_ID", location="us")

content = types.Content(
    parts=[
        types.Part(
            file_data=types.FileData(
                file_uri="gs://cloud-samples-data/generative-ai/video/pixel8.mp4",
                mime_type="video/mp4",
            ),
            video_metadata=types.VideoMetadata(
                fps=0.5,
                start_offset="10s",
                end_offset="20s",
            ),
        ),
    ]
)

response = client.models.embed_content(
    model="gemini-embedding-2",
    contents=[content]
)

print(response.embeddings[0].values)
      

Des options supplémentaires sont disponibles dans EmbedContentConfig.

Option Type Description
output_dimensionality int Réduisez la dimensionnalité de l'embedding de sortie.
document_ocr bool Activez l'OCR pour l'entrée de documents.
audio_track_extraction bool Extraire l'audio d'une entrée vidéo.

Utiliser multimodalembedding@001

Les limites suivantes s'appliquent lorsque vous utilisez le modèle multimodalembedding@001 pour les embeddings textuels et d'images :

Limite Valeur et description
Données textuelles et d'image
Nombre maximal de requêtes API par minute et par projet 120 à 600, selon la région
Longueur de texte maximale 32 jetons (environ 32 mots)

La longueur maximale du texte est de 32 jetons (environ 32 mots). Si l'entrée dépasse 32 jetons, le modèle la raccourcit à cette longueur en interne.
Langue Anglais
Formats d'image BMP, GIF, JPG, PNG
Taille d'image Images encodées en base64 : 20 Mo (lors du transcodage vers PNG)
Images Cloud Storage : 20 Mo (format de fichier d'origine)

La taille maximale d'image acceptée est de 20 Mo. Pour éviter d'augmenter la latence du réseau, utilisez des images plus petites. En outre, le modèle redimensionne les images au format 512 x 512 pixels. Par conséquent, vous n'avez pas besoin de fournir des images de résolution supérieure.
Données vidéo
Compatibilité audio N/A : le modèle ne prend pas en compte le contenu audio lors de la génération d'embeddings vidéo.
Formats vidéo AVI, FLV, MKV, MOV, MP4, MPEG, MPG, WEBM et WMV
Durée maximale de la vidéo (Cloud Storage) Aucune limite. Toutefois, vous ne pouvez analyser que deux minutes de contenu à la fois.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Gemini Enterprise Agent Platform API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Gemini Enterprise Agent Platform API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Configurez l'authentification pour votre environnement.

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Java

    Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez la gcloud CLI, puis configurez les Identifiants par défaut de l'application avec vos identifiants utilisateur.

    1. Installez la Google Cloud CLI.

    2. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

    3. Après avoir initialisé la gcloud CLI, mettez-la à jour et installez les composants requis :

      gcloud components update
      gcloud components install beta
    4. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

      gcloud auth application-default login

      Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

      Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    Node.js

    Pour utiliser les exemples Node.js de cette page dans un environnement de développement local, installez et initialisez la gcloud CLI, puis configurez les Identifiants par défaut de l'application avec vos identifiants utilisateur.

    1. Installez la Google Cloud CLI.

    2. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

    3. Après avoir initialisé la gcloud CLI, mettez-la à jour et installez les composants requis :

      gcloud components update
      gcloud components install beta
    4. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

      gcloud auth application-default login

      Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

      Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez la gcloud CLI, puis configurez les Identifiants par défaut de l'application avec vos identifiants utilisateur.

    1. Installez la Google Cloud CLI.

    2. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

    3. Après avoir initialisé la gcloud CLI, mettez-la à jour et installez les composants requis :

      gcloud components update
      gcloud components install beta
    4. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

      gcloud auth application-default login

      Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

      Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    REST

    Pour utiliser les exemples API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à la gcloud CLI.

    1. Installez la Google Cloud CLI.

    2. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

    3. Après avoir initialisé la gcloud CLI, mettez-la à jour et installez les composants requis :

      gcloud components update
      gcloud components install beta

    Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud .

  9. Pour utiliser le SDK Python, suivez les instructions de la page Installer le SDK Agent Platform pour Python. Pour en savoir plus, consultez la documentation de référence de l'API SDK Agent Platform pour Python.
  10. Facultatif. Consultez les tarifs de cette fonctionnalité. Les tarifs des embeddings dépendent du type de données que vous envoyez (comme des images ou du texte), ainsi que du mode que vous utilisez pour certains types de données (par exemple, Video Plus, Video Standard ou Video Essential).

Emplacements

Un emplacement est une région que vous pouvez spécifier dans une requête pour contrôler l'emplacement de stockage des données au repos. Pour obtenir la liste des régions disponibles, consultez Emplacements Agent Platform.

Messages d'erreur

Cette section décrit les messages d'erreur courants que vous pouvez rencontrer.

Le quota autorisé a été dépassé

google.api_core.exceptions.ResourceExhausted: 429 Quota exceeded for
aiplatform.googleapis.com/online_prediction_requests_per_base_model with base
model: multimodalembedding. Please submit a quota increase request.

Si vous recevez cette erreur pour la première fois, utilisez la console Google Cloud pour demander un ajustement de quota pour votre projet. Utilisez les filtres suivants avant de demander votre ajustement :

  • Service ID: aiplatform.googleapis.com
  • metric: aiplatform.googleapis.com/online_prediction_requests_per_base_model
  • base_model:multimodalembedding

Accéder à la section "Quotas"

Si vous avez déjà envoyé une demande d'ajustement de quota, attendez avant d'en envoyer une autre. Si vous devez augmenter davantage le quota, répétez la demande d'ajustement de quota en apportant une justification.

Spécifier des embeddings de dimension inférieure

Selon le modèle utilisé, une requête d'embedding renvoie un vecteur de 1 408 ou 3 072 dimensions à virgule flottante. Vous pouvez spécifier des embeddings de dimension inférieure pour les données de texte et d'image afin d'optimiser la latence et le stockage, ou la qualité. Les embeddings de dimension inférieure réduisent les besoins de stockage et la latence pour les tâches d'embedding ultérieures (comme la recherche ou les recommandations). Les embeddings de dimension supérieure offrent une plus grande précision pour ces tâches, mais avec des besoins de stockage et une latence plus élevés.

Le tableau suivant illustre les dimensions inférieures par défaut et disponibles pour chaque modèle :

Modèle Dimensions par défaut (priorité la plus élevée) Dimensions acceptées (plage) Dimensions inférieures recommandées
gemini-embedding-2 3 072 De 128 à 3 072 128, 768 ou 1 536
multimodalembedding@001 1408 128 à 1 408 128, 256 ou 512

Utilisez les exemples suivants pour générer des embeddings avec des dimensions inférieures :

REST

Vous pouvez accéder à un nombre inférieur de dimensions en ajoutant le champ parameters.dimension. Le paramètre accepte toutes les valeurs de dimension disponibles pour le modèle. Par exemple, vous pouvez spécifier 128, 256, 512 ou 1408 lorsque vous utilisez le modèle multimodalembedding@001. La réponse inclut l'embedding de la dimension spécifiée.

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

  • PROJECT_ID : ID de votre projet Google Cloud .
  • IMAGE_URI : URI Cloud Storage de l'image cible pour laquelle obtenir des embeddings. Exemple : gs://my-bucket/embeddings/supermarket-img.png.

    Vous pouvez également fournir l'image en tant que chaîne d'octets encodée en base64 :

          [...]
          "image": {
            "bytesBase64Encoded": "B64_ENCODED_IMAGE"
          }
          [...]
          
  • TEXT : texte cible pour lequel obtenir des embeddings. Exemple :a cat
  • EMBEDDING_DIMENSION : nombre de dimensions d'un embedding. Les valeurs inférieures permettent de réduire la latence lors de l'utilisation de ces embeddings pour les tâches ultérieures, tandis que les valeurs plus élevées offrent une meilleure précision. Valeurs disponibles : 128, 256, 512 et 1408 (par défaut).

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/multimodalembedding@001:predict

Corps JSON de la requête :

{
  "instances": [
    {
      "image": {
        "gcsUri": "IMAGE_URI"
      },
      "text": "TEXT"
    }
  ],
  "parameters": {
    "dimension": EMBEDDING_DIMENSION
  }
}

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

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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/multimodalembedding@001:predict"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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/multimodalembedding@001:predict" | Select-Object -Expand Content
Le modèle d'embedding renvoie un vecteur à virgule flottante de la dimension spécifiée. Les exemples de réponses suivants sont abrégés à des fins de concision.

128 dimensions :

{
  "predictions": [
    {
      "imageEmbedding": [
        0.0279239565,
        [...128 dimension vector...]
        0.00403284049
      ],
      "textEmbedding": [
        0.202921599,
        [...128 dimension vector...]
        -0.0365431122
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

256 dimensions :

{
  "predictions": [
    {
      "imageEmbedding": [
        0.248620048,
        [...256 dimension vector...]
        -0.0646447465
      ],
      "textEmbedding": [
        0.0757875815,
        [...256 dimension vector...]
        -0.02749932
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

512 dimensions :

{
  "predictions": [
    {
      "imageEmbedding": [
        -0.0523675755,
        [...512 dimension vector...]
        -0.0444030389
      ],
      "textEmbedding": [
        -0.0592851527,
        [...512 dimension vector...]
        0.0350437127
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

Python

import vertexai

from vertexai.vision_models import Image, MultiModalEmbeddingModel

# TODO(developer): Update & uncomment line below
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

# TODO(developer): Try different dimenions: 128, 256, 512, 1408
embedding_dimension = 128

model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")
image = Image.load_from_file(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png"
)

embeddings = model.get_embeddings(
    image=image,
    contextual_text="Colosseum",
    dimension=embedding_dimension,
)

print(f"Image Embedding: {embeddings.image_embedding}")
print(f"Text Embedding: {embeddings.text_embedding}")

# Example response:
# Image Embedding: [0.0622573346, -0.0406507477, 0.0260440577, ...]
# Text Embedding: [0.27469793, -0.146258667, 0.0222803634, ...]

Go

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

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	aiplatformpb "cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateWithLowerDimension shows how to generate lower-dimensional embeddings for text and image inputs.
func generateWithLowerDimension(w io.Writer, project, location string) error {
	// location = "us-central1"
	ctx := context.Background()
	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)
	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		return fmt.Errorf("failed to construct API client: %w", err)
	}
	defer client.Close()

	model := "multimodalembedding@001"
	endpoint := fmt.Sprintf("projects/%s/locations/%s/publishers/google/models/%s", project, location, model)

	// This is the input to the model's prediction call. For schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#request_body
	instance, err := structpb.NewValue(map[string]any{
		"image": map[string]any{
			// Image input can be provided either as a Google Cloud Storage URI or as
			// base64-encoded bytes using the "bytesBase64Encoded" field.
			"gcsUri": "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png",
		},
		"text": "Colosseum",
	})
	if err != nil {
		return fmt.Errorf("failed to construct request payload: %w", err)
	}

	// TODO(developer): Try different dimenions: 128, 256, 512, 1408
	outputDimensionality := 128
	params, err := structpb.NewValue(map[string]any{
		"dimension": outputDimensionality,
	})
	if err != nil {
		return fmt.Errorf("failed to construct request params: %w", err)
	}

	req := &aiplatformpb.PredictRequest{
		Endpoint: endpoint,
		// The model supports only 1 instance per request.
		Instances:  []*structpb.Value{instance},
		Parameters: params,
	}

	resp, err := client.Predict(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to generate embeddings: %w", err)
	}

	instanceEmbeddingsJson, err := protojson.Marshal(resp.GetPredictions()[0])
	if err != nil {
		return fmt.Errorf("failed to convert protobuf value to JSON: %w", err)
	}
	// For response schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#response-body
	var instanceEmbeddings struct {
		ImageEmbeddings []float32 `json:"imageEmbedding"`
		TextEmbeddings  []float32 `json:"textEmbedding"`
	}
	if err := json.Unmarshal(instanceEmbeddingsJson, &instanceEmbeddings); err != nil {
		return fmt.Errorf("failed to unmarshal JSON: %w", err)
	}

	imageEmbedding := instanceEmbeddings.ImageEmbeddings
	textEmbedding := instanceEmbeddings.TextEmbeddings

	fmt.Fprintf(w, "Text embedding (length=%d): %v\n", len(textEmbedding), textEmbedding)
	fmt.Fprintf(w, "Image embedding (length=%d): %v\n", len(imageEmbedding), imageEmbedding)
	// Example response:
	// Text Embedding (length=128): [0.27469793 -0.14625867 0.022280363 ... ]
	// Image Embedding (length=128): [0.06225733 -0.040650766 0.02604402 ... ]

	return nil
}

Obtenir des embeddings d'images et de texte (multimodalembedding@001)

Utilisez les exemples de code suivants pour envoyer une requête d'embedding avec des données de type image et texte. Les exemples montrent comment envoyer une requête avec les deux types de données, mais vous pouvez également utiliser le service avec un seul type de données.

Obtenir des embeddings textuels et d'images

REST

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

  • PROJECT_ID : ID de votre projet Google Cloud.
  • TEXT : texte cible pour lequel obtenir des embeddings. Exemple :a cat
  • B64_ENCODED_IMG : image cible pour laquelle obtenir des embeddings. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/multimodalembedding@001:predict

Corps JSON de la requête :

{
  "instances": [
    {
      "text": "TEXT",
      "image": {
        "bytesBase64Encoded": "B64_ENCODED_IMG"
      }
    }
  ]
}

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

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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/multimodalembedding@001:predict"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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/multimodalembedding@001:predict" | Select-Object -Expand Content
L'embedding du modèle renvoie un vecteur de 1 408 dimensions à virgule flottante. L'exemple de réponse suivant est abrégé à des fins de concision.
{
  "predictions": [
    {
      "textEmbedding": [
        0.010477379,
        -0.00399621,
        0.00576670747,
        [...]
        -0.00823613815,
        -0.0169572588,
        -0.00472954148
      ],
      "imageEmbedding": [
        0.00262696808,
        -0.00198890246,
        0.0152047109,
        -0.0103145819,
        [...]
        0.0324628279,
        0.0284924973,
        0.011650892,
        -0.00452344026
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

Python

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

import vertexai
from vertexai.vision_models import Image, MultiModalEmbeddingModel

# TODO(developer): Update & uncomment line below
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")
image = Image.load_from_file(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png"
)

embeddings = model.get_embeddings(
    image=image,
    contextual_text="Colosseum",
    dimension=1408,
)
print(f"Image Embedding: {embeddings.image_embedding}")
print(f"Text Embedding: {embeddings.text_embedding}")
# Example response:
# Image Embedding: [-0.0123147098, 0.0727171078, ...]
# Text Embedding: [0.00230263756, 0.0278981831, ...]

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js décrites dans le guide de démarrage rapide de la plate-forme d'agents à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Agent Platform pour Node.js.

Pour vous authentifier auprès de la plate-forme d'agents, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';
// const baseImagePath = 'YOUR_BASE_IMAGE_PATH';
// const textPrompt = 'YOUR_TEXT_PROMPT';
const aiplatform = require('@google-cloud/aiplatform');

// Imports the Google Cloud Prediction service client
const {PredictionServiceClient} = aiplatform.v1;

// Import the helper module for converting arbitrary protobuf.Value objects.
const {helpers} = aiplatform;

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};
const publisher = 'google';
const model = 'multimodalembedding@001';

// Instantiates a client
const predictionServiceClient = new PredictionServiceClient(clientOptions);

async function predictImageFromImageAndText() {
  // Configure the parent resource
  const endpoint = `projects/${project}/locations/${location}/publishers/${publisher}/models/${model}`;

  const fs = require('fs');
  const imageFile = fs.readFileSync(baseImagePath);

  // Convert the image data to a Buffer and base64 encode it.
  const encodedImage = Buffer.from(imageFile).toString('base64');

  const prompt = {
    text: textPrompt,
    image: {
      bytesBase64Encoded: encodedImage,
    },
  };
  const instanceValue = helpers.toValue(prompt);
  const instances = [instanceValue];

  const parameter = {
    sampleCount: 1,
  };
  const parameters = helpers.toValue(parameter);

  const request = {
    endpoint,
    instances,
    parameters,
  };

  // Predict request
  const [response] = await predictionServiceClient.predict(request);
  console.log('Get image embedding response');
  const predictions = response.predictions;
  console.log('\tPredictions :');
  for (const prediction of predictions) {
    console.log(`\t\tPrediction : ${JSON.stringify(prediction)}`);
  }
}

await predictImageFromImageAndText();

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le guide de démarrage rapide de la plate-forme d'agents à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Agent Platform pour Java.

Pour vous authentifier auprès de la plate-forme d'agents, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


import com.google.cloud.aiplatform.v1beta1.EndpointName;
import com.google.cloud.aiplatform.v1beta1.PredictResponse;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceClient;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceSettings;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PredictImageFromImageAndTextSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace this variable before running the sample.
    String project = "YOUR_PROJECT_ID";
    String textPrompt = "YOUR_TEXT_PROMPT";
    String baseImagePath = "YOUR_BASE_IMAGE_PATH";

    // Learn how to use text prompts to update an image:
    // https://cloud.google.com/vertex-ai/docs/generative-ai/image/edit-images
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("sampleCount", 1);

    String location = "us-central1";
    String publisher = "google";
    String model = "multimodalembedding@001";

    predictImageFromImageAndText(
        project, location, publisher, model, textPrompt, baseImagePath, parameters);
  }

  // Update images using text prompts
  public static void predictImageFromImageAndText(
      String project,
      String location,
      String publisher,
      String model,
      String textPrompt,
      String baseImagePath,
      Map<String, Object> parameters)
      throws IOException {
    final String endpoint = String.format("%s-aiplatform.googleapis.com:443", location);
    final PredictionServiceSettings predictionServiceSettings =
        PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();

    // 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 (PredictionServiceClient predictionServiceClient =
        PredictionServiceClient.create(predictionServiceSettings)) {
      final EndpointName endpointName =
          EndpointName.ofProjectLocationPublisherModelName(project, location, publisher, model);

      // Convert the image to Base64
      byte[] imageData = Base64.getEncoder().encode(Files.readAllBytes(Paths.get(baseImagePath)));
      String encodedImage = new String(imageData, StandardCharsets.UTF_8);

      JsonObject jsonInstance = new JsonObject();
      jsonInstance.addProperty("text", textPrompt);
      JsonObject jsonImage = new JsonObject();
      jsonImage.addProperty("bytesBase64Encoded", encodedImage);
      jsonInstance.add("image", jsonImage);

      Value instanceValue = stringToValue(jsonInstance.toString());
      List<Value> instances = new ArrayList<>();
      instances.add(instanceValue);

      Gson gson = new Gson();
      String gsonString = gson.toJson(parameters);
      Value parameterValue = stringToValue(gsonString);

      PredictResponse predictResponse =
          predictionServiceClient.predict(endpointName, instances, parameterValue);
      System.out.println("Predict Response");
      System.out.println(predictResponse);
      for (Value prediction : predictResponse.getPredictionsList()) {
        System.out.format("\tPrediction: %s\n", prediction);
      }
    }
  }

  // Convert a Json string to a protobuf.Value
  static Value stringToValue(String value) throws InvalidProtocolBufferException {
    Value.Builder builder = Value.newBuilder();
    JsonFormat.parser().merge(value, builder);
    return builder.build();
  }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le guide de démarrage rapide de la plate-forme d'agents à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Agent Platform pour Go.

Pour vous authentifier auprès de la plate-forme d'agents, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	aiplatformpb "cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateForTextAndImage shows how to use the multimodal model to generate embeddings for
// text and image inputs.
func generateForTextAndImage(w io.Writer, project, location string) error {
	// location = "us-central1"
	ctx := context.Background()
	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)
	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		return fmt.Errorf("failed to construct API client: %w", err)
	}
	defer client.Close()

	model := "multimodalembedding@001"
	endpoint := fmt.Sprintf("projects/%s/locations/%s/publishers/google/models/%s", project, location, model)

	// This is the input to the model's prediction call. For schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#request_body
	instance, err := structpb.NewValue(map[string]any{
		"image": map[string]any{
			// Image input can be provided either as a Google Cloud Storage URI or as
			// base64-encoded bytes using the "bytesBase64Encoded" field.
			"gcsUri": "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png",
		},
		"text": "Colosseum",
	})
	if err != nil {
		return fmt.Errorf("failed to construct request payload: %w", err)
	}

	req := &aiplatformpb.PredictRequest{
		Endpoint: endpoint,
		// The model supports only 1 instance per request.
		Instances: []*structpb.Value{instance},
	}

	resp, err := client.Predict(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to generate embeddings: %w", err)
	}

	instanceEmbeddingsJson, err := protojson.Marshal(resp.GetPredictions()[0])
	if err != nil {
		return fmt.Errorf("failed to convert protobuf value to JSON: %w", err)
	}
	// For response schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#response-body
	var instanceEmbeddings struct {
		ImageEmbeddings []float32 `json:"imageEmbedding"`
		TextEmbeddings  []float32 `json:"textEmbedding"`
	}
	if err := json.Unmarshal(instanceEmbeddingsJson, &instanceEmbeddings); err != nil {
		return fmt.Errorf("failed to unmarshal JSON: %w", err)
	}

	imageEmbedding := instanceEmbeddings.ImageEmbeddings
	textEmbedding := instanceEmbeddings.TextEmbeddings

	fmt.Fprintf(w, "Text embedding (length=%d): %v\n", len(textEmbedding), textEmbedding)
	fmt.Fprintf(w, "Image embedding (length=%d): %v\n", len(imageEmbedding), imageEmbedding)
	// Example response:
	// Text embedding (length=1408): [0.0023026613 0.027898183 -0.011858357 ... ]
	// Image embedding (length=1408): [-0.012314269 0.07271844 0.00020170923 ... ]

	return nil
}

Obtenir des embeddings de vidéos, d'images ou de texte (multimodalembedding@001)

Lors de l'envoi d'une requête d'embedding, vous pouvez spécifier uniquement une vidéo en entrée ou une combinaison de données vidéo, d'image et textuelles.

Modes d'embedding vidéo

Vous pouvez utiliser trois modes avec les embeddings vidéo : Essential, Standard ou Plus. Le mode correspond à la densité des embeddings générés, qui peut être spécifiée par la configuration interval_sec de la requête. Pour chaque intervalle vidéo d'une durée de interval_sec, un embedding est généré. La durée minimale de l'intervalle vidéo est de quatre secondes. Les intervalles de plus de 120 secondes peuvent avoir un impact négatif sur la qualité des embeddings générés.

Les tarifs de l'embedding vidéo dépendent du mode que vous utilisez. Pour en savoir plus, reportez-vous à la page Tarifs.

Le tableau suivant récapitule les trois modes que vous pouvez utiliser pour les embeddings vidéo :

Mode Nombre maximal d'embeddings par minute Intervalle d'embedding vidéo (valeur minimale)
Essential 4 15

Cela correspond à intervalSec >= 15.
Standard 8 8

Cela correspond à 8 <= intervalSec < 15.
Plus 15 4

Cela correspond à 4 <= intervalSec < 8.

Bonnes pratiques concernant les embeddings vidéo

Tenez compte des points suivants lorsque vous envoyez des requêtes d'embedding vidéo :

  • Pour générer un seul embedding pour les deux premières minutes d'une vidéo d'entrée de n'importe quelle durée, utilisez le paramètre videoSegmentConfig suivant :

    request.json :

    // other request body content
    "videoSegmentConfig": {
      "intervalSec": 120
    }
    // other request body content
    
  • Pour générer un embedding pour une vidéo d'une durée supérieure à deux minutes, vous pouvez envoyer plusieurs requêtes spécifiant les heures de début et de fin dans la configuration videoSegmentConfig :

    request1.json :

    // other request body content
    "videoSegmentConfig": {
      "startOffsetSec": 0,
      "endOffsetSec": 120
    }
    // other request body content
    

    request2.json :

    // other request body content
    "videoSegmentConfig": {
      "startOffsetSec": 120,
      "endOffsetSec": 240
    }
    // other request body content
    

    Obtenir des embeddings vidéo

Utilisez l'exemple suivant pour obtenir des embeddings uniquement pour du contenu vidéo.

REST

L'exemple suivant utilise une vidéo située dans Cloud Storage. Vous pouvez également utiliser le champ video.bytesBase64Encoded pour fournir une représentation de la vidéo sous forme de chaîne encodée en base64.

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

  • PROJECT_ID : ID de votre projet Google Cloud.
  • VIDEO_URI : URI Cloud Storage de la vidéo cible pour laquelle obtenir des embeddings. Exemple : gs://my-bucket/embeddings/supermarket-video.mp4.

    Vous pouvez également fournir la vidéo en tant que chaîne d'octets encodés en base64 :

    [...]
    "video": {
      "bytesBase64Encoded": "B64_ENCODED_VIDEO"
    }
    [...]
          
  • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Facultatif. Définit les séquences vidéo spécifiques (en secondes) pour lesquelles les embeddings sont générés.

    Exemple :

    [...]
    "videoSegmentConfig": {
      "startOffsetSec": 10,
      "endOffsetSec": 60,
      "intervalSec": 10
    }
    [...]

    L'utilisation de cette configuration spécifie la présence de données vidéo de la 10e à la 60e seconde, et génère des embeddings pour les intervalles de 10 secondes suivants : [10, 20), [20, 30), [30, 40), [40, 50), [50, 60). Cet intervalle vidéo ("intervalSec": 10) est défini sur le mode d'embedding vidéo Standard. Vous êtes facturé au tarif en mode Standard.

    Si vous omettez videoSegmentConfig, le service utilise les valeurs par défaut suivantes : "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Cet intervalle vidéo ("intervalSec": 16) est défini sur le mode d'embedding vidéo Essential. L'utilisateur est facturé au tarif en mode Essential.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/multimodalembedding@001:predict

Corps JSON de la requête :

{
  "instances": [
    {
      "video": {
        "gcsUri": "VIDEO_URI",
        "videoSegmentConfig": {
          "startOffsetSec": START_SECOND,
          "endOffsetSec": END_SECOND,
          "intervalSec": INTERVAL_SECONDS
        }
      }
    }
  ]
}

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

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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/multimodalembedding@001:predict"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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/multimodalembedding@001:predict" | Select-Object -Expand Content
L'embedding du modèle renvoie un vecteur de 1 408 dimensions à virgule flottante. Les exemples de réponses suivants sont abrégés à des fins de concision.

Réponse (sept secondes de vidéo, pas d'élément videoSegmentConfig spécifié) :

{
  "predictions": [
    {
      "videoEmbeddings": [
        {
          "endOffsetSec": 7,
          "embedding": [
            -0.0045467657,
            0.0258095954,
            0.0146885719,
            0.00945400633,
            [...]
            -0.0023291884,
            -0.00493789,
            0.00975185353,
            0.0168156829
          ],
          "startOffsetSec": 0
        }
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

Réponse (59 secondes de vidéo, avec la configuration de séquence vidéo suivante : "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 60, "intervalSec": 10 }) :

{
  "predictions": [
    {
      "videoEmbeddings": [
        {
          "endOffsetSec": 10,
          "startOffsetSec": 0,
          "embedding": [
            -0.00683252793,
            0.0390476175,
            [...]
            0.00657121744,
            0.013023301
          ]
        },
        {
          "startOffsetSec": 10,
          "endOffsetSec": 20,
          "embedding": [
            -0.0104404651,
            0.0357737206,
            [...]
            0.00509833824,
            0.0131902946
          ]
        },
        {
          "startOffsetSec": 20,
          "embedding": [
            -0.0113538112,
            0.0305239167,
            [...]
            -0.00195809244,
            0.00941874553
          ],
          "endOffsetSec": 30
        },
        {
          "embedding": [
            -0.00299320649,
            0.0322436653,
            [...]
            -0.00993082579,
            0.00968887936
          ],
          "startOffsetSec": 30,
          "endOffsetSec": 40
        },
        {
          "endOffsetSec": 50,
          "startOffsetSec": 40,
          "embedding": [
            -0.00591270532,
            0.0368893594,
            [...]
            -0.00219071587,
            0.0042470959
          ]
        },
        {
          "embedding": [
            -0.00458270218,
            0.0368121453,
            [...]
            -0.00317760976,
            0.00595594104
          ],
          "endOffsetSec": 59,
          "startOffsetSec": 50
        }
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

Python

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

import vertexai

from vertexai.vision_models import MultiModalEmbeddingModel, Video
from vertexai.vision_models import VideoSegmentConfig

# TODO(developer): Update & uncomment line below
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")

embeddings = model.get_embeddings(
    video=Video.load_from_file(
        "gs://cloud-samples-data/vertex-ai-vision/highway_vehicles.mp4"
    ),
    video_segment_config=VideoSegmentConfig(end_offset_sec=1),
)

# Video Embeddings are segmented based on the video_segment_config.
print("Video Embeddings:")
for video_embedding in embeddings.video_embeddings:
    print(
        f"Video Segment: {video_embedding.start_offset_sec} - {video_embedding.end_offset_sec}"
    )
    print(f"Embedding: {video_embedding.embedding}")

# Example response:
# Video Embeddings:
# Video Segment: 0.0 - 1.0
# Embedding: [-0.0206376351, 0.0123456789, ...]

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le guide de démarrage rapide de la plate-forme d'agents à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Agent Platform pour Go.

Pour vous authentifier auprès de la plate-forme d'agents, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	aiplatformpb "cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateForVideo shows how to use the multimodal model to generate embeddings for video input.
func generateForVideo(w io.Writer, project, location string) error {
	// location = "us-central1"

	// The default context timeout may be not enough to process a video input.
	ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
	defer cancel()

	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)
	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		return fmt.Errorf("failed to construct API client: %w", err)
	}
	defer client.Close()

	model := "multimodalembedding@001"
	endpoint := fmt.Sprintf("projects/%s/locations/%s/publishers/google/models/%s", project, location, model)

	// This is the input to the model's prediction call. For schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#request_body
	instances, err := structpb.NewValue(map[string]any{
		"video": map[string]any{
			// Video input can be provided either as a Google Cloud Storage URI or as base64-encoded
			// bytes using the "bytesBase64Encoded" field.
			"gcsUri": "gs://cloud-samples-data/vertex-ai-vision/highway_vehicles.mp4",
			"videoSegmentConfig": map[string]any{
				"startOffsetSec": 1,
				"endOffsetSec":   5,
			},
		},
	})
	if err != nil {
		return fmt.Errorf("failed to construct request payload: %w", err)
	}

	req := &aiplatformpb.PredictRequest{
		Endpoint: endpoint,
		// The model supports only 1 instance per request.
		Instances: []*structpb.Value{instances},
	}
	resp, err := client.Predict(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to generate embeddings: %w", err)
	}

	instanceEmbeddingsJson, err := protojson.Marshal(resp.GetPredictions()[0])
	if err != nil {
		return fmt.Errorf("failed to convert protobuf value to JSON: %w", err)
	}
	// For response schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#response-body
	var instanceEmbeddings struct {
		VideoEmbeddings []struct {
			Embedding      []float32 `json:"embedding"`
			StartOffsetSec float64   `json:"startOffsetSec"`
			EndOffsetSec   float64   `json:"endOffsetSec"`
		} `json:"videoEmbeddings"`
	}
	if err := json.Unmarshal(instanceEmbeddingsJson, &instanceEmbeddings); err != nil {
		return fmt.Errorf("failed to unmarshal json: %w", err)
	}
	// Get the embedding for our single video segment (`.videoEmbeddings` object has one entry per
	// each processed segment).
	videoEmbedding := instanceEmbeddings.VideoEmbeddings[0]

	fmt.Fprintf(w, "Video embedding (seconds: %.f-%.f; length=%d): %v\n",
		videoEmbedding.StartOffsetSec,
		videoEmbedding.EndOffsetSec,
		len(videoEmbedding.Embedding),
		videoEmbedding.Embedding,
	)
	// Example response:
	// Video embedding (seconds: 1-5; length=1408): [-0.016427778 0.032878537 -0.030755188 ... ]

	return nil
}

Obtenir des embeddings d'images, de texte et de vidéos

L'exemple suivant permet d'obtenir des embeddings pour du contenu vidéo, du texte et des images.

REST

L'exemple ci-dessous utilise des données de type image, texte et vidéo. Vous pouvez utiliser n'importe quelle combinaison de ces types de données dans le corps de votre requête.

En outre, cet exemple utilise une vidéo située dans Cloud Storage. Vous pouvez également utiliser le champ video.bytesBase64Encoded pour fournir une représentation de la vidéo sous forme de chaîne encodée en base64.

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

  • PROJECT_ID : ID du projet Google Cloud.
  • TEXT : texte cible pour lequel obtenir des embeddings. Exemple :a cat
  • IMAGE_URI : URI Cloud Storage de l'image cible pour laquelle obtenir des embeddings. Exemple : gs://my-bucket/embeddings/supermarket-img.png.

    Vous pouvez également fournir l'image en tant que chaîne d'octets encodée en base64 :

    [...]
    "image": {
      "bytesBase64Encoded": "B64_ENCODED_IMAGE"
    }
    [...]
    
  • VIDEO_URI : URI Cloud Storage de la vidéo cible pour laquelle obtenir des embeddings. Exemple : gs://my-bucket/embeddings/supermarket-video.mp4.

    Vous pouvez également fournir la vidéo en tant que chaîne d'octets encodés en base64 :

    [...]
    "video": {
      "bytesBase64Encoded": "B64_ENCODED_VIDEO"
    }
    [...]
    
  • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Facultatif. Définit les séquences vidéo spécifiques (en secondes) pour lesquelles les embeddings sont générés.

    Exemple :

    [...]
      "videoSegmentConfig": {
        "startOffsetSec": 10,
        "endOffsetSec": 60,
        "intervalSec": 10
      }
      [...]

    L'utilisation de cette configuration spécifie la présence de données vidéo de la 10e à la 60e seconde, et génère des embeddings pour les intervalles de 10 secondes suivants : [10, 20), [20, 30), [30, 40), [40, 50), [50, 60). Cet intervalle vidéo ("intervalSec": 10) est défini sur le mode d'embedding vidéo Standard. L'utilisateur est facturé au tarif en mode Standard.

    Si vous omettez videoSegmentConfig, le service utilise les valeurs par défaut suivantes : "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Cet intervalle vidéo ("intervalSec": 16) est défini sur le mode d'embedding vidéo Essential. L'utilisateur est facturé au tarif en mode Essential.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/multimodalembedding@001:predict

Corps JSON de la requête :

{
  "instances": [
    {
      "text": "TEXT",
      "image": {
        "gcsUri": "IMAGE_URI"
      },
      "video": {
        "gcsUri": "VIDEO_URI",
        "videoSegmentConfig": {
          "startOffsetSec": START_SECOND,
          "endOffsetSec": END_SECOND,
          "intervalSec": INTERVAL_SECONDS
        }
      }
    }
  ]
}

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

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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/multimodalembedding@001:predict"

PowerShell

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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/multimodalembedding@001:predict" | Select-Object -Expand Content
L'embedding du modèle renvoie un vecteur de 1 408 dimensions à virgule flottante. L'exemple de réponse suivant est abrégé à des fins de concision.
{
  "predictions": [
    {
      "textEmbedding": [
        0.0105433334,
        -0.00302835181,
        0.00656806398,
        0.00603460241,
        [...]
        0.00445805816,
        0.0139605571,
        -0.00170318608,
        -0.00490092579
      ],
      "videoEmbeddings": [
        {
          "startOffsetSec": 0,
          "endOffsetSec": 7,
          "embedding": [
            -0.00673126569,
            0.0248149596,
            0.0128901172,
            0.0107588246,
            [...]
            -0.00180952181,
            -0.0054573305,
            0.0117037306,
            0.0169312079
          ]
        }
      ],
      "imageEmbedding": [
        -0.00728622358,
        0.031021487,
        -0.00206603738,
        0.0273937676,
        [...]
        -0.00204976718,
        0.00321615417,
        0.0121978866,
        0.0193375275
      ]
    }
  ],
  "deployedModelId": "DEPLOYED_MODEL_ID"
}

Python

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

import vertexai

from vertexai.vision_models import Image, MultiModalEmbeddingModel, Video
from vertexai.vision_models import VideoSegmentConfig

# TODO(developer): Update & uncomment line below
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")

image = Image.load_from_file(
    "gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png"
)
video = Video.load_from_file(
    "gs://cloud-samples-data/vertex-ai-vision/highway_vehicles.mp4"
)

embeddings = model.get_embeddings(
    image=image,
    video=video,
    video_segment_config=VideoSegmentConfig(end_offset_sec=1),
    contextual_text="Cars on Highway",
)

print(f"Image Embedding: {embeddings.image_embedding}")

# Video Embeddings are segmented based on the video_segment_config.
print("Video Embeddings:")
for video_embedding in embeddings.video_embeddings:
    print(
        f"Video Segment: {video_embedding.start_offset_sec} - {video_embedding.end_offset_sec}"
    )
    print(f"Embedding: {video_embedding.embedding}")

print(f"Text Embedding: {embeddings.text_embedding}")
# Example response:
# Image Embedding: [-0.0123144267, 0.0727186054, 0.000201397663, ...]
# Video Embeddings:
# Video Segment: 0.0 - 1.0
# Embedding: [-0.0206376351, 0.0345234685, ...]
# Text Embedding: [-0.0207006838, -0.00251058186, ...]

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le guide de démarrage rapide de la plate-forme d'agents à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Agent Platform pour Go.

Pour vous authentifier auprès de la plate-forme d'agents, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	aiplatformpb "cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateForImageTextAndVideo shows how to use the multimodal model to generate embeddings for
// image, text and video data.
func generateForImageTextAndVideo(w io.Writer, project, location string) error {
	// location = "us-central1"

	// The default context timeout may be not enough to process a video input.
	ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
	defer cancel()

	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)
	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		return fmt.Errorf("failed to construct API client: %w", err)
	}
	defer client.Close()

	model := "multimodalembedding@001"
	endpoint := fmt.Sprintf("projects/%s/locations/%s/publishers/google/models/%s", project, location, model)

	// This is the input to the model's prediction call. For schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#request_body
	instance, err := structpb.NewValue(map[string]any{
		"text": "Domestic cats in natural conditions",
		"image": map[string]any{
			// Image and video inputs can be provided either as a Google Cloud Storage URI or as
			// base64-encoded bytes using the "bytesBase64Encoded" field.
			"gcsUri": "gs://cloud-samples-data/generative-ai/image/320px-Felis_catus-cat_on_snow.jpg",
		},
		"video": map[string]any{
			"gcsUri": "gs://cloud-samples-data/video/cat.mp4",
		},
	})
	if err != nil {
		return fmt.Errorf("failed to construct request payload: %w", err)
	}

	req := &aiplatformpb.PredictRequest{
		Endpoint: endpoint,
		// The model supports only 1 instance per request.
		Instances: []*structpb.Value{instance},
	}

	resp, err := client.Predict(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to generate embeddings: %w", err)
	}

	instanceEmbeddingsJson, err := protojson.Marshal(resp.GetPredictions()[0])
	if err != nil {
		return fmt.Errorf("failed to convert protobuf value to JSON: %w", err)
	}
	// For response schema, see:
	// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/multimodal-embeddings-api#response-body
	var instanceEmbeddings struct {
		ImageEmbeddings []float32 `json:"imageEmbedding"`
		TextEmbeddings  []float32 `json:"textEmbedding"`
		VideoEmbeddings []struct {
			Embedding      []float32 `json:"embedding"`
			StartOffsetSec float64   `json:"startOffsetSec"`
			EndOffsetSec   float64   `json:"endOffsetSec"`
		} `json:"videoEmbeddings"`
	}
	if err := json.Unmarshal(instanceEmbeddingsJson, &instanceEmbeddings); err != nil {
		return fmt.Errorf("failed to unmarshal JSON: %w", err)
	}

	imageEmbedding := instanceEmbeddings.ImageEmbeddings
	textEmbedding := instanceEmbeddings.TextEmbeddings
	// Get the embedding for our single video segment (`.videoEmbeddings` object has one entry per
	// each processed segment).
	videoEmbedding := instanceEmbeddings.VideoEmbeddings[0].Embedding

	fmt.Fprintf(w, "Image embedding (length=%d): %v\n", len(imageEmbedding), imageEmbedding)
	fmt.Fprintf(w, "Text embedding (length=%d): %v\n", len(textEmbedding), textEmbedding)
	fmt.Fprintf(w, "Video embedding (length=%d): %v\n", len(videoEmbedding), videoEmbedding)
	// Example response:
	// Image embedding (length=1408): [-0.01558477 0.0258355 0.016342038 ... ]
	// Text embedding (length=1408): [-0.005894961 0.008349559 0.015355394 ... ]
	// Video embedding (length=1408): [-0.018867437 0.013997682 0.0012682161 ... ]

	return nil
}

Étapes suivantes