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

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

このページでは、Gemini テキスト生成モデルの安全フィルタについて説明します。 他の Google モデルの安全フィルタと責任ある AI については、次のドキュメントをご覧ください。

このページでは、安全フィルタとコンテンツ フィルタのタイプ、安全性に関する重要なコンセプトについて説明し、構成可能なコンテンツ フィルタのブロックしきい値を構成する方法を示します。構成可能なコンテンツ フィルタのプログラミング方法を示す 例も用意されています

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

安全でないプロンプト

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

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

詳細については、BlockedReason API リファレンスをご覧ください。

次に、プロンプト フィードバックに対する Gemini Enterprise Agent Platform の Gemini API の出力例を示します。 プロンプトがブロックされた場合、promptFeedbackblockReason が含まれます。プロンプトがブロックされていない場合、次の例のように promptFeedback は空になります。

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

次の例は、PROHIBITED_CONTENT を含むためにブロックされたプロンプトを示しています。

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

次の例は、理由が指定されていないためにブロックされたプロンプトを示しています。

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

安全でない回答

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

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

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

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

詳細については、FinishReason API リファレンスをご覧ください。

フィルタがレスポンスをブロックすると、レスポンスの Candidate.content フィールドがクリアされます。モデルにフィードバックは提供されません。

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

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

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

有害カテゴリ

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

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

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

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

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

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

コンテンツ フィルタの構成オプション

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

Gemini Enterprise Agent Platform の Gemini API

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

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

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

Gemini Enterprise Agent Platform の 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 の場合にブロックします。

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

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

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

    Agent Studio に移動

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

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

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

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

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

ブロックされたレスポンスの出力例

危険なコンテンツが含まれているため、構成可能なコンテンツ フィルタによって回答がブロックされた場合、Gemini Enterprise Agent Platform の 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
  }
}

コンテンツ フィルタ構成の実装

次の例は、Gemini Enterprise Agent Platform の 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_ENTERPRISE=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

Go

Go をインストールまたは更新する方法について学びます。

詳しくは、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_ENTERPRISE=True

import (
	"context"
	"fmt"
	"io"

	"google.golang.org/genai"
)

// generateTextWithSafety shows how to apply safety settings to a text generation request.
func generateTextWithSafety(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	systemInstruction := &genai.Content{
		Parts: []*genai.Part{
			{Text: "Be as mean as possible."},
		},
		Role: genai.RoleUser,
	}

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

	safetySettings := []*genai.SafetySetting{
		{Category: genai.HarmCategoryDangerousContent, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategoryHarassment, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategoryHateSpeech, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
		{Category: genai.HarmCategorySexuallyExplicit, Threshold: genai.HarmBlockThresholdBlockLowAndAbove},
	}

	config := &genai.GenerateContentConfig{
		SystemInstruction: systemInstruction,
		SafetySettings:    safetySettings,
	}
	modelName := "gemini-2.5-flash"
	resp, err := client.Models.GenerateContent(ctx, modelName,
		[]*genai.Content{{Parts: []*genai.Part{{Text: prompt}}, Role: genai.RoleUser}},
		config,
	)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	fmt.Fprintln(w, resp.Text())

	if len(resp.Candidates) > 0 {
		fmt.Fprintln(w, "Finish Reason:", resp.Candidates[0].FinishReason)

		for _, rating := range resp.Candidates[0].SafetyRatings {
			fmt.Fprintf(w, "\nCategory: %v\nIs Blocked: %v\nProbability: %v\nProbability Score: %v\nSeverity: %v\nSeverity Score: %v\n",
				rating.Category,
				rating.Blocked,
				rating.Probability,
				rating.ProbabilityScore,
				rating.Severity,
				rating.SeverityScore,
			)
		}
	}

	// Example response:
	// Category: HARM_CATEGORY_HATE_SPEECH
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 8.996795e-06
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.04771039
	//
	// Category: HARM_CATEGORY_DANGEROUS_CONTENT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 2.2431707e-06
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0
	//
	// Category: HARM_CATEGORY_HARASSMENT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 0.00026123362
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.022358216
	//
	// Category: HARM_CATEGORY_SEXUALLY_EXPLICIT
	// Is Blocked: false
	// Probability: NEGLIGIBLE
	// Probability Score: 6.1352006e-07
	// Severity: HARM_SEVERITY_NEGLIGIBLE
	// Severity Score: 0.020111412

	return nil
}

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"
    }
  ]
}'

Node.js

インストール

npm install @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_ENTERPRISE=True

const {GoogleGenAI} = require('@google/genai');

const GOOGLE_CLOUD_PROJECT = process.env.GOOGLE_CLOUD_PROJECT;
const GOOGLE_CLOUD_LOCATION = process.env.GOOGLE_CLOUD_LOCATION || 'global';

async function generateWithSafetySettings(
  projectId = GOOGLE_CLOUD_PROJECT,
  location = GOOGLE_CLOUD_LOCATION
) {
  const client = new GoogleGenAI({
    vertexai: true,
    project: projectId,
    location: location,
  });

  const systemInstruction = 'Be as mean as possible.';

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

  const safetySettings = [
    {
      category: 'HARM_CATEGORY_DANGEROUS_CONTENT',
      threshold: 'BLOCK_LOW_AND_ABOVE',
    },
    {
      category: 'HARM_CATEGORY_HARASSMENT',
      threshold: 'BLOCK_LOW_AND_ABOVE',
    },
    {
      category: 'HARM_CATEGORY_HATE_SPEECH',
      threshold: 'BLOCK_LOW_AND_ABOVE',
    },
    {
      category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
      threshold: 'BLOCK_LOW_AND_ABOVE',
    },
  ];

  const response = await client.models.generateContent({
    model: 'gemini-2.5-flash',
    contents: prompt,
    config: {
      systemInstruction: systemInstruction,
      safetySettings: safetySettings,
    },
  });

  // console.log(response.text);
  // console.log(response.candidates[0].finishMessage);
  //
  // for (const each of response.candidates[0].safetyRatings) {
  //   console.log('\nCategory:', String(each.category));
  //   console.log('Is Blocked:', each.blocked);
  //   console.log('Probability:', each.probability);
  //   console.log('Probability Score:', each.probabilityScore);
  //   console.log('Severity:', each.severity);
  //   console.log('Severity Score:', each.severityScore);
  // }

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

  return response;
}

Java

Java をインストールまたは更新します。

詳しくは、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_ENTERPRISE=True


import com.google.genai.Client;
import com.google.genai.types.Candidate;
import com.google.genai.types.Content;
import com.google.genai.types.GenerateContentConfig;
import com.google.genai.types.GenerateContentResponse;
import com.google.genai.types.HarmBlockThreshold;
import com.google.genai.types.HarmCategory;
import com.google.genai.types.HttpOptions;
import com.google.genai.types.Part;
import com.google.genai.types.SafetySetting;
import java.util.List;
import java.util.stream.Collectors;

public class SafetyWithTxt {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String modelId = "gemini-2.5-flash";
    generateContent(modelId);
  }

  // Shows how to generate content with safety settings.
  public static GenerateContentResponse generateContent(String modelId) {
    // Client Initialization. Once created, it can be reused for multiple requests.
    try (Client client =
        Client.builder()
            .location("global")
            .vertexAI(true)
            .httpOptions(HttpOptions.builder().apiVersion("v1").build())
            .build()) {

      String systemInstruction = "Be as mean as possible.";

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

      // Set safety settings.
      List<HarmCategory.Known> categoriesToBlock =
          List.of(
              HarmCategory.Known.HARM_CATEGORY_DANGEROUS_CONTENT,
              HarmCategory.Known.HARM_CATEGORY_HARASSMENT,
              HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH,
              HarmCategory.Known.HARM_CATEGORY_SEXUALLY_EXPLICIT);

      List<SafetySetting> safetySettings =
          categoriesToBlock.stream()
              .map(
                  category ->
                      SafetySetting.builder()
                          .category(category)
                          .threshold(HarmBlockThreshold.Known.BLOCK_LOW_AND_ABOVE)
                          .build())
                  .collect(Collectors.toList());

      GenerateContentResponse response =
          client.models.generateContent(
              modelId,
              prompt,
              GenerateContentConfig.builder()
                  .systemInstruction(Content.fromParts(Part.fromText(systemInstruction)))
                  .safetySettings(safetySettings)
                  .build());

      // Get response candidate.
      Candidate candidate =
          response
              .candidates()
              .flatMap(candidates -> candidates.stream().findFirst())
              .orElseThrow(
                  () -> new IllegalStateException("No response candidate generated by the model."));

      // Finish Reason will be `SAFETY` if it is blocked.
      System.out.println(candidate.finishReason());
      // Example response:
      // Optional[SAFETY]

      // For details on all the fields in the response.
      candidate
          .safetyRatings()
          .ifPresent(
              safetyRatings ->
                  safetyRatings.forEach(
                      safetyRating -> {
                        System.out.println("\nCategory: " + safetyRating.category());
                        System.out.println("Is Blocked: " + safetyRating.blocked());
                        System.out.println("Probability: " + safetyRating.probability());
                        System.out.println("Probability Score: " + safetyRating.probabilityScore());
                        System.out.println("Severity: " + safetyRating.severity());
                        System.out.println("Severity Score: " + safetyRating.severityScore());
                      }));
      // Example response:
      // Category: Optional[HARM_CATEGORY_HATE_SPEECH]
      // Is Blocked: Optional.empty
      // Probability: Optional[NEGLIGIBLE]
      // Probability Score: Optional[1.9967922E-5]
      // Severity: Optional[HARM_SEVERITY_NEGLIGIBLE]
      // Severity Score: Optional[0.05732864]
      //
      // Category: Optional[HARM_CATEGORY_DANGEROUS_CONTENT]
      // Is Blocked: Optional.empty
      // Probability: Optional[NEGLIGIBLE]
      // Probability Score: Optional[2.9124324E-6]
      // Severity: Optional[HARM_SEVERITY_NEGLIGIBLE]
      // Severity Score: Optional[0.04544826]
      //
      // Category: Optional[HARM_CATEGORY_HARASSMENT]
      // Is Blocked: Optional[true]
      // Probability: Optional[MEDIUM]
      // Probability Score: Optional[0.4593908]
      // Severity: Optional[HARM_SEVERITY_MEDIUM]
      // Severity Score: Optional[0.22082388]
      //
      // Category: Optional[HARM_CATEGORY_SEXUALLY_EXPLICIT]
      // Is Blocked: Optional.empty
      // Probability: Optional[NEGLIGIBLE]
      // Probability Score: Optional[6.453211E-8]
      // Severity: Optional[HARM_SEVERITY_NEGLIGIBLE]
      // Severity Score: Optional[0.023201048]
      return response;
    }
  }
}

ジェイルブレイク分類器

一部のプロンプトは、安全に関するガイドライン、倫理的制約、意図された運用手順を回避しようとし、有害であるか、バイアスがかかっているか、不適切な出力につながる可能性があります。ジェイルブレイク分類器は、モデルの防御を回避しようとするプロンプトを検出し、構成に応じてブロックします。このフィルタはデフォルトでオフになっています。有効にするには、JAILBREAK のブロックしきい値を次のいずれかの値に設定します。

  • BLOCK_NONE
  • BLOCK_LOW_AND_ABOVE
  • BLOCK_MEDIUM_AND_ABOVE
  • BLOCK_ONLY_HIGH

次のコードは、このジェイルブレイク フィルタを有効にする方法を示しています。

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

コンテンツがジェイルブレイク分類器によってブロックされた場合、次のような結果が返されます。

{
  prompt_feedback: {
    block_reason: JAILBREAK
    safety_ratings: [
      {
        category: HARM_CATEGORY_JAILBREAK
        blocked: true
        severity: HARM_SEVERITY_MEDIUM
        severity_score: 0.76953125
      }
    ]
  }
}

HarmBlockMethodPROBABILITY に設定すると、safety_ratings には severityseverity_score ではなく、probabilityprobability_score が含まれます。プロンプトがブロックされていない場合やフラグ設定されていない場合でも、モデルは HarmBlockMethod に応じて安全性の評価を返します。

課金

他の Gemini 安全フィルタと同様に、ジェイルブレイク分類器の使用は無料です。

引用フィルタ

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

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

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

ベスト プラクティス

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

次のステップ