画像の理解

Gemini リクエストに画像を追加して、含まれる画像の内容を理解するタスクを実行できます。このページでは、Google Cloud コンソールと Vertex AI API を使用して、Vertex AI で Gemini に送信するリクエストに画像を追加する方法について説明します。

サポートされているモデル

次の表に、画像理解をサポートするモデルを示します。

モデル 画像モダリティの詳細

Gemini 1.5 Flash

Gemini 1.5 Flash モデルカードに移動する
プロンプトあたりの最大画像数: 3,000

Gemini 1.5 Pro

Gemini 1.5 Pro モデルカードに移動する
プロンプトあたりの最大画像数: 3,000

Gemini 1.0 Pro Vision

Gemini 1.0 Pro Vision モデルカードに移動する
プロンプトあたりの最大画像数: 16

Gemini モデルでサポートされている言語の一覧については、モデル情報の Google モデルをご覧ください。マルチモーダル プロンプトの設計方法について詳しくは、マルチモーダル プロンプトを設計するをご覧ください。モバイルアプリやウェブアプリから Gemini を直接使用することをお考えの場合は、Android、Swift、ウェブ、Flutter アプリの Vertex AI for Firebase SDK をご覧ください。

リクエストに画像を追加する

Gemini へのリクエストに単一の画像または複数の画像を追加できます。

単一の画像

次の各タブのサンプルコードでは、画像に含まれているものを識別するさまざまな方法を示します。このサンプルは、すべての Gemini マルチモーダル モデルで動作します。

Python

Vertex AI SDK for Python のインストールまたは更新方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generate_contentstream パラメータを使用します。

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

非ストリーミング レスポンスの場合は、パラメータを削除するか、パラメータを False に設定します。

サンプルコード

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update and un-comment below line
# project_id = "PROJECT_ID"

vertexai.init(project=project_id, location="us-central1")

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

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

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

Java

このサンプルを試す前に、Vertex AI クイックスタートの Java の設定手順を実施してください。詳細については、Vertex AI Java SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generateContentStream メソッドを使用します。

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

非ストリーミング レスポンスの場合は、generateContent メソッドを使用します。

  public GenerateContentResponse generateContent(Content content)
  

サンプルコード

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

public class MultimodalQuery {

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

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


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

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

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

Node.js

このサンプルを試す前に、Node.js SDK を使用した生成 AI クイックスタートの Node.js の設定手順を実施してください。詳細については、Node.js SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generateContentStream メソッドを使用します。

  const streamingResp = await generativeModel.generateContentStream(request);
  

非ストリーミング レスポンスの場合は、generateContent メソッドを使用します。

  const streamingResp = await generativeModel.generateContent(request);
  

サンプルコード

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

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

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

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

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

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

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

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

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

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

  console.log(fullTextResponse);
}

Go

このサンプルを試す前に、Vertex AI クイックスタートの Go の設定手順を実施してください。詳細については、Vertex AI Go SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、GenerateContentStream メソッドを使用します。

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

非ストリーミング レスポンスの場合は、GenerateContent メソッドを使用します。

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

サンプルコード

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

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

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

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

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

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

C#

このサンプルを試す前に、Vertex AI クイックスタートの C# の設定手順を実施してください。詳細については、Vertex AI C# のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、StreamGenerateContent メソッドを使用します。

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

非ストリーミング レスポンスの場合は、GenerateContentAsync メソッドを使用します。

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

サーバーがレスポンスをストリーミングする方法の詳細については、ストリーミング RPC をご覧ください。

サンプルコード


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

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

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

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

        StringBuilder fullText = new();

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

        return fullText.ToString();
    }
}

REST

環境をセットアップしたら、REST を使用してテキスト プロンプトをテストできます。次のサンプルは、パブリッシャー モデルのエンドポイントにリクエストを送信します。

Cloud Storage に保存されている画像を追加することも、base64 でエンコードされた画像データを使用することもできます。

