画面の画像

Model Armor は、プロンプトとレスポンス内のスタンドアロン画像と、サポートされているリッチテキスト ドキュメントに埋め込まれた画像をスクリーニングして、画像に埋め込まれたリスクから生成 AI アプリケーションを保護します。

Model Armor は、次の方法で画像をスクリーニングします。

仕様と制限事項

Model Armor を使用して画像をスクリーニングする場合は、次の仕様と制限事項を考慮してください。

  • サポートされている画像形式: Model Armor は、JPEG、PNG、BMP 形式のスタンドアロン画像をスクリーニングします。また、サポートされているリッチテキスト ファイルから埋め込み画像を抽出してスクリーニングします。
  • サイズの上限: 各スタンドアロン画像は 4 MB 以下にする必要があります。リッチテキスト ファイルの合計ファイルサイズは 4 MB 以下で、埋め込み画像は 5 つ以下にする必要があります。これらの上限を超えると、Model Armor はファイル全体のスキャンをスキップします。詳細については、ファイルサイズのシステム上限とドキュメントに埋め込まれた画像をスクリーニングするをご覧ください。
  • スタンドアロン プロンプト: スタンドアロン画像を使用して SanitizeUserPrompt メソッドと SanitizeModelResponse メソッドを呼び出すと、Model Armor はリクエストごとに 1 つの画像をスクリーニングします。1 つのリクエストで複数のスタンドアロン画像をスクリーニングすることはできません。また、Model Armor は、1 つのリクエストでテキストと画像を組み合わせたスタンドアロン プロンプトをサポートしていません。ただし、テキストと画像のモダリティの両方を有効にすると、テキストと画像の両方を含むリッチテキスト ドキュメントをスクリーニングできます。
  • 匿名化: Sensitive Data Protection の匿名化テンプレートを構成すると、Model Armor はテキストまたはスタンドアロン画像のいずれかを秘匿化します。両方を秘匿化することはできません。画像モダリティ(MODALITY_IMAGE)が選択されている場合、リッチテキスト ドキュメントの匿名化はサポートされていません。詳細については、スタンドアロン画像内の機密データを秘匿化するとドキュメント内の埋め込み画像をスクリーニングするをご覧ください。
  • ストリーミング: Model Armor のストリーミング メソッドは、テキスト入力のみをサポートし、画像やファイルはサポートしていません。
  • サポートされている統合: Model Armor REST API を直接呼び出すか、Gemini Enterprise 統合を介して画像をスクリーニングできます。他のすべての Model Armor インテグレーションでは、テキストのみがスキャンされ、サニタイズされます。詳細については、サポートされているモダリティをご覧ください。
  • リージョン別の提供状況: 画像スクリーニングは、特定のマルチリージョンでのみサポートされています。Model Armor が画像スクリーニングをサポートしていないエンドポイントに画像を含むプロンプトを送信すると、レスポンスの invocationResult フィールドに FAILURE が表示されます。画像スクリーニングをサポートするロケーションの一覧については、リージョン別にサポートされている機能をご覧ください。

画像のトークン計算と料金

Model Armor は、画像トークンがテキスト トークンと同じレートで課金される、統合されたトークンベースの料金モデルを使用します。

Model Armor がフィルタ処理前に入力を拒否またはスキップした場合(空の入力、ファイルサイズまたは埋め込み画像の上限を超えるファイルや画像など)、課金されません。ただし、入力が初期検証に合格した場合、次のケースでも計算されたトークンに対して課金されます。

  • すべての検出機能がスキップされる: 構成されたフィルタ(検出機能)の一部またはすべてがスキップされ、EXECUTION_SKIPPED が返されます(たとえば、4 MB の上限内の画像ペイロードを検出機能で解析できない場合や、モダリティでフィルタがスキップされた場合)。
  • IMAGE バイト データ型でラップされた画像以外のファイル: 画像以外のファイル(ZIP、CSV、Microsoft Word ドキュメントなど)が、byteDataType を IMAGE に設定して送信されます(最大 4 MB)。フィルタが EXECUTION_SKIPPED を返しても、Model Armor はスタンドアロン画像トークンの計算を使用してリクエストを課金します。

Model Armor は、入力タイプと構成されたモダリティに基づいて、画像とドキュメントのトークンを計算します。

  • スタンドアロン画像: Model Armor は、処理された各画像(最大 4 MB)を、画像 1 枚あたり 5,000 トークンの基本数と、画像サイズ 1 MB あたり 1,000 トークンを使用してトークンに変換します。サイズベースのトークンを計算する場合、Model Armor は画像サイズを次の MB 単位に切り上げます。

    画像あたりのトークン数 = 5,000 +(1,000 × 画像サイズ(MB 単位、次の整数 MB に切り上げ))

    OCR を使用して画像から抽出されたテキストは、画像トークンの計算に含まれ、個別のテキスト トークン料金は発生しません。

  • リッチテキスト ドキュメント: トークンの計算は、テンプレートで構成されたモダリティによって異なります。

    • テキスト モダリティ(MODALITY_TEXT): Model Armor は、ドキュメントから抽出されたテキストからトークンを計算します(1 トークンあたり約 4 文字)。埋め込み画像は抽出されず、課金されません。
    • 画像モダリティ(MODALITY_IMAGE): Model Armor は、画像トークン式を使用して、処理された埋め込み画像ごとにトークンを個別に計算します。ドキュメント テキストは課金されません。
    • テキストと画像のモダリティ(MODALITY_TEXT と MODALITY_IMAGE): Model Armor は、抽出されたドキュメント テキストのトークンと、処理された各埋め込み画像のトークンの合計として、合計トークン数を計算します。

次の表に、Model Armor が処理された画像のトークンを計算する方法の例を示します。

イメージサイズ 計算用に丸められたサイズ トークンの計算 合計トークン
500 KB 1 MB 5,000 +(1 × 1,000) 6,000 トークン
1.9 MB 2 MB 5,000 +(2 × 1,000) 7,000 トークン
4 MB 4 MB 5,000 +(4 × 1,000) 9,000 トークン

始める前に

画像をスクリーニングする前に、次の前提条件を満たしてください。

画像モダリティを有効にしてテンプレートを作成または更新する

テンプレートを作成または更新するときに、MODALITY_IMAGE を含むモダリティを選択します( Google Cloud コンソールでは [画像] または [すべて]、REST API を使用する場合は templateMetadata の "modalities": ["MODALITY_IMAGE", "MODALITY_TEXT"])。モダリティを指定しない場合、modalities フィールドを空のままにするか、MODALITY_TEXT のみを指定すると、Model Armor はテキストのみをスキャンし、スキップされたモダリティをスキャンするフィルタに対して EXECUTION_SKIPPED を返します。

必要な権限を取得する

プロンプトとレスポンスをサニタイズするために必要な Identity and Access Management ロール(roles/modelarmor.user など)があることを確認します。プロジェクト間で高度な Sensitive Data Protection モードを使用する場合は、必要な DLP ロールを Model Armor サービス エージェントに付与します。手順については、必要な権限を取得するをご覧ください。

スタンドアロン イメージをサニタイズする

ユーザー プロンプトまたはモデル レスポンスでスタンドアロン画像をスクリーニングするには、byteDataType フィールドを IMAGE に設定し、byteData フィールドにサポートされている形式(JPEG、PNG、BMP)で Base64 エンコードされた画像を指定します。

画像を含むプロンプトをサニタイズするには、次のコマンドを使用します。

curl -X POST \
    -d "$(jq -n \
    --arg data "$(base64 -w 0 -i IMAGE)" \
    '{userPromptData: {byteItem: {byteDataType: "IMAGE", byteData: $data}}}')" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"

次のように置き換えます。

  • PROJECT_ID: テンプレートが含まれているプロジェクトの ID。
  • LOCATION: テンプレートのロケーション。
  • TEMPLATE_ID: イメージをスキャンするように構成されたテンプレートの ID(MODALITY_IMAGE)。
  • IMAGE: サポートされている形式の画像ファイルのパス。

レスポンスは次の例のようになります。

{
  "sanitizationResult": {
    "filterMatchState": "MATCH_FOUND",
    "invocationResult": "SUCCESS",
    "filterResults": {
      "csam": {
        "csamFilterFilterResult": {
          "executionState": "EXECUTION_SUCCESS",
          "matchState": "NO_MATCH_FOUND"
        }
      },
      "pi_and_jailbreak": {
        "piAndJailbreakFilterResult": {
          "executionState": "EXECUTION_SUCCESS",
          "matchState": "MATCH_FOUND",
          "confidenceLevel": "HIGH"
        }
      },
      "sdp": {
        "sdpFilterResult": {
          "inspectResult": {
            "executionState": "EXECUTION_SUCCESS",
            "matchState": "MATCH_FOUND"
          }
        }
      }
    }
  }
}

スタンドアロン画像内の機密データを秘匿化する

Sensitive Data Protection の詳細モードを使用する場合、Sensitive Data Protection の検査テンプレートと Sensitive Data Protection の匿名化テンプレートの両方を使用して Model Armor テンプレートを構成すると、Model Armor はスタンドアロン画像内の機密性の高い検出結果を秘匿化します。匿名化テンプレートで画像編集を構成していることを確認します。Model Armor で Sensitive Data Protection を構成する方法については、Sensitive Data Protection の設定をご覧ください。匿名化の制限事項については、仕様と制限事項とドキュメントに埋め込まれた画像をスクリーニングするをご覧ください。

次の例は、Sensitive Data Protection の秘匿化が有効になっているフィルタ構成を示しています。

{
  "filterConfig": {
    "sdpSettings": {
      "advancedConfig": {
        "inspectTemplate": "projects/PROJECT_ID/locations/LOCATION/inspectTemplates/INSPECT_TEMPLATE_ID",
        "deidentifyTemplate": "projects/PROJECT_ID/locations/LOCATION/deidentifyTemplates/DEIDENTIFY_TEMPLATE_ID"
      }
    }
  }
}

次のように置き換えます。

  • PROJECT_ID: Sensitive Data Protection テンプレートを含むプロジェクトの ID。
  • LOCATION: テンプレートのロケーション。
  • INSPECT_TEMPLATE_ID: 検査テンプレートの ID。
  • DEIDENTIFY_TEMPLATE_ID: 匿名化テンプレートの ID。

画像秘匿化が有効になっているテンプレートを使用してスタンドアロン画像をサニタイズすると、レスポンスには、秘匿化された画像と各検出結果の境界ボックスの座標が含まれます。

{
  "sanitizationResult": {
    "filterMatchState": "MATCH_FOUND",
    "invocationResult": "SUCCESS",
    "filterResults": {
      "csam": {
        "csamFilterFilterResult": {
          "executionState": "EXECUTION_SUCCESS",
          "matchState": "NO_MATCH_FOUND"
        }
      },
      "sdp": {
        "sdpFilterResult": {
          "redactResult": {
            "executionState": "EXECUTION_SUCCESS",
            "matchState": "MATCH_FOUND",
            "redactedImage": "[REDACTED_IMAGE]",
            "findings": [
              {
                "infoType": "EMAIL_ADDRESS",
                "likelihood": "LIKELY",
                "location": {
                  "contentLocations": [
                    {
                      "imageFindingLocation": {
                        "boundingBoxes": {
                          "top": 16,
                          "left": 121,
                          "width": 620,
                          "height": 90
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
}

ドキュメントに埋め込まれた画像をスクリーニングする

テンプレートで画像モダリティ(MODALITY_IMAGE)を有効にして、リッチテキスト ドキュメント(PDF、WORD_DOCUMENT、EXCEL_DOCUMENT、POWERPOINT_DOCUMENT)をサニタイズすると、Model Armor はドキュメントに埋め込まれた画像を最大 5 つ自動的に抽出してスクリーニングします。MODALITY_TEXT と MODALITY_IMAGE の両方を有効にすると、Model Armor はドキュメント テキストと埋め込み画像の両方をスクリーニングします。

MODALITY_IMAGE のみを有効にするか、MODALITY_IMAGE と MODALITY_TEXT の両方を有効にするかにかかわらず、Model Armor はテキストと埋め込み画像の両方を含むドキュメント全体のスキャンをスキップします。部分的なスキャンは行いません。次の場合、検査を含むすべての構成済みフィルタに対して EXECUTION_SKIPPED を返し、全体的な filterMatchState として NO_MATCH_FOUND を返します。

  • ドキュメントが、4 MB のファイルサイズ制限または 5 画像の制限を超えている。
  • Sensitive Data Protection の匿名化テンプレートが構成されている。画像モダリティが有効になっている場合にリッチテキスト ドキュメントを検査するには、匿名化テンプレートを使用せずに検査テンプレートのみを構成します。

REST とクライアント ライブラリを使用してファイルベースのプロンプトを送信する方法を示すコードサンプルについては、ファイルベースのプロンプトをご覧ください。

部分的なファイル検査

Model Armor は、画像ごとではなく、ファイル全体にわたるフィルタ(検出機能)レベルでのみ部分的な結果(invocationResult: PARTIAL)を返します。

  • 画像ごとの失敗(ファイル全体がスキップされる): ファイル内の埋め込み画像の一部は正常にスキャンされたものの、ファイル内の他の 1 つ以上の画像の抽出またはスキャンに失敗した場合、Model Armor はファイル全体をスキップします。構成されたすべてのフィルタに対して executionState: EXECUTION_SKIPPED を返し、全体的な filterMatchState は NO_MATCH_FOUND になります。
  • 検出機能レベルの失敗(部分的な結果): 構成されたフィルタの一部がファイル全体で成功し、他の 1 つ以上のフィルタがファイル全体でスキップされた場合(検出機能のタイムアウトなど)、Model Armor は次のフィールドを含む部分的な結果を返します。
    • 呼び出し結果: invocationResult フィールドが SUCCESS ではなく PARTIAL に設定されています。これは、構成された 1 つ以上のフィルタがファイルに対してスキップされ、他のフィルタが検査を完了したことを示します。
    • フィルタの実行状態: ファイル レポートでスキップされたフィルタ executionState: EXECUTION_SKIPPED。ファイル レポート executionState: EXECUTION_SUCCESS で検査を完了したフィルタ。
    • 一致状態: filterMatchState フィールドには、検査が完了したフィルタの検出結果が反映されます。完了したフィルタで違反が検出されると、filterMatchState は MATCH_FOUND に設定されます。完了したフィルタで違反が検出されなかった場合、filterMatchState は NO_MATCH_FOUND に設定されます。

部分検査に関するセキュリティ上の考慮事項

セキュリティの観点から、invocationResult 値が PARTIAL の場合、構成済みの 1 つ以上のフィルタがファイルを評価できなかったことを示します。スキップされたフィルタの対象となる潜在的なセキュリティ脅威やポリシー違反がファイルに存在する可能性があります。

デフォルトでは、検査を完了したフィルタでポリシー違反が検出されない場合、filterMatchState は NO_MATCH_FOUND です。プロンプトが AI モデルに到達する前に、構成されたすべてのフィルタで検査を完了する必要がある場合は、レスポンスの invocationResult フィールドを検査します。値が PARTIAL の場合は、組織のリスク許容度に応じてリクエストを処理するようにアプリケーション ロジックを構成します。たとえば、プロンプトを拒否したり、二次審査にルーティングしたりします。

部分的な検査レスポンスの例

次の例は、ファイルに対して児童性的虐待のコンテンツ(CSAM)フィルタがスキップされ、他の構成済みフィルタが検査を完了したレスポンスを示しています。Model Armor は、PARTIAL の invocationResult、CSAM フィルタの EXECUTION_SKIPPED ステータス、残りのフィルタの EXECUTION_SUCCESS を返します。

{
  "sanitizationResult": {
    "filterMatchState": "NO_MATCH_FOUND",
    "invocationResult": "PARTIAL",
    "filterResults": {
      "csam": {
        "csamFilterFilterResult": {
          "executionState": "EXECUTION_SKIPPED",
          "matchState": "NO_MATCH_FOUND"
        }
      },
      "pi_and_jailbreak": {
        "piAndJailbreakFilterResult": {
          "executionState": "EXECUTION_SUCCESS",
          "matchState": "NO_MATCH_FOUND"
        }
      },
      "sdp": {
        "sdpFilterResult": {
          "inspectResult": {
            "executionState": "EXECUTION_SUCCESS",
            "matchState": "NO_MATCH_FOUND"
          }
        }
      }
    }
  }
}

次のステップ