Obtener incrustaciones multimodales

El modelo de embeddings multimodal genera vectores de 1408 dimensiones a partir de la entrada que proporciones, que puede incluir una combinación de datos de imagen, texto y vídeo. Los vectores de inserción se pueden usar para tareas posteriores, como la clasificación de imágenes o la moderación de contenido de vídeo.

El vector de incrustación de imagen y el vector de incrustación de texto están en el mismo espacio semántico y tienen la misma dimensionalidad. Por lo tanto, estos vectores se pueden usar indistintamente en casos prácticos como buscar imágenes por texto o buscar vídeos por imagen.

En los casos prácticos de incrustaciones de solo texto, te recomendamos que uses la API text-embeddings de Vertex AI. Por ejemplo, la API text-embeddings puede ser más adecuada para la búsqueda semántica basada en texto, la creación de clústeres, el análisis de documentos extensos y otros casos prácticos de recuperación de texto o respuesta a preguntas. Para obtener más información, consulta Obtener representaciones de texto.

Modelos admitidos

Puedes obtener embeddings multimodales con el siguiente modelo:

  • multimodalembedding

Prácticas recomendadas

Ten en cuenta los siguientes aspectos de las entradas al usar el modelo de embeddings multimodal:

  • Texto en imágenes: el modelo puede distinguir el texto de las imágenes, de forma similar al reconocimiento óptico de caracteres (OCR). Si necesitas distinguir entre la descripción del contenido de la imagen y el texto que aparece en ella, puedes usar la ingeniería de peticiones para especificar el contenido que quieres. Por ejemplo, en lugar de "gato", especifica "imagen de un gato" o "el texto 'gato'", según el caso práctico.




    el texto "gato"

    Imagen de texto con la palabra gato




    imagen de un gato

    Imagen de un gato
    Imagen: Manja Vitolic en Unsplash.
  • Similitudes de las inserciones: el producto escalar de las inserciones no es una probabilidad calibrada. El producto escalar es una métrica de similitud y puede tener distribuciones de puntuación diferentes para distintos casos prácticos. Por lo tanto, no utilices un umbral de valor fijo para medir la calidad. En su lugar, utiliza enfoques de clasificación para la recuperación o usa sigmoide para la clasificación.

Uso de la API

Límites de la API

Se aplican los siguientes límites cuando usas el modelo multimodalembedding para inserciones de texto e imagen:

Límite Valor y descripción
Datos de texto e imagen
Número máximo de solicitudes a la API por minuto y proyecto De 120 a 600, según la región
Longitud máxima del texto 32 tokens (unas 32 palabras)

La longitud máxima del texto es de 32 tokens (aproximadamente 32 palabras). Si la entrada supera los 32 tokens, el modelo acorta internamente la entrada a esta longitud.
Idioma Inglés
Formatos de imagen BMP, GIF, JPG y PNG
Tamaño de la imagen Imágenes codificadas en base64: 20 MB (cuando se transcodifican a PNG)
Imágenes de Cloud Storage: 20 MB (formato de archivo original)

