安全フィルタとコンテンツ フィルタ

Google の生成 AI モデル(Gemini 2.5 Flash など)は、安全性を重視して設計されています。ただし、プロンプトに露骨な表現が含まれていると、有害な回答を生成する可能性があります。安全性をさらに強化し、不正使用を最小限に抑えるには、有害な可能性のある回答をブロックするようにコンテンツ フィルタを構成します。

このページでは、このような安全フィルタとコンテンツ フィルタのタイプと、安全性に関する重要なコンセプトについて説明します。構成可能なコンテンツ フィルタについて、有害カテゴリのブロックしきい値を構成してプロンプトとレスポンスがブロックされる頻度を制御する方法について説明します。

安全フィルタとコンテンツ フィルタは障壁として機能し、有害な出力を防ぎますが、モデルの動作に直接影響することはありません。モデルの操縦性の詳細については、安全性のためのシステム指示をご覧ください。

安全でないプロンプト

Vertex AI の Gemini API は、プロンプトが拒否された理由を説明する次のいずれかの enum コードを返します。

列挙型 フィルタの種類 説明
PROHIBITED_CONTENT 構成不可の安全フィルタ 禁止されているコンテンツ(通常は CSAM)が含まれていると報告されたため、プロンプトがブロックされました。
BLOCKED_REASON_UNSPECIFIED なし プロンプトをブロックする理由が指定されていません。
OTHER なし この列挙型は、プロンプトをブロックするその他のすべての理由を指します。Vertex AI の Gemini API は、すべての言語をサポートしているわけではありません。サポートされている言語の一覧については、Gemini の言語サポートをご覧ください。

詳細については、BlockedReason をご覧ください。

PROHIBITED_CONTENT が含まれているためにプロンプトがブロックされた場合、Vertex AI の Gemini API は次のような出力を生成します。

{
  "promptFeedback": {
    "blockReason": "PROHIBITED_CONTENT"
  },
  "usageMetadata": {
    "promptTokenCount": 7,
    "totalTokenCount": 7
  }
}

安全でない回答

次のフィルタを使用すると、安全でない可能性のある回答を検出してブロックできます。

  • 構成不可の安全フィルタ: 児童性的虐待のコンテンツ(CSAM)と個人を特定できる情報(PII)をブロックします。
  • 構成可能なコンテンツ フィルタ: 有害カテゴリのリストと、ユーザーが構成したブロックしきい値に基づいて、安全でないコンテンツをブロックします。これらの有害コンテンツのブロックしきい値は、ユースケースとビジネスに応じて構成できます。詳細については、構成可能なコンテンツ フィルタをご覧ください。
  • 引用フィルタ: ソース資料の引用を提供します。詳細については、引用フィルタをご覧ください。

LLM は、トークンと呼ばれるテキスト単位で回答を生成します。モデルは、自然な停止点に達するか、フィルタのいずれかで回答がブロックされると、トークンの生成を停止します。Vertex AI の Gemini API は、トークン生成が停止した理由を説明する次のいずれかの enum コードを提供します。

列挙型 フィルタの種類 説明
STOP なし この列挙型は、モデルが自然な停止点または指定された停止シーケンスに達したことを示します。
MAX_TOKENS なし モデルがリクエストで指定されたトークンの最大数に達したため、トークンの生成が停止されました。
SAFETY 構成可能なコンテンツ フィルタ 有害なコンテンツが含まれており、レスポンスにフラグが付けられたため、トークンの生成が停止されました。
RECITATION 引用フィルタ 列挙の可能性があるため、トークンの生成が停止されました。
SPII 構成不可の安全フィルタ レスポンスに個人を特定できる機密情報(SPII)のコンテンツが含まれているため、トークンの生成が停止されました。
PROHIBITED_CONTENT 構成不可の安全フィルタ 禁止されているコンテンツ(通常は CSAM)が含まれており、レスポンスにフラグが付けられたため、トークンの生成が停止されました。
FINISH_REASON_UNSPECIFIED なし 終了の理由は指定されていません。
OTHER なし この列挙型は、トークンの生成を停止するその他のすべての理由を指します。トークンの生成は、すべての言語でサポートされているわけではありません。サポートされている言語の一覧については、Gemini の言語サポートをご覧ください。