Cloud Storage 内の画像

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: リクエストを処理するリージョン。サポートされているリージョンを入力します。サポートされているリージョンの一覧については、利用可能なロケーションをご覧ください。

    クリックして、利用可能なリージョンの一部を開く

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: 実際のプロジェクト ID
  • FILE_URI: プロンプトに含めるファイルの Cloud Storage URI。バケット オブジェクトは、一般公開されているか、リクエストを送信するプロジェクトと同じ Google Cloud プロジェクトに存在している必要があります。ファイルのメディアタイプ(mimeType)も指定する必要があります。

    Cloud Storage に画像ファイルがない場合は、MIME タイプが image/jpeg の一般公開ファイル gs://cloud-samples-data/generative-ai/image/scones.jpg を使用できます。この画像を表示するには、サンプルの画像ファイルを開きます

  • MIME_TYPE: data フィールドまたは fileUri フィールドで指定されたファイルのメディアタイプ。指定できる値は次のとおりです。

    クリックして MIME タイプを開く

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT: プロンプトに含める指示のテキスト。 例: What is shown in this image?

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

PowerShell

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

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

次のような JSON レスポンスが返されます。

Base64 画像データ

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: リクエストを処理するリージョン。サポートされているリージョンを入力します。サポートされているリージョンの一覧については、利用可能なロケーションをご覧ください。

    クリックして、利用可能なリージョンの一部を開く

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: 実際のプロジェクト ID
  • B64_BASE_IMAGE
    : プロンプトにインラインで含める画像、PDF、または動画の Base64 エンコード。メディアをインラインで含める場合は、データのメディアタイプ(mimeType)も指定する必要があります。
  • MIME_TYPE: data フィールドまたは fileUri フィールドで指定されたファイルのメディアタイプ。指定できる値は次のとおりです。

    クリックして MIME タイプを開く

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT: プロンプトに含める指示のテキスト。 例: What is shown in this image?

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

PowerShell

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

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

次のような JSON レスポンスが返されます。

このサンプルの URL で次の点に注意してください。
  • generateContent メソッドを使用して、レスポンスが完全に生成された後に返されるようにリクエストします。ユーザーが認識するレイテンシを短縮するには、streamGenerateContent メソッドを使用して、レスポンスの生成時にストリーミングします。
  • マルチモーダル モデル ID は、URL の末尾のメソッドの前に配置されます(例: gemini-1.5-flashgemini-1.0-pro-vision)。このサンプルでは、他のモデルもサポートされている場合があります。

コンソール

Google Cloud コンソールでマルチモーダル プロンプトを送信する手順は次のとおりです。

  1. Google Cloud コンソールの [Vertex AI] セクションで、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [プロンプトの設計(シングルターン)] で [開く] をクリックします。
  3. 省略可: モデルとパラメータを構成します。

    • Model: モデルを選択します。
    • リージョン: 使用するリージョンを選択します。
    • 温度: スライダーまたはテキスト ボックスを使用して、温度の値を入力します。

      温度は、レスポンス生成時のサンプリングに使用されます。レスポンス生成は、topPtopK が適用された場合に発生します。温度は、トークン選択のランダム性の度合いを制御します。温度が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、温度が高いと、より多様で創造的な結果を導くことができます。温度が 0 の場合、確率が最も高いトークンが常に選択されます。この場合、特定のプロンプトに対するレスポンスはほとんど確定的ですが、わずかに変動する可能性は残ります。

      モデルが返すレスポンスが一般的すぎる、短すぎる、あるいはフォールバック(代替)レスポンスが返ってくる場合は、温度を高く設定してみてください。

    • 出力トークンの上限: スライダーまたはテキスト ボックスを使用して、最大出力の上限値を入力します。

      レスポンスで生成できるトークンの最大数。1 トークンは約 4 文字です。100 トークンは約 60~80 語に相当します。

      レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。

    • 停止シーケンスを追加: 省略可。停止シーケンスを入力します。これはスペースを含む文字列です。モデルが停止シーケンスに遭遇すると、レスポンスの生成が停止します。停止シーケンスはレスポンスには含まれません。停止シーケンスは 5 つまで追加できます。
  4. 省略可: 詳細パラメータを構成するには、[詳細] をクリックして、次のように構成します。
  5. クリックして詳細構成を開く

    • Top-K: スライダーまたはテキスト ボックスを使用して、Top-K の値を入力します(Gemini 1.5 ではサポートされていません)。

      Top-K は、モデルが出力用にトークンを選択する方法を変更します。Top-K が 1 の場合、次に選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。Top-K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。

      トークン選択のそれぞれのステップで、最も高い確率を持つ Top-K のトークンがサンプリングされます。その後、トークンは Top-P に基づいてさらにフィルタリングされ、最終的なトークンは温度サンプリングを用いて選択されます。

      ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

    • Top-P: スライダーまたはテキスト ボックスを使用して、Top-P の値を入力します。確率の合計が Top-P の値と等しくなるまで、最も確率が高いものから最も確率が低いものの順に、トークンが選択されます。結果を最小にするには、Top-P を 0 に設定します。
    • グラウンドを有効にする: マルチモーダル プロンプトではグラウンドはサポートされていません。
  6. PNG ファイルなどのメディアをアップロードする手順は次のとおりです。
    1. [メディアを挿入] をクリックし、ソースを選択します。

      ソースとして [Google ドライブ] を選択した場合は、このオプションを初めて選択するときに、アカウントを選択して Vertex AI Studio がアカウントにアクセスできるように同意する必要があります。合計サイズが最大 10 MB の複数のメディア ファイルをアップロードできます。1 つのファイルのサイズは 7 MB を超えないようにしてください。

    2. 追加するファイルをクリックします。
    3. [選択] をクリックします。

      ファイルのサムネイルが [プロンプト] ペインに表示されます。トークンの合計数も表示されます。プロンプト データがトークンの上限を超えると、トークンは切り捨てられ、データの処理には含まれません。

    4. 省略可: 画像で計算されたトークンの数とすべてのトークンの合計を表示するには、[トークンを表示] をクリックします。

      メディア ファイルのトークン数を計算するには、15 秒ほどかかることがあります。メディア トークンはサポートされていないため、[トークン ID をテキストに変換] ビューと [トークン ID] ビューには有用な出力は表示されません。

      トークン生成ツールペインを閉じるには、[X] をクリックするか、ペインの外側をクリックします。

  7. [プロンプト] ペインにテキスト プロンプトを入力します。モデルは、以前のメッセージを新しいレスポンスのコンテキストとして使用します。
  8. 省略可: 画像で計算されたトークンの数とすべてのトークンの合計を表示するには、[トークンを表示] をクリックします。テキスト プロンプトのトークンまたはトークン ID を表示できます。
    • テキスト プロンプト内のトークン(各トークン ID の境界が異なる色でハイライト表示されている)を表示するには、[Token ID to text] をクリックします。メディア トークンはサポートされていません。
    • トークン ID を表示するには、[トークン ID] をクリックします。

      トークン生成ツールペインを閉じるには、[X] をクリックするか、ペインの外側をクリックします。

  9. [送信] をクリックします。
  10. 省略可: プロンプトを [マイプロンプト] に保存するには、[ 保存] をクリックします。
  11. 省略可: プロンプトの Python コードまたは curl コマンドを取得するには、[コードを取得] をクリックします。
  12. 省略可: 以前のメッセージをすべて消去するには、[ 会話をクリア] をクリックします。

複数の画像

以下の各タブでは、プロンプト リクエストに複数の画像を含める方法を説明します。各サンプルは、次の入力の 2 つのセットを受け取ります。

  • 人気のある都市のランドマークの画像
  • 画像のメディアタイプ
  • 画像内の都市とランドマークを示すテキスト

このサンプルでは、3 つ目の画像とメディアタイプも取り込まれますが、テキストは取り込まれません。このサンプルは、3 つ目の画像に表示されている都市とランドマークを示すテキスト レスポンスを返します。

これらの画像サンプルは、すべての Gemini マルチモーダル モデルで使用できます。

Python

Vertex AI SDK for Python のインストールまたは更新方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generate_contentstream パラメータを使用します。

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

非ストリーミング レスポンスの場合は、パラメータを削除するか、パラメータを False に設定します。

サンプルコード

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update and un-comment below line
# project_id = "PROJECT_ID"

vertexai.init(project=project_id, location="us-central1")

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

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

Java

このサンプルを試す前に、Vertex AI クイックスタートの Java の設定手順を実施してください。詳細については、Vertex AI Java SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generateContentStream メソッドを使用します。

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

非ストリーミング レスポンスの場合は、generateContent メソッドを使用します。

  public GenerateContentResponse generateContent(Content content)
  

サンプルコード

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

public class MultimodalMultiImage {

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

    multimodalMultiImage(projectId, location, modelName);
  }

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

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

      GenerateContentResponse response = model.generateContent(content);

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

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

    int responseCode = connection.getResponseCode();

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

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

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

Node.js

このサンプルを試す前に、Node.js SDK を使用した生成 AI クイックスタートの Node.js の設定手順を実施してください。詳細については、Node.js SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、generateContentStream メソッドを使用します。

  const streamingResp = await generativeModel.generateContentStream(request);
  

非ストリーミング レスポンスの場合は、generateContent メソッドを使用します。

  const streamingResp = await generativeModel.generateContent(request);
  

サンプルコード

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

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

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

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

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

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

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

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

  console.log(fullTextResponse);
}

Go

このサンプルを試す前に、Vertex AI クイックスタートの Go の設定手順を実施してください。詳細については、Vertex AI Go SDK for Gemini リファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、GenerateContentStream メソッドを使用します。

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

非ストリーミング レスポンスの場合は、GenerateContent メソッドを使用します。

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

サンプルコード

import (
	"context"
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
	"os"
	"strings"

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

func main() {
	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
	location := "us-central1"
	modelName := "gemini-1.5-flash-001"
	temperature := 0.4

	if projectID == "" {
		log.Fatal("require environment variable GOOGLE_CLOUD_PROJECT")
	}

	// construct this multimodal prompt:
	// [image of colosseum] city: Rome, Landmark: the Colosseum
	// [image of forbidden city]  city: Beijing, Landmark: the Forbidden City
	// [new image]

	// create prompt image parts
	// colosseum
	colosseum, err := partFromImageURL("https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark1.png")
	if err != nil {
		log.Fatalf("unable to read image: %v", err)
	}
	// forbidden city
	forbiddenCity, err := partFromImageURL("https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark2.png")
	if err != nil {
		log.Fatalf("unable to read image: %v", err)
	}
	// new image
	newImage, err := partFromImageURL("https://storage.googleapis.com/cloud-samples-data/vertex-ai/llm/prompts/landmark3.png")
	if err != nil {
		log.Fatalf("unable to read image: %v", err)
	}

	// create a multimodal (multipart) prompt
	prompt := []genai.Part{
		colosseum,
		genai.Text("city: Rome, Landmark: the Colosseum "),
		forbiddenCity,
		genai.Text("city: Beijing, Landmark: the Forbidden City "),
		newImage,
	}

	// generate the response
	err = generateMultimodalContent(os.Stdout, prompt, projectID, location, modelName, float32(temperature))
	if err != nil {
		log.Fatalf("unable to generate: %v", err)
	}
}

// generateMultimodalContent provide a generated response using multimodal input
func generateMultimodalContent(w io.Writer, parts []genai.Part, projectID, location, modelName string, temperature float32) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)
	model.SetTemperature(temperature)

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

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

	return nil
}

// partFromImageURL create a multimodal prompt part from an image URL
func partFromImageURL(image string) (genai.Part, error) {
	var img genai.Blob

	imageURL, err := url.Parse(image)
	if err != nil {
		return img, err
	}
	res, err := http.Get(image)
	if err != nil || res.StatusCode != 200 {
		return img, err
	}
	defer res.Body.Close()
	data, err := io.ReadAll(res.Body)
	if err != nil {
		return img, fmt.Errorf("unable to read from http: %w", err)
	}

	position := strings.LastIndex(imageURL.Path, ".")
	if position == -1 {
		return img, fmt.Errorf("couldn't find a period to indicate a file extension")
	}
	ext := imageURL.Path[position+1:]

	img = genai.ImageData(ext, data)
	return img, nil
}

C#

このサンプルを試す前に、Vertex AI クイックスタートの C# の設定手順を実施してください。詳細については、Vertex AI C# のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

ストリーミング レスポンスと非ストリーミング レスポンス

モデルがストリーミング レスポンスを生成するか、非ストリーミング レスポンスを生成するかを選択できます。ストリーミング レスポンスの場合、出力トークンが生成されるとすぐに各レスポンスが受信されます。非ストリーミング レスポンスの場合、すべての出力トークンが生成された後にすべてのレスポンスが届きます。

ストリーミング レスポンスの場合は、StreamGenerateContent メソッドを使用します。

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

非ストリーミング レスポンスの場合は、GenerateContentAsync メソッドを使用します。

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

サーバーがレスポンスをストリーミングする方法の詳細については、ストリーミング RPC をご覧ください。

サンプルコード


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

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

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

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

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

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

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

        StringBuilder fullText = new();

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

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

REST

環境をセットアップしたら、REST を使用してテキスト プロンプトをテストできます。次のサンプルは、パブリッシャー モデルのエンドポイントにリクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: リクエストを処理するリージョン。サポートされているリージョンを入力します。サポートされているリージョンの一覧については、利用可能なロケーションをご覧ください。

    クリックして、利用可能なリージョンの一部を開く

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: 実際のプロジェクト ID
  • FILE_URI1: プロンプトに含めるファイルの Cloud Storage URI。バケット オブジェクトは、一般公開されているか、リクエストを送信するプロジェクトと同じ Google Cloud プロジェクトに存在している必要があります。ファイルのメディアタイプ(mimeType)も指定する必要があります。

    Cloud Storage に画像ファイルがない場合は、MIME タイプが image/png の一般公開ファイル gs://cloud-samples-data/vertex-ai/llm/prompts/landmark1.png を使用できます。この画像を表示するには、サンプルの画像ファイルを開きます

  • MIME_TYPE: data フィールドまたは fileUri フィールドで指定されたファイルのメディアタイプ。指定できる値は次のとおりです。

    クリックして MIME タイプを開く

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
    わかりやすくするために、このサンプルでは 3 つの入力画像すべてに同じメディアタイプを使用します。
  • TEXT1: プロンプトに含める指示のテキスト。 例: city: Rome, Landmark: the Colosseum
  • FILE_URI2: プロンプトに含めるファイルの Cloud Storage URI。バケット オブジェクトは、一般公開されているか、リクエストを送信するプロジェクトと同じ Google Cloud プロジェクトに存在している必要があります。ファイルのメディアタイプ(mimeType)も指定する必要があります。

    Cloud Storage に画像ファイルがない場合は、MIME タイプが image/png の一般公開ファイル gs://cloud-samples-data/vertex-ai/llm/prompts/landmark2.png を使用できます。この画像を表示するには、サンプルの画像ファイルを開きます

  • TEXT2: プロンプトに含める指示のテキスト。 例: city: Beijing, Landmark: Forbidden City
  • FILE_URI3: プロンプトに含めるファイルの Cloud Storage URI。バケット オブジェクトは、一般公開されているか、リクエストを送信するプロジェクトと同じ Google Cloud プロジェクトに存在している必要があります。ファイルのメディアタイプ(mimeType)も指定する必要があります。

    Cloud Storage に画像ファイルがない場合は、MIME タイプが image/png の一般公開ファイル gs://cloud-samples-data/vertex-ai/llm/prompts/landmark3.png を使用できます。この画像を表示するには、サンプルの画像ファイルを開きます

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

PowerShell

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

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

その後、次のコマンドを実行して REST リクエストを送信します。

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

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

次のような JSON レスポンスが返されます。

このサンプルの URL で次の点に注意してください。
  • generateContent メソッドを使用して、レスポンスが完全に生成された後に返されるようにリクエストします。ユーザーが認識するレイテンシを短縮するには、streamGenerateContent メソッドを使用して、レスポンスの生成時にストリーミングします。
  • マルチモーダル モデル ID は、URL の末尾のメソッドの前に配置されます(例: gemini-1.5-flashgemini-1.0-pro-vision)。このサンプルでは、他のモデルもサポートされている場合があります。

コンソール

Google Cloud コンソールでマルチモーダル プロンプトを送信する手順は次のとおりです。

  1. Google Cloud コンソールの [Vertex AI] セクションで、[Vertex AI Studio] ページに移動します。

    Vertex AI Studio に移動

  2. [プロンプトの設計(シングルターン)] で [開く] をクリックします。
  3. 省略可: モデルとパラメータを構成します。

    • Model: モデルを選択します。
    • リージョン: 使用するリージョンを選択します。
    • 温度: スライダーまたはテキスト ボックスを使用して、温度の値を入力します。

      温度は、レスポンス生成時のサンプリングに使用されます。レスポンス生成は、topPtopK が適用された場合に発生します。温度は、トークン選択のランダム性の度合いを制御します。温度が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、温度が高いと、より多様で創造的な結果を導くことができます。温度が 0 の場合、確率が最も高いトークンが常に選択されます。この場合、特定のプロンプトに対するレスポンスはほとんど確定的ですが、わずかに変動する可能性は残ります。

      モデルが返すレスポンスが一般的すぎる、短すぎる、あるいはフォールバック(代替)レスポンスが返ってくる場合は、温度を高く設定してみてください。

    • 出力トークンの上限: スライダーまたはテキスト ボックスを使用して、最大出力の上限値を入力します。

      レスポンスで生成できるトークンの最大数。1 トークンは約 4 文字です。100 トークンは約 60~80 語に相当します。

      レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。

    • 停止シーケンスを追加: 省略可。停止シーケンスを入力します。これはスペースを含む文字列です。モデルが停止シーケンスに遭遇すると、レスポンスの生成が停止します。停止シーケンスはレスポンスには含まれません。停止シーケンスは 5 つまで追加できます。
  4. 省略可: 詳細パラメータを構成するには、[詳細] をクリックして、次のように構成します。
  5. クリックして詳細構成を開く

    • Top-K: スライダーまたはテキスト ボックスを使用して、Top-K の値を入力します(Gemini 1.5 ではサポートされていません)。

      Top-K は、モデルが出力用にトークンを選択する方法を変更します。Top-K が 1 の場合、次に選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。Top-K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。

      トークン選択のそれぞれのステップで、最も高い確率を持つ Top-K のトークンがサンプリングされます。その後、トークンは Top-P に基づいてさらにフィルタリングされ、最終的なトークンは温度サンプリングを用いて選択されます。

      ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

    • Top-P: スライダーまたはテキスト ボックスを使用して、Top-P の値を入力します。確率の合計が Top-P の値と等しくなるまで、最も確率が高いものから最も確率が低いものの順に、トークンが選択されます。結果を最小にするには、Top-P を 0 に設定します。
    • グラウンドを有効にする: マルチモーダル プロンプトではグラウンドはサポートされていません。
  6. PNG ファイルなどのメディアをアップロードする手順は次のとおりです。
    1. [メディアを挿入] をクリックし、ソースを選択します。

      ソースとして [Google ドライブ] を選択した場合は、このオプションを初めて選択するときに、アカウントを選択して Vertex AI Studio がアカウントにアクセスできるように同意する必要があります。合計サイズが最大 10 MB の複数のメディア ファイルをアップロードできます。1 つのファイルのサイズは 7 MB を超えないようにしてください。

    2. 追加するファイルをクリックします。
    3. [選択] をクリックします。

      ファイルのサムネイルが [プロンプト] ペインに表示されます。トークンの合計数も表示されます。プロンプト データがトークンの上限を超えると、トークンは切り捨てられ、データの処理には含まれません。

    4. 省略可: 画像で計算されたトークンの数とすべてのトークンの合計を表示するには、[トークンを表示] をクリックします。

      メディア ファイルのトークン数を計算するには、15 秒ほどかかることがあります。メディア トークンはサポートされていないため、[トークン ID をテキストに変換] ビューと [トークン ID] ビューには有用な出力は表示されません。

      トークン生成ツールペインを閉じるには、[X] をクリックするか、ペインの外側をクリックします。

  7. [プロンプト] ペインにテキスト プロンプトを入力します。モデルは、以前のメッセージを新しいレスポンスのコンテキストとして使用します。
  8. 省略可: 画像で計算されたトークンの数とすべてのトークンの合計を表示するには、[トークンを表示] をクリックします。テキスト プロンプトのトークンまたはトークン ID を表示できます。
    • テキスト プロンプト内のトークン(各トークン ID の境界が異なる色でハイライト表示されている)を表示するには、[Token ID to text] をクリックします。メディア トークンはサポートされていません。
    • トークン ID を表示するには、[トークン ID] をクリックします。

      トークン生成ツールペインを閉じるには、[X] をクリックするか、ペインの外側をクリックします。

  9. [送信] をクリックします。
  10. 省略可: プロンプトを [マイプロンプト] に保存するには、[ 保存] をクリックします。
  11. 省略可: プロンプトの Python コードまたは curl コマンドを取得するには、[コードを取得] をクリックします。
  12. 省略可: 以前のメッセージをすべて消去するには、[ 会話をクリア] をクリックします。

モデル パラメータを設定する

マルチモーダル モデルでは、次のモデル パラメータを設定できます。

Top-P

Top-P は、モデルが出力用にトークンを選択する方法を変更します。トークンは、確率の合計が Top-P 値に等しくなるまで、確率の高いもの(Top-K を参照)から低いものへと選択されます。たとえば、トークン A、B、C の確率が 0.3、0.2、0.1 であり、Top-P 値が 0.5 であるとします。この場合、モデルは温度を使用して A または B を次のトークンとして選択し、C は候補から除外します。

ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

Top-K

Top-K は、モデルが出力用にトークンを選択する方法を変更します。Top-K が 1 の場合、次に選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。Top-K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。

トークン選択のそれぞれのステップで、最も高い確率を持つ Top-K のトークンがサンプリングされます。その後、トークンは Top-P に基づいてさらにフィルタリングされ、最終的なトークンは温度サンプリングを用いて選択されます。

ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。

温度

温度は、レスポンス生成時のサンプリングに使用されます。レスポンス生成は、topPtopK が適用された場合に発生します。温度は、トークン選択のランダム性の度合いを制御します。温度が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、温度が高いと、より多様で創造的な結果を導くことができます。温度が 0 の場合、確率が最も高いトークンが常に選択されます。この場合、特定のプロンプトに対するレスポンスはほとんど確定的ですが、わずかに変動する可能性は残ります。

モデルが返すレスポンスが一般的すぎる、短すぎる、あるいはフォールバック(代替)レスポンスが返ってくる場合は、温度を高く設定してみてください。

有効なパラメータ値

パラメータ Gemini 1.0 Pro Vision Gemini 1.5 Pro Gemini 1.5 Flash
Top-K 1~40(デフォルトは 32) 非対応 非対応
Top-P 0~1.0(デフォルトは 1.0) 0~1.0(デフォルトは 0.95) 0~1.0(デフォルトは 0.95)
Temperature 0~1.0(デフォルトは 0.4) 0~2.0(デフォルトは 1.0) 0~2.0(デフォルトは 1.0)

画像の要件

Gemini マルチモーダル モデルは、次の画像 MIME タイプをサポートしています。

画像の MIME タイプ Gemini 1.5 Flash Gemini 1.5 Pro Gemini 1.0 Pro Vision
PNG - image/png
JPEG - image/jpeg

画像のピクセル数に特に制限はありません。ただし、大きな画像は元のアスペクト比を維持したまま、最大解像度 3,072 x 3,072 に合わせて縮小され、パディングされます。

Gemini 1.0 Pro Vision の場合、1 つの画像は 258 個のトークンに相当します。

Gemini 1.5 Flash と Gemini 1.5 Pro の場合:

  • 画像の両方の寸法が 384 ピクセル以下の場合、258 個のトークンが使用されます。
  • 画像の 1 つの寸法が 384 ピクセルを超える場合、画像はタイルに切り抜かれます。各タイルサイズは、デフォルトで最小の寸法(幅または高さ)を 1.5 で割った値になります。必要に応じて、各タイルは 256 ピクセル以上、768 ピクセル以下になるように調整されます。各タイルは 768x768 にサイズ変更され、258 個のトークンを使用します。

プロンプト リクエストに含めることができる画像の最大数は次のとおりです。

  • Gemini 1.0 Pro Vision: 16
  • Gemini 1.5 Flash と Gemini 1.5 Pro: 3,000

ベスト プラクティス

画像を使用する場合は、最適な結果を得るために、次のベスト プラクティスと情報を使用してください。

  • 画像内のテキストを検出する必要がある場合は、1 つの画像を使用するプロンプトのほうが、複数の画像を使用するプロンプトよりも優れた結果が得られます。
  • プロンプトに 1 つの画像が含まれている場合は、テキスト プロンプトの前に画像を配置します。
  • プロンプトに複数の画像が含まれており、これらの画像をプロンプトの後半で参照する場合、またはモデル レスポンスでモデルが参照する場合は、各画像の前にインデックスを付けると役立つ可能性があります。インデックスには a b c または image 1 image 2 image 3 を使用します。プロンプトでインデックス付き画像を使用する例を次に示します。

    image 1 <piano_recital.jpeg>
    image 2 <family_dinner.jpeg>
    image 3 <coffee_shop.jpeg>
    
    Write a blogpost about my day using image 1 and image 2. Then, give me ideas
    for tomorrow based on image 3.
    
  • 画像の解像度が高いほど良い結果が得られます。

  • プロンプトにいくつかの例を含めます。

  • 画像を適切な向きに回転してから、プロンプトに追加します。

  • ぼやけた画像は使用しないでください。

制限事項

Gemini マルチモーダル モデルは多くのマルチモーダル ユースケースに対応していますが、モデルの制限事項も理解しておく必要があります。

  • 空間推論: 画像内のテキストやオブジェクトの位置を正確に特定することはできません。オブジェクトの数も推定値しか返されない場合があります。
  • 医療目的での使用: 医療画像(X 線、CT スキャンなど)の解釈や医学的なアドバイスの提供には適していません。
  • 人物認識: このモデルは、画像内の著名人以外の人物を特定することを目的としたものではありません。
  • コンテンツの管理: Google の安全に関するポリシーに違反する画像に対する回答は拒否されます。
  • 精度: 低品質、回転、極端に低解像度の画像を解釈する際に、ハルシネーションや誤りが発生する可能性があります。また、画像ドキュメント内の手書きテキストを解釈する際に、ハルシネーションが発生することもあります。

次のステップ