Multimodale Einbettungen abrufen

Das Modell für multimodale Einbettungen generiert mehrdimensionale Vektoren basierend auf der von Ihnen bereitgestellten Eingabe, die eine Kombination aus Bild-, Text- und Videodaten enthalten kann. Die Einbettungsvektoren können dann für nachfolgende Aufgaben wie die Bildklassifizierung oder Video-Inhaltsmoderation verwendet werden.

Der Bild- und der Texteinbettungsvektor befinden sich im selben semantischen Bereich mit derselben Dimensionalität. Daher können diese Vektoren austauschbar für Anwendungsfälle wie die Bildsuche nach Text oder die Videosuche nach Bild verwendet werden.

Für Anwendungsfälle mit Nur-Text-Einbettungen empfehlen wir stattdessen die Vertex AI text-embeddings API. Beispielsweise ist die text-embeddings API möglicherweise für textbasierte semantische Suche, Clustering, ausführliche Dokumentanalyse und andere Anwendungsfälle für das Abrufen von Text oder Question Answering besser geeignet. Weitere Informationen finden Sie unter Texteinbettungen abrufen.

Unterstützte Modelle

Sie können multimodale Einbettungen mit den folgenden Modellen abrufen:

  • gemini-embedding-2

  • multimodalembedding@001

Best Practices

Beachten Sie bei der Verwendung des Modells für multimodale Einbettungen die folgenden Eingabeaspekte:

  • Text in Bildern: Das Modell kann Text in Bildern unterscheiden, ähnlich wie die optische Zeichenerkennung (Optical Character Recognition, OCR). Wenn Sie zwischen einer Beschreibung des Bildinhalts und dem Text in einem Bild unterscheiden müssen, können Sie die Zielinhalte mithilfe von Prompt Engineering angeben. Geben Sie beispielsweise je nach Anwendungsfall statt „Katze“ „Bild einer Katze“ oder „Text ‚Katze‘“ an.




    der Text "Katze"

    Bild von Text mit dem Wort „Katze“




    Bild einer Katze

    Bild einer Katze
    Bildnachweis: Manja Vitolic auf Unsplash
  • Ähnlichkeiten von Einbettungen: Das Skalarprodukt von Einbettungen ist keine kalibrierte Wahrscheinlichkeit. Das Skalarprodukt ist ein Messwert für die Ähnlichkeit und kann unterschiedliche Punktzahlverteilungen für verschiedene Anwendungsfälle haben. Verwenden Sie daher keinen festen Wert als Grenzwert zur Messung der Qualität. Verwenden Sie stattdessen Ranking-Ansätze für die Suche oder sigmoide Funktionen für die Klassifizierung.

gemini-embedding-2 verwenden

Das gemini-embedding-2-Modell akzeptiert verschachtelte Eingaben für Bild-, Text-, Dokument-, Audio- und Videomodalitäten.

Aufgabenanweisungen angeben, um die Leistung zu verbessern

Sie können Einbettungen für eine Vielzahl von Aufgaben verwenden, von der Klassifizierung bis zur Dokumentsuche. Wenn Sie die richtige Aufgabenanweisung angeben, können Sie die Einbettungen für die beabsichtigten Beziehungen optimieren und so die Genauigkeit und Effizienz maximieren.

In den folgenden Tabellen finden Sie Beispiele für die Formatierung von Anfragen und Dokumenten für symmetrische und asymmetrische Anwendungsfälle mit dem Modell gemini-embedding-2.

Abrufanwendungsfälle (asymmetrisches Format)

Anwendungsfall Abfragestruktur Dokumentstruktur
Suchanfrage task: search result | query: {content} title: {title} | text: {content}

Wenn kein Titel vorhanden ist, verwenden Sie title: none.
Question Answering task: question answering | query: {content} title: {title} | text: {content}
Faktenchecks task: fact checking | query: {content} title: {title} | text: {content}
Codeabruf task: code retrieval | query: {content} title: {title} | text: {content}

Anwendungsfälle mit einer Eingabe (symmetrisches Format)

Anwendungsfall Eingabestruktur
Klassifizierung task: classification | query: {content}
Clustering task: clustering | query: {content}
Semantische Ähnlichkeit task: sentence similarity | query: {content}