El tamaño máximo de imagen aceptado es de 20 MB. Para evitar que aumente la latencia de la red, usa imágenes más pequeñas. Además, el modelo cambia el tamaño de las imágenes a una resolución de 512x512 píxeles. Por lo tanto, no es necesario que proporcione imágenes de mayor resolución.
Datos de vídeo
Compatibilidad con audio No disponible: el modelo no tiene en cuenta el contenido de audio al generar las inserciones de vídeo
Formatos de vídeo AVI, FLV, MKV, MOV, MP4, MPEG, MPG, WEBM y WMV
Duración máxima de los vídeos (Cloud Storage) Sin límite. Sin embargo, solo se pueden analizar 2 minutos de contenido a la vez.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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 (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 Vertex AI 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 (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 Vertex AI 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. Configura la autenticación de tu entorno.

    Select the tab for how you plan to use the samples on this page:

    Java

    Para usar las Java muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.

    2. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    3. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

      gcloud components update
      gcloud components install beta
    4. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    Node.js

    Para usar las Node.js muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.

    2. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    3. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

      gcloud components update
      gcloud components install beta
    4. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    Python

    Para usar las Python muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.

    2. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    3. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

      gcloud components update
      gcloud components install beta
    4. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

    1. Install the Google Cloud CLI.

    2. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    3. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

      gcloud components update
      gcloud components install beta

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

  9. Para usar el SDK de Python, sigue las instrucciones de Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API del SDK de Vertex AI para Python.
  10. Opcional. Consulta los precios de esta función. Los precios de las inserciones dependen del tipo de datos que envíes (como imágenes o texto) y del modo que utilices para determinados tipos de datos (como Vídeo plus, Vídeo estándar o Vídeo básico).
  11. Ubicaciones

    Una ubicación es una región que puedes especificar en una solicitud para controlar dónde se almacenan los datos en reposo. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.

    Mensajes de error

    Error de cuota superada

    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 es la primera vez que recibes este error, usa la Google Cloud consola para solicitar un ajuste de cuota para tu proyecto. Usa los siguientes filtros antes de solicitar el ajuste:

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

    Ir a Cuotas

    Si ya has enviado una solicitud de ajuste de cuota, espera antes de enviar otra. Si necesitas aumentar aún más la cuota, repite la solicitud de ajuste de cuota con la justificación de un ajuste de cuota sostenido.

    Especificar inserciones de menor dimensión

    De forma predeterminada, una solicitud de incrustación devuelve un vector flotante de 1408 para un tipo de datos. También puedes especificar incrustaciones de menor dimensión (vectores flotantes de 128, 256 o 512) para datos de texto e imagen. Esta opción te permite optimizar la latencia y el almacenamiento o la calidad en función de cómo vayas a usar las inserciones. Las inserciones de menor dimensión requieren menos almacenamiento y tienen una latencia más baja en las tareas de inserción posteriores (como la búsqueda o la recomendación), mientras que las inserciones de mayor dimensión ofrecen una mayor precisión en las mismas tareas.

    REST

    Para acceder a la dimensión de baja calidad, añada el campo parameters.dimension. El parámetro acepta uno de los siguientes valores: 128, 256, 512 o 1408. La respuesta incluye la inserción de esa dimensión.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • IMAGE_URI: el URI de Cloud Storage de la imagen de destino de la que se van a obtener las inserciones. Por ejemplo, gs://my-bucket/embeddings/supermarket-img.png.

      También puedes proporcionar la imagen como una cadena de bytes codificada en Base64:

      [...]
      "image": {
        "bytesBase64Encoded": "B64_ENCODED_IMAGE"
      }
      [...]
      
    • TEXT: el texto de destino del que se obtendrán las inserciones. Por ejemplo, a cat.
    • EMBEDDING_DIMENSION: número de dimensiones de la inserción. Los valores más bajos ofrecen una latencia menor al usar estas inserciones en tareas posteriores, mientras que los valores más altos ofrecen una mayor precisión. Valores disponibles: 128, 256, 512 y 1408 (valor predeterminado).

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    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

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $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
    La inserción que devuelve el modelo es un vector flotante de la dimensión que especifiques. Las siguientes respuestas de ejemplo se han abreviado para ahorrar espacio.

    Dimensiones de 128:

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

    256 dimensiones:

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

    Dimensiones 512:

    {
      "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
    }
    

    Enviar una solicitud de inserción (imagen y texto)

    Usa los siguientes códigos de ejemplo para enviar una solicitud de incrustación con datos de imagen y texto. En los ejemplos se muestra cómo enviar una solicitud con ambos tipos de datos, pero también puedes usar el servicio con un solo tipo de datos.

    Obtener representaciones de texto e imagen

    REST

    Para obtener más información sobre las solicitudes de modelos multimodalembedding, consulta la referencia de la API de modelos multimodalembedding.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • TEXT: el texto de destino del que se obtendrán las inserciones. Por ejemplo, a cat.
    • B64_ENCODED_IMG: la imagen de destino de la que se obtendrán las inserciones. La imagen debe especificarse como una cadena de bytes codificada en Base64.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    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

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $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
    La incrustación que devuelve el modelo es un vector de 1408 flotantes. La siguiente respuesta de ejemplo se ha acortado para ahorrar espacio.
    {
      "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

    Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la 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

    Antes de probar este ejemplo, sigue las Node.js instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Node.js de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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

    Antes de probar este ejemplo, sigue las Java instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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

    Antes de probar este ejemplo, sigue las Go instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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
    }
    

    Enviar una solicitud de inserción (vídeo, imagen o texto)

    Cuando envías una solicitud de inserción, puedes especificar solo un vídeo de entrada o una combinación de datos de vídeo, imagen y texto.

    Modos de inserción de vídeo

    Hay tres modos que puedes usar con las inserciones de vídeo: Esencial, Estándar o Plus. El modo corresponde a la densidad de las inserciones generadas, que se puede especificar mediante la configuración interval_sec en la solicitud. Por cada intervalo de vídeo de longitud interval_sec, se genera una inserción. La duración mínima del intervalo de vídeo es de 4 segundos. Si la duración de los intervalos es superior a 120 segundos, la calidad de las inserciones generadas podría verse afectada negativamente.

    El precio de la inserción de vídeo depende del modo que utilices. Para obtener más información, consulta los precios.

    En la siguiente tabla se resumen los tres modos que puedes usar para insertar vídeos:

    Modo Número máximo de inserciones por minuto Intervalo de inserción de vídeo (valor mínimo)
    Esencial 4 15

    Esto corresponde a: intervalSec >= 15
    Estándar 8 8

    Corresponde a: 8 <= intervalSec < 15
    Plus 15 4

    Esto corresponde a: 4 <= intervalSec < 8

    Prácticas recomendadas para las inserciones de vídeo

    Ten en cuenta lo siguiente cuando envíes solicitudes de inserción de vídeos:

    • Para generar una sola inserción de los dos primeros minutos de un vídeo de entrada de cualquier duración, usa el siguiente ajuste videoSegmentConfig:

      request.json:

      // other request body content
      "videoSegmentConfig": {
        "intervalSec": 120
      }
      // other request body content
      
    • Para generar una inserción de un vídeo de más de dos minutos, puedes enviar varias solicitudes que especifiquen las horas de inicio y de finalización en el campo 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
      

    Obtener incrustaciones de vídeo

    Usa el siguiente ejemplo para obtener las inserciones solo del contenido de vídeo.

    REST

    Para obtener más información sobre las solicitudes de modelos multimodalembedding, consulta la referencia de la API de modelos multimodalembedding.

    En el ejemplo siguiente se usa un vídeo ubicado en Cloud Storage. También puedes usar el campo video.bytesBase64Encoded para proporcionar una representación de cadena codificada en Base64 del vídeo.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • VIDEO_URI: el URI de Cloud Storage del vídeo de destino para obtener las inserciones. Por ejemplo, gs://my-bucket/embeddings/supermarket-video.mp4.

      También puedes proporcionar el vídeo como una cadena de bytes codificada en Base64:

      [...]
      "video": {
        "bytesBase64Encoded": "B64_ENCODED_VIDEO"
      }
      [...]
      
    • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Opcional. Los segmentos de vídeo específicos (en segundos) para los que se generan las inserciones.

      Por ejemplo:

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

      Con esta configuración, se especifican datos de vídeo de 10 a 60 segundos y se generan inserciones para los siguientes intervalos de vídeo de 10 segundos: [10, 20), [20, 30), [30, 40), [40, 50) y [50, 60). Este intervalo de vídeo ("intervalSec": 10) se incluye en el modo de inserción de vídeo estándar y se cobra al usuario la tarifa del modo estándar.

      Si omite videoSegmentConfig, el servicio usará los siguientes valores predeterminados: "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Este intervalo de vídeo ("intervalSec": 16) se incluye en el modo de inserción de vídeo esencial y se cobra al usuario según la tarifa del modo esencial.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    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

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $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
    La incrustación que devuelve el modelo es un vector de 1408 flotantes. Las siguientes respuestas de ejemplo se han acortado para ahorrar espacio.

    Respuesta (vídeo de 7 segundos, sin videoSegmentConfig especificado):

    {
      "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"
    }

    Respuesta (vídeo de 59 segundos, con la siguiente configuración de segmento de vídeo: "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

    Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la 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

    Antes de probar este ejemplo, sigue las Go instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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
    }
    

    Obtener incrustaciones de imágenes, texto y vídeo

    Usa el siguiente ejemplo para obtener incrustaciones de contenido de vídeo, texto e imagen.

    REST

    Para obtener más información sobre las solicitudes de modelos multimodalembedding, consulta la referencia de la API de modelos multimodalembedding.

    En el siguiente ejemplo se usan datos de imagen, texto y vídeo. Puedes usar cualquier combinación de estos tipos de datos en el cuerpo de tu solicitud.

    Además, en este ejemplo se usa un vídeo ubicado en Cloud Storage. También puedes usar el campo video.bytesBase64Encoded para proporcionar una representación de cadena codificada en Base64 del vídeo.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • TEXT: el texto de destino del que se obtendrán las inserciones. Por ejemplo, a cat.
    • IMAGE_URI: el URI de Cloud Storage de la imagen de destino de la que se van a obtener las inserciones. Por ejemplo, gs://my-bucket/embeddings/supermarket-img.png.

      También puedes proporcionar la imagen como una cadena de bytes codificada en Base64:

      [...]
      "image": {
        "bytesBase64Encoded": "B64_ENCODED_IMAGE"
      }
      [...]
      
    • VIDEO_URI: el URI de Cloud Storage del vídeo de destino para obtener las inserciones. Por ejemplo, gs://my-bucket/embeddings/supermarket-video.mp4.

      También puedes proporcionar el vídeo como una cadena de bytes codificada en Base64:

      [...]
      "video": {
        "bytesBase64Encoded": "B64_ENCODED_VIDEO"
      }
      [...]
      
    • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Opcional. Los segmentos de vídeo específicos (en segundos) para los que se generan las inserciones.

      Por ejemplo:

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

      Con esta configuración, se especifican datos de vídeo de 10 a 60 segundos y se generan inserciones para los siguientes intervalos de vídeo de 10 segundos: [10, 20), [20, 30), [30, 40), [40, 50) y [50, 60). Este intervalo de vídeo ("intervalSec": 10) se incluye en el modo de inserción de vídeo estándar y se cobra al usuario la tarifa del modo estándar.

      Si omite videoSegmentConfig, el servicio usará los siguientes valores predeterminados: "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Este intervalo de vídeo ("intervalSec": 16) se incluye en el modo de inserción de vídeo esencial y se cobra al usuario según la tarifa del modo esencial.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    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

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $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
    La incrustación que devuelve el modelo es un vector de 1408 flotantes. La siguiente respuesta de ejemplo se ha acortado para ahorrar espacio.
    {
      "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

    Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la 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

    Antes de probar este ejemplo, sigue las Go instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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
    }
    

    Siguientes pasos