詳細については、FinishReason をご覧ください。

フィルタが回答をブロックすると、回答の Candidate.content フィールドは無効になります。モデルにフィードバックは提供されません。

構成可能なコンテンツ フィルタ

コンテンツ フィルタは、有害性のリストと照合してコンテンツを評価します。コンテンツ フィルタは、有害カテゴリごとに、コンテンツが有害である確率に基づくスコアと、有害なコンテンツの重大度に基づくスコアを割り当てます。

構成可能なコンテンツ フィルタには、モデル バージョンから独立したバージョニングはありません。以前にリリースされたモデルのバージョンの構成可能なコンテンツ フィルタは更新されません。ただし、モデルの将来のバージョンの構成可能なコンテンツ フィルタが更新される可能性はあります。

有害カテゴリ

コンテンツ フィルタは、次の有害カテゴリに基づいてコンテンツを評価します。

有害カテゴリ 定義
ヘイトスピーチ ID や保護されている属性をターゲットとする否定的なコメントや有害なコメント。
嫌がらせ 他人をターゲットにした威圧表現、いじめ、虐待的な内容を含むコメント
性的に露骨な表現 性行為やわいせつな内容に関する情報が含まれるコンテンツ。
危険なコンテンツ 有害な商品、サービス、アクティビティへのアクセスを促進または可能にするコンテンツ。

確率スコアと重大度スコアの比較

安全性スコアの確率は、モデルの回答がそれぞれの有害カテゴリに関連付けられている可能性を反映しています。信頼スコアは 0.01.0 で、小数点第 2 位を四捨五入します。信頼スコアは、NEGLIGIBLELOWMEDIUMHIGH の 4 つの信頼レベルに分割されます。

重大度スコアは、モデルのレスポンスがどのくらい有害であるかを反映しています。重大度スコアは 0.01.0 の範囲で、小数点第 2 位を四捨五入します。重大度スコアは、NEGLIGIBLELOWMEDIUMHIGH の 4 つのレベルに分割されます。

コンテンツの確率スコアが低く、重大度スコアが高い場合や、確率スコアが高く、重大度スコアが低い場合があります。

コンテンツ フィルタを構成する方法

コンテンツ フィルタは、Vertex AI の Gemini API または Google Cloud コンソールを使用して構成できます。

Vertex AI の Gemini API

Vertex AI の Gemini API には、有害なコンテンツをブロックする方法が 2 つあります。

  • SEVERITY: この方法では、確率スコアと重大度スコアの両方を使用します。
  • PROBABILITY: この方法では、確率スコアのみを使用します。

デフォルトのメソッドは SEVERITY です。gemini-1.5-flashgemini-1.5-pro より古いモデルの場合、デフォルトのメソッドは PROBABILITY です。詳細については、HarmBlockMethod API リファレンスをご覧ください。

Vertex AI の Gemini API には、次の有害コンテンツのブロックしきい値があります。

  • BLOCK_LOW_AND_ABOVE: 確率スコアまたは重大度スコアが LOWMEDIUM、または HIGH の場合にブロックします。
  • BLOCK_MEDIUM_AND_ABOVE: 確率スコアまたは重大度スコアが MEDIUM または HIGH の場合にブロックします。
  • BLOCK_ONLY_HIGH: 確率スコアまたは重大度スコアが HIGH の場合にブロックします。
  • HARM_BLOCK_THRESHOLD_UNSPECIFIED: デフォルトのしきい値を使用してブロックします。
  • OFF: 回答の自動ブロックは行われず、メタデータは返されません。gemini-2.5-flash 以降のモデルの場合、デフォルト値は OFF です。
  • BLOCK_NONE: BLOCK_NONE に設定すると、回答の自動ブロックが解除されます。代わりに、返されたスコアを使用して独自のコンテンツ ガイドラインを構成できます。これは制限付きフィールドで、GA モデル バージョンのすべてのユーザーが使用できるわけではありません。

たとえば、次の Python コードは、危険なコンテンツ カテゴリの有害コンテンツ ブロックのしきい値を BLOCK_ONLY_HIGH に設定する方法を示しています。

generative_models.SafetySetting(
  category=generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
  threshold=generative_models.HarmBlockThreshold.BLOCK_ONLY_HIGH,
),

これにより、危険なコンテンツとして分類されるコンテンツのほとんどがブロックされます。詳細については、HarmBlockThreshold API リファレンスをご覧ください。

Python、Node.js、Java、Go、C#、REST のエンドツーエンドの例については、コンテンツ フィルタ構成の例をご覧ください。

Google Cloud コンソール

Google Cloud コンソールでは、コンテンツ属性ごとにしきい値を構成できます。コンテンツ フィルタは確率スコアのみを使用します。重大度スコアを使用するオプションはありません。

Google Cloud コンソールには、次のしきい値が用意されています。

  • オフ(デフォルト): 自動回答のブロックは行われません。
  • 少量をブロック: 確率スコアが HIGH の場合にブロックします。
  • 一部をブロック: 確率スコアが MEDIUM または HIGH の場合にブロックします。
  • ほとんどをブロック: 確率スコアが LOWMEDIUM、または HIGH の場合にブロックします。

たとえば、「危険なコンテンツ」カテゴリのブロック設定を [少量をブロック] に設定した場合、危険なコンテンツである確率が高いものはすべてブロックされますが、その確率の低いものは許可されます。デフォルトのしきい値は Block some です。

しきい値を設定する手順は次のとおりです。

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

    Vertex AI Studio に移動

  2. [プロンプトを新規作成] でいずれかのボタンをクリックしてプロンプト デザインページを開きます。

  3. [安全性設定] をクリックします。

    [安全性設定] ダイアログ ウィンドウが開きます。

  4. 有害コンテンツのカテゴリごとに目的のしきい値を構成します。

  5. [保存] をクリックします。

構成可能なコンテンツ フィルタによって回答がブロックされた場合の出力例

危険なコンテンツが含まれているため、構成可能なコンテンツ フィルタによって回答がブロックされた場合、Vertex AI の Gemini API は次のような出力を生成します。

{
  "candidates": [{
    "finishReason": "SAFETY",
    "safetyRatings": [{
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11027937,
      "severity": "HARM_SEVERITY_LOW",
      "severityScore": 0.28487435
    }, {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "probability": "HIGH",
      "blocked": true,
      "probabilityScore": 0.95422274,
      "severity": "HARM_SEVERITY_MEDIUM",
      "severityScore": 0.43398145
    }, {
      "category": "HARM_CATEGORY_HARASSMENT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11085559,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.19027223
    }, {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.22901751,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.09089675
    }]
  }],
  "usageMetadata": {
    "promptTokenCount": 38,
    "totalTokenCount": 38
  }
}

コンテンツ フィルタ構成の例

次の例は、Vertex AI の Gemini API を使用してコンテンツ フィルタを構成する方法を示しています。

Python

インストール

pip install --upgrade google-genai

詳しくは、SDK リファレンス ドキュメントをご覧ください。

Vertex AI で Gen AI SDK を使用するための環境変数を設定します。

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    HarmCategory,
    HarmBlockThreshold,
    HttpOptions,
    SafetySetting,
)

client = genai.Client(http_options=HttpOptions(api_version="v1"))

system_instruction = "Be as mean as possible."

prompt = """
    Write a list of 5 disrespectful things that I might say to the universe after stubbing my toe in the dark.
"""

safety_settings = [
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HATE_SPEECH,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt,
    config=GenerateContentConfig(
        system_instruction=system_instruction,
        safety_settings=safety_settings,
    ),
)

# Response will be `None` if it is blocked.
print(response.text)
# Example response:
#     None

# Finish Reason will be `SAFETY` if it is blocked.
print(response.candidates[0].finish_reason)
# Example response:
#     FinishReason.SAFETY

# For details on all the fields in the response
for each in response.candidates[0].safety_ratings:
    print('\nCategory: ', str(each.category))
    print('Is Blocked:', True if each.blocked else False)
    print('Probability: ', each.probability)
    print('Probability Score: ', each.probability_score)
    print('Severity:', each.severity)
    print('Severity Score:', each.severity_score)
# Example response:
#
#     Category:  HarmCategory.HARM_CATEGORY_HATE_SPEECH
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  2.547714e-05
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None
#
#     Category:  HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  3.6103818e-06
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None
#
#     Category:  HarmCategory.HARM_CATEGORY_HARASSMENT
#     Is Blocked: True
#     Probability:  HarmProbability.MEDIUM
#     Probability Score:  0.71599233
#     Severity: HarmSeverity.HARM_SEVERITY_MEDIUM
#     Severity Score: 0.30782545
#
#     Category:  HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT
#     Is Blocked: False
#     Probability:  HarmProbability.NEGLIGIBLE
#     Probability Score:  1.5624657e-05
#     Severity: HarmSeverity.HARM_SEVERITY_NEGLIGIBLE
#     Severity Score: None

REST

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

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

  • LOCATION: リクエストを処理するリージョン。使用できる選択肢は以下のとおりです。

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

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: 実際のプロジェクト ID
  • MODEL_ID: 使用するマルチモーダル モデルのモデル ID。例: gemini-2.5-flash
  • ROLE: コンテンツに関連付けられた会話におけるロール。単一ターンのユースケースでも、ロールの指定が必要です。指定できる値は以下のとおりです。
    • USER: 送信するコンテンツを指定します。
    • MODEL: モデルの回答を指定します。
  • TEXT: プロンプトに含める指示のテキスト。
  • SAFETY_CATEGORY: しきい値を構成する安全性カテゴリ。指定できる値は以下のとおりです。

    クリックして安全性カテゴリを開く

    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_DANGEROUS_CONTENT
  • THRESHOLD: 確率に基づいて、指定された安全性カテゴリに属する可能性のあるレスポンスをブロックするためのしきい値。指定できる値は以下のとおりです。

    クリックしてブロックしきい値を開く

    • BLOCK_NONE
    • BLOCK_ONLY_HIGH
    • BLOCK_MEDIUM_AND_ABOVE(デフォルト)
    • BLOCK_LOW_AND_ABOVE
    BLOCK_LOW_AND_ABOVE はブロック対象が最も多く、BLOCK_ONLY_HIGH はブロック対象が最も少なくなります。

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent

リクエストの本文(JSON):

{
  "contents": {
    "role": "ROLE",
    "parts": { "text": "TEXT" }
  },
  "safetySettings": {
    "category": "SAFETY_CATEGORY",
    "threshold": "THRESHOLD"
  },
}

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

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

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/MODEL_ID:streamGenerateContent"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$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/MODEL_ID:streamGenerateContent" | Select-Object -Expand Content

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

curl コマンドの例

LOCATION="us-central1"
MODEL_ID="gemini-2.5-flash"
PROJECT_ID="test-project"

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent -d \
$'{
  "contents": {
    "role": "user",
    "parts": { "text": "Hello!" }
  },
  "safety_settings": [
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "threshold": "OFF"
    },
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "threshold": "BLOCK_LOW_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_ONLY_HIGH"
    }
  ]
}'

引用フィルタ

Vertex AI の生成コード機能は、オリジナルのコンテンツを生成することを目的としています。Gemini は、既存のコンテンツが長く複製される可能性を抑えるように設計されています。Gemini の機能がウェブページから長い引用をしている場合は、そのページを引用します。

同じコンテンツが複数のウェブページで見つかった場合、Gemini は、人気のあるソースを示すよう試みます。コード リポジトリを引用する場合は、該当するオープンソース ライセンスへの参照も追加されることがあります。ライセンス要件は、お客様ご自身の責任で遵守していただく必要があります。

引用フィルタのメタデータについては、Citation API リファレンスをご覧ください。

ベスト プラクティス

コンテンツ フィルタは安全でないコンテンツをブロックするうえで役立ちますが、無害なコンテンツがブロックされることや、有害なコンテンツがブロックされないことがあります。Gemini 2.5 Flash などの高度なモデルは、フィルタなしでも安全な回答を生成するように設計されています。さまざまなフィルタ設定をテストして、安全性と適切なコンテンツの許可のバランスを保ってください。

次のステップ