Nicht für die Suche oder den Abruf verwenden. Sie ist für die semantische Textähnlichkeit vorgesehen.

Beispiel für die Verwendung in 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}"
      

API-Nutzung

API-Limits

Die folgenden Limits gelten, wenn Sie das gemini-embedding-2-Modell verwenden.

Limit Wert und Beschreibung
Text-, Bild-, Dokument-, Video- und Audiodaten
Eingabetokenlimit 8.192 Tokens

Eingaben, die länger als 8.192 Tokens sind, werden automatisch abgeschnitten. Alle Modalitäten teilen sich das Kontextfenster mit insgesamt 8.192 Tokens. Tokens werden je nach Modalität so gezählt:
  • Audio: 25 Tokens pro Sekunde
  • Video: 66 Tokens pro Frame
  • Bild: 258 Tokens pro Bild
  • Dokument (PDF): wird als Bild gerendert, also 258 Tokens pro Seite. Wenn die OCR aktiviert ist, werden zusätzliche Text-Tokens extrahiert.
Ausgabedimensionalität 3.072 (Standardwert, kann mit dem Parameter output_dimensionality konfiguriert werden)
Bildlimits 6 Bilder pro Anfrage
Bildformate JPEG, PNG, WebP, BMP, HEIC, HEIF, AVIF
Bildabmessungen Maximal 16.384 × 16.384 Pixel pro Bild
Dokumentlimits 1 Datei pro Anfrage, bis zu 6 Seiten

Für die beste Qualität empfehlen wir 1 Seite pro PDF.
Dokumentformate PDF
Video- und Audiodaten
Videobegrenzungen 1 Video pro Anfrage, bis zu 120 Frames

Das 120-Sekunden-Limit basiert auf der Standardeinstellung von 1 FPS. Die Dauer variiert, wenn Sie unterschiedliche fps-Werte festlegen: Dauer = 120 / fps.
Die Audioextraktion ist für Videos standardmäßig deaktiviert. Wenn die Option zum Extrahieren des Audiotracks aktiviert ist, unterliegt die Dauer der maximalen Audiodauer von 180 Sekunden. Die Gesamtdauer des Videos wird sowohl durch das Audio- als auch durch das Token-Kontextfenster (8.192 Tokens) begrenzt.
Videoformate Container: MOV, MP4. Codec: AV1, H264, H265, VP9.
Audio-Limits 180 Sekunden pro Anfrage

Die Audio-Unterstützung ist für Sprache optimiert. Umgebungsgeräusche und Musik werden möglicherweise nicht in höchster Qualität wiedergegeben.
Audioformate MP3, WAV

Videodauer bei Audioextraktion

Da sich alle Modalitäten das Kontextfenster mit insgesamt 8.192 Tokens teilen, variiert die maximale Videolänge, wenn Sie audio_track_extraction aktivieren:

Modalität Tokenanzahl
Audio 25 Tokens pro Sekunde
Video frame 66 Tokens pro Frame
Zeitstempel 10 Tokens pro Sekunde (zwei Zeitstempel pro Sekunde im Format „mm:ss“)
FPS Wird durch die FPS-Einstellung bestimmt (Standard ist 1).

Die Gesamtdauer des Videos ist sowohl durch die maximale Audiounterstützung von 180 Sekunden als auch durch das Kontextfenster von 8.192 Tokens begrenzt.

Beispielrechnung:

Wenn Sie ein Video mit einer Standardabtastrate von 1 FPS verarbeiten und die Audioextraktion aktivieren, gilt Folgendes:

  • Verbrauchsrate: Jede Sekunde Video verbraucht 66 Tokens (1 Frame) + 25 Tokens (1 Sekunde Audio) + 10 Tokens (Zeitstempel) = 101 Tokens.
  • Maximale Dauer: Bei einem Tokenlimit von 8.192 beträgt die maximale Dauer etwa 8.192 / 101 ≈ 81 Sekunden.

Wenn die Eingabe das Kontextfenster überschreitet, wird der überschrittene Teil ohne Rückmeldung abgeschnitten.

Multimodale Einbettungen abrufen

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)
      

Standorte

Ein Standort ist eine Region, die Sie in einer Anfrage angeben können, um zu steuern, wo Daten im Ruhezustand gespeichert werden. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten.

Dimensionen

Wenn Sie das Modell gemini-embedding-2 verwenden, können Sie mit dem Parameter output_dimensionality in EmbedContentConfig niedrigere Dimensionen angeben.

Im folgenden Beispiel wird ein 128-dimensionaler Vektor zurückgegeben. Bei gemini-embedding-2 sind die Ausgabeeinbettungen für nicht standardmäßige Dimensionen bereits L2-normalisiert (im Gegensatz zu 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
      

Parameter

Die standardmäßige Video-Abtastrate beträgt 1 Bild pro Sekunde (FPS). Mit video_metadata können zusätzliche Parameter hinzugefügt werden:

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)
      

In EmbedContentConfig gibt es zusätzliche Optionen.

Option Typ Beschreibung
output_dimensionality int Reduzieren Sie die Dimensionalität für die Ausgabe-Einbettung.
document_ocr bool OCR für die Dokumenteingabe aktivieren.
audio_track_extraction bool Audio aus Videoeingabe extrahieren

multimodalembedding@001 verwenden

Die folgenden Limits gelten, wenn Sie das multimodalembedding@001-Modell für Text- und Bildeinbettungen verwenden:

Limit Wert und Beschreibung
Text- und Bilddaten
Maximale Anzahl an API-Anfragen pro Minute und Projekt 120–600 €, je nach Region
Maximale Textlänge 32 Tokens (ca. 32 Wörter)

Die maximale Textlänge beträgt 32 Tokens (ca. 32 Wörter). Wenn die Eingabe 32 Tokens überschreitet, kürzt das Modell die Eingabe intern auf diese Länge.
Sprache Englisch
Bildformate BMP, GIF, JPG, PNG
Bildgröße Base64-codierte Bilder: 20 MB (bei der Transcodierung in PNG)
Cloud Storage-Bilder: 20 MB (Originaldateiformat)

Die maximal akzeptierte Bildgröße beträgt 20 MB. Verwenden Sie kleinere Bilder, um eine höhere Netzwerklatenz zu vermeiden. Außerdem ändert das Modell Bilder auf die Auflösung 512 x 512 Pixel. Daher müssen Sie keine Bilder mit höherer Auflösung bereitstellen.
Videodaten
Audio-Unterstützung Nicht verfügbar: Das Modell berücksichtigt beim Generieren von Videoeinbettungen keinen Audioinhalt.
Videoformate AVI, FLV, MKV, MOV, MP4, MPEG, MPG, WEBM, und WMV
Maximale Videolänge (Cloud Storage) Kein Limit. Es können jedoch nur zwei Minuten an Inhalt gleichzeitig analysiert werden.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  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 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 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 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. Richten Sie die Authentifizierung für Ihre Umgebung ein.

    Wählen Sie den Tab aus, der Ihrer geplanten Verwendung der Beispiele auf dieser Seite entspricht:

    Java

    Wenn Sie die Java-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten Sie dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.

    2. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    3. Aktualisieren Sie die gcloud CLI nach der Initialisierung und installieren Sie die erforderlichen Komponenten:

      gcloud components update
      gcloud components install beta
    4. Wenn Sie eine lokale Shell verwenden, erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Nutzerkonto:

      gcloud auth application-default login

      Wenn Sie Cloud Shell verwenden, müssen Sie das nicht tun.

      Wenn ein Authentifizierungsfehler zurückgegeben wird und Sie einen externen Identitätsanbieter (IdP) verwenden, prüfen Sie, ob Sie sich mit Ihrer föderierten Identität in der gcloud CLI angemeldet haben.

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter ADC für eine lokale Entwicklungsumgebung einrichten.

    Node.js

    Wenn Sie die Node.js-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten Sie dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.

    2. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    3. Aktualisieren Sie die gcloud CLI nach der Initialisierung und installieren Sie die erforderlichen Komponenten:

      gcloud components update
      gcloud components install beta
    4. Wenn Sie eine lokale Shell verwenden, erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Nutzerkonto:

      gcloud auth application-default login

      Wenn Sie Cloud Shell verwenden, müssen Sie das nicht tun.

      Wenn ein Authentifizierungsfehler zurückgegeben wird und Sie einen externen Identitätsanbieter (IdP) verwenden, prüfen Sie, ob Sie sich mit Ihrer föderierten Identität in der gcloud CLI angemeldet haben.

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter ADC für eine lokale Entwicklungsumgebung einrichten.

    Python

    Wenn Sie die Python-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten Sie dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.

    2. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    3. Aktualisieren Sie die gcloud CLI nach der Initialisierung und installieren Sie die erforderlichen Komponenten:

      gcloud components update
      gcloud components install beta
    4. Wenn Sie eine lokale Shell verwenden, erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Nutzerkonto:

      gcloud auth application-default login

      Wenn Sie Cloud Shell verwenden, müssen Sie das nicht tun.

      Wenn ein Authentifizierungsfehler zurückgegeben wird und Sie einen externen Identitätsanbieter (IdP) verwenden, prüfen Sie, ob Sie sich mit Ihrer föderierten Identität in der gcloud CLI angemeldet haben.

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter ADC für eine lokale Entwicklungsumgebung einrichten.

    REST

    Wenn Sie die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, verwenden Sie die Anmeldedaten, die Sie der gcloud CLI bereitstellen.

    1. Installieren Sie die Google Cloud CLI.

    2. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    3. Aktualisieren Sie die gcloud CLI nach der Initialisierung und installieren Sie die erforderlichen Komponenten:

      gcloud components update
      gcloud components install beta

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter Für die Verwendung von REST authentifizieren.

  9. Folgen Sie der Anleitung unter Vertex AI SDK für Python installieren, um das Python SDK zu verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI SDK for Python API.
  10. Optional. Preise Die Preise für Einbettungen hängen vom Typ der gesendeten Daten (z. B. Bild oder Text) und vom Modus ab, den Sie für bestimmte Datentypen verwenden (z. B. Video Plus, Video Standard oder Video Essential). “

Standorte

Ein Standort ist eine Region, die Sie in einer Anfrage angeben können, um zu steuern, wo Daten im Ruhezustand gespeichert werden. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten.

Fehlermeldungen

Fehler „Kontingent überschritten“

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.

Wenn Sie diesen Fehler zum ersten Mal erhalten, können Sie in der Google Cloud Console eine Kontingentanpassung für Ihr Projekt beantragen. Verwenden Sie die folgenden Filter, bevor Sie eine Anpassung beantragen:

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

Kontingente aufrufen

Wenn Sie bereits eine Anfrage zur Kontingentanpassung gesendet haben, warten Sie, bevor Sie eine weitere Anfrage senden. Wenn Sie das Kontingent weiter erhöhen möchten, wiederholen Sie die Kontingentanpassung mit einer Begründung für eine weitere Kontingentanpassung.

Einbettungen mit niedrigeren Dimensionen angeben

Je nach verwendetem Modell wird bei einer Einbettungsanfrage entweder ein Float-Vektor vom Typ 1408 oder ein Float-Vektor vom Typ 3072 zurückgegeben. Sie können Einbettungen mit niedrigeren Dimensionen für Text- und Bilddaten angeben, um die Latenz und den Speicherplatz oder die Qualität zu optimieren. Einbettungen mit niedriger Dimension bieten einen geringeren Speicherbedarf und eine geringere Latenz für nachfolgende Einbettungsaufgaben (z. B. Suche oder Empfehlung). Einbettungen mit höheren Dimensionen bieten eine höhere Genauigkeit für diese Aufgaben, erfordern aber mehr Speicherplatz und haben eine höhere Latenz.

In der folgenden Tabelle sind die Standard- und verfügbaren niedrigeren Dimensionen für jedes Modell aufgeführt:

Modell Standarddimensionen (höchste Priorität) Unterstützte Dimensionen (Bereich) Empfohlene niedrigere Dimensionen
gemini-embedding-2 3.072 128 bis 3.072 128, 768 oder 1536
multimodalembedding@001 1408 128 bis 1.408 128, 256 oder 512

Verwenden Sie die folgenden Beispiele, um Einbettungen mit niedrigeren Dimensionen zu generieren:

REST

Sie können auf Dimensionen mit niedriger Dimension zugreifen, indem Sie das Feld parameters.dimension hinzufügen. Für den Parameter können alle für das Modell verfügbaren Dimensionswerte verwendet werden. Wenn Sie das multimodalembedding@001-Modell verwenden, können Sie beispielsweise 128, 256, 512 oder 1408 angeben. Die Antwort enthält die Einbettung der angegebenen Dimension.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: Die Region Ihres Projekts. Beispiel: us-central1, europe-west2 oder asia-northeast3. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten. Wenn ein regionaler API-Endpunkt verwendet wird, wird die Region, in der die Anfrage verarbeitet wird, durch die Region in der URL des Endpunkts bestimmt. Das LOCATION im Ressourcenpfad wird ignoriert, wenn es zu Konflikten kommt.
  • PROJECT_ID: Ihre Google Cloud Projekt-ID.
  • IMAGE_URI: Der Cloud Storage-URI des Zielbildes, für das Einbettungen abgerufen werden sollen. Beispiel: gs://my-bucket/embeddings/supermarket-img.png.

    Sie können das Bild auch als Base64-codierten Bytestring bereitstellen:

    [...]
    "image": {
      "bytesBase64Encoded": "B64_ENCODED_IMAGE"
    }
    [...]
    
  • TEXT: Der Zieltext, für den Einbettungen abgerufen werden sollen. Beispiel: a cat
  • EMBEDDING_DIMENSION: Die Anzahl der Einbettungsdimensionen. Niedrigere Werte bieten eine geringere Latenz bei Verwendung dieser Einbettungen für nachfolgende Aufgaben, während höhere Werte eine höhere Genauigkeit bieten. Verfügbare Werte: 128, 256, 512 und 1408 (Standard).

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$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
Das Einbettungsmodell gibt einen Gleitkommavektor der von Ihnen angegebenen Dimension zurück. Die folgenden Beispielantworten werden aus Platzgründen gekürzt.

128 Dimensionen:

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

256 Dimensionen:

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

512 Dimensionen:

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

Bild- und Texteinbettungen abrufen (multimodalembedding@001)

Mit den folgenden Codebeispielen können Sie eine Einbettungsanfrage mit Bild- und Textdaten senden. In den Beispielen wird gezeigt, wie eine Anfrage mit beiden Datentypen gesendet wird. Sie können den Dienst aber auch mit einem einzelnen Datentyp verwenden.

Text- und Bildeinbettungen abrufen

REST

Weitere Informationen zu multimodalembedding@001-Modellanfragen finden Sie in der API-Referenz des multimodalembedding@001-Modells.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: Die Region Ihres Projekts. Beispiel: us-central1, europe-west2 oder asia-northeast3. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten. Wenn ein regionaler API-Endpunkt verwendet wird, wird die Region, in der die Anfrage verarbeitet wird, durch die Region in der URL des Endpunkts bestimmt. Das LOCATION im Ressourcenpfad wird ignoriert, wenn es zu Konflikten kommt.
  • PROJECT_ID: Ihre Google Cloud Projekt-ID.
  • TEXT: Der Zieltext, für den Einbettungen abgerufen werden sollen. Beispiel: a cat
  • B64_ENCODED_IMG: Das Zielbild, für das Einbettungen abgerufen werden sollen. Das Bild muss als base64-codierter Bytestring angegeben werden.

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$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
Die Einbettung des Modells ist ein Float-Vektor vom Typ 1408. Die folgende Beispielantwort wurde aus Platzgründen gekürzt.
{
  "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

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Python API-Referenzdokumentation.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Node.js-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Node.js API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

/**
 * 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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Java-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Java API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Go-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Go API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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
}

Video-, Bild- oder Texteinbettungen abrufen (multimodalembedding@001)

Wenn Sie eine Einbettungsanfrage senden, können Sie nur ein Eingabevideo oder eine Kombination aus Video-, Bild- und Textdaten angeben.

Videoeinbettungsmodi

Sie können für Videoeinbettungen drei Modi verwenden: Essential, Standard oder Plus. Der Modus entspricht der Dichte der generierten Einbettungen, die durch die interval_sec-Konfiguration in der Anfrage angegeben werden kann. Für jedes Videointervall mit der Länge interval_sec wird eine Einbettung erstellt. Das Videointervall beträgt mindestens 4 Sekunden. Intervalllängen von mehr als 120 Sekunden können sich negativ auf die Qualität der generierten Einbettungen auswirken.

Die Preise für die Videoeinbettung hängen vom verwendeten Modus ab. Weitere Informationen finden Sie unter Preise.

In der folgenden Tabelle finden Sie eine Übersicht über die drei Modi, die Sie für die Videoeinbettung verwenden können:

Modus Maximale Anzahl an Einbettungen pro Minute Videoeinbettungsintervall (Mindestwert)
Unverzichtbar 4 15

Dies entspricht: intervalSec >= 15
Standard 8 8

Dies entspricht: 8 <= intervalSec < 15
Plus 15 4

Dies entspricht: 4 <= intervalSec < 8

Best Practices für Videoeinbettungen

Beachten Sie beim Senden von Anfragen zur Videoeinbettung Folgendes:

  • Mit der folgenden videoSegmentConfig-Einstellung können Sie eine einzelne Einbettung für die ersten zwei Minuten eines Eingabevideos einer beliebigen Länge erstellen:

    request.json:

    // other request body content
    "videoSegmentConfig": {
      "intervalSec": 120
    }
    // other request body content
    
  • Wenn Sie eine Einbettung für ein Video mit einer Länge von mehr als zwei Minuten generieren möchten, können Sie mehrere Anfragen senden, die die Start- und Endzeiten in videoSegmentConfig angeben:

    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
    

Videoeinbettungen abrufen

Im folgenden Beispiel werden Einbettungen nur für Videoinhalte verwendet.

REST

Weitere Informationen zu multimodalembedding@001-Modellanfragen finden Sie in der API-Referenz des multimodalembedding@001-Modells.

Im folgenden Beispiel wird ein Video verwendet, das sich in Cloud Storage befindet. Sie können das Feld video.bytesBase64Encoded auch verwenden, um eine base64-codierte Stringdarstellung des Videos anzugeben.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: Die Region Ihres Projekts. Beispiel: us-central1, europe-west2 oder asia-northeast3. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten. Wenn ein regionaler API-Endpunkt verwendet wird, wird die Region, in der die Anfrage verarbeitet wird, durch die Region in der URL des Endpunkts bestimmt. Das LOCATION im Ressourcenpfad wird ignoriert, wenn es zu Konflikten kommt.
  • PROJECT_ID: Ihre Google Cloud Projekt-ID.
  • VIDEO_URI: Der Cloud Storage-URI des Zielvideos, für das Einbettungen abgerufen werden sollen. Beispiel: gs://my-bucket/embeddings/supermarket-video.mp4.

    Sie können das Video auch als Base64-codierten Bytestring bereitstellen:

    [...]
    "video": {
      "bytesBase64Encoded": "B64_ENCODED_VIDEO"
    }
    [...]
    
  • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Optional. Die spezifischen Videosegmente (in Sekunden), für die die Einbettungen generiert werden.

    Beispiele:

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

    Mit dieser Konfiguration werden Videodaten von 10 bis 60 Sekunden angegeben und Einbettungen für die folgenden 10-Sekunden-Videointervalle generiert: [10, 20), [20, 30), [30, 40), [40, 50), [50, 60). Dieses Videointervall ("intervalSec": 10) fällt in den Standardmodus zum Einbetten von Videos und dem Nutzer wird der Standardpreis für den Standardmodus in Rechnung gestellt.

    Wenn Sie videoSegmentConfig weglassen, verwendet der Dienst die folgenden Standardwerte: "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Dieses Videointervall ("intervalSec": 16) fällt in den Einbettungsmodus für wichtige Videos und dem Nutzer wird der Preis für den wichtigen Modus in Rechnung gestellt.

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$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
Die Einbettung, die das Modell zurückgibt, ist ein Float-Vektor vom Typ 1408. Die folgenden Beispielantworten werden aus Platzgründen gekürzt.

Antwort (7 Sekunden langes Video, keine videoSegmentConfig angegeben):

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

Antwort (59 Sekunden langes Video mit der folgenden Videosegmentkonfiguration: "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

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Python API-Referenzdokumentation.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Go-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Go API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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
}

Bild-, Text- und Videoeinbettungen abrufen

Im folgenden Beispiel werden Einbettungen für Video-, Text- und Bildinhalte verwendet.

REST

Weitere Informationen zu multimodalembedding@001-Modellanfragen finden Sie in der API-Referenz des multimodalembedding@001-Modells.

Im folgenden Beispiel werden Bild-, Text- und Videodaten verwendet. Sie können diese Datentypen beliebig in Ihrem Anfragetext kombinieren.

Außerdem wird in diesem Beispiel ein Video verwendet, das sich in Cloud Storage befindet. Sie können das Feld video.bytesBase64Encoded auch verwenden, um eine base64-codierte Stringdarstellung des Videos anzugeben.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION: Die Region Ihres Projekts. Beispiel: us-central1, europe-west2 oder asia-northeast3. Eine Liste der verfügbaren Regionen finden Sie unter Generative AI an Vertex AI-Standorten. Wenn ein regionaler API-Endpunkt verwendet wird, wird die Region, in der die Anfrage verarbeitet wird, durch die Region in der URL des Endpunkts bestimmt. Das LOCATION im Ressourcenpfad wird ignoriert, wenn es zu Konflikten kommt.
  • PROJECT_ID: Ihre Google Cloud Projekt-ID.
  • TEXT: Der Zieltext, für den Einbettungen abgerufen werden sollen. Beispiel: a cat
  • IMAGE_URI: Der Cloud Storage-URI des Zielbildes, für das Einbettungen abgerufen werden sollen. Beispiel: gs://my-bucket/embeddings/supermarket-img.png.

    Sie können das Bild auch als Base64-codierten Bytestring bereitstellen:

    [...]
    "image": {
      "bytesBase64Encoded": "B64_ENCODED_IMAGE"
    }
    [...]
    
  • VIDEO_URI: Der Cloud Storage-URI des Zielvideos, für das Einbettungen abgerufen werden sollen. Beispiel: gs://my-bucket/embeddings/supermarket-video.mp4.

    Sie können das Video auch als Base64-codierten Bytestring bereitstellen:

    [...]
    "video": {
      "bytesBase64Encoded": "B64_ENCODED_VIDEO"
    }
    [...]
    
  • videoSegmentConfig (START_SECOND, END_SECOND, INTERVAL_SECONDS). Optional. Die spezifischen Videosegmente (in Sekunden), für die die Einbettungen generiert werden.

    Beispiele:

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

    Mit dieser Konfiguration werden Videodaten von 10 bis 60 Sekunden angegeben und Einbettungen für die folgenden 10-Sekunden-Videointervalle generiert: [10, 20), [20, 30), [30, 40), [40, 50), [50, 60). Dieses Videointervall ("intervalSec": 10) fällt in den Standardmodus zum Einbetten von Videos und dem Nutzer wird der Standardpreis für den Standardmodus in Rechnung gestellt.

    Wenn Sie videoSegmentConfig weglassen, verwendet der Dienst die folgenden Standardwerte: "videoSegmentConfig": { "startOffsetSec": 0, "endOffsetSec": 120, "intervalSec": 16 }. Dieses Videointervall ("intervalSec": 16) fällt in den Einbettungsmodus für wichtige Videos und dem Nutzer wird der Preis für den wichtigen Modus in Rechnung gestellt.

HTTP-Methode und URL:

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

JSON-Text der Anfrage:

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

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$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
Die Einbettung des Modells ist ein Float-Vektor vom Typ 1408. Die folgende Beispielantwort wurde aus Platzgründen gekürzt.
{
  "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

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Python API-Referenzdokumentation.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Go-Einrichtungsschritten in der Vertex AI-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Vertex AI Go API.

Richten Sie zur Authentifizierung bei Vertex AI Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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
}

Nächste Schritte