Gemini モデルは、安全性を重視して設計されています。ただし、プロンプトに露骨な表現が含まれていると、有害な回答を生成する可能性があります。安全性をさらに強化し、不正使用を最小限に抑えるには、有害な可能性のある回答をブロックするように安全フィルタを構成します。
2 つのレイヤの安全保護が提供されます。
組み込みのコア保護機能:
- すべての Gemini モデルには、重大な危害(児童の搾取、サイバー攻撃、危険な武器など)に対する組み込みの保護機能が備わっています。
- これらの保護は常に有効で、すべてのプロンプトとレスポンスに自動的に適用されます。変更や無効化はできません。
構成可能な安全フィルタ:
- Gemini API には、アプリの安全性設定を使用して定義する、構成可能な安全性フィルタが追加されています。
- これらの設定を使用すると、4 つの主要な有害カテゴリ(ハラスメント、ヘイトスピーチ、性的描写が露骨なコンテンツ、危険なコンテンツ)でコンテンツがブロックされるしきい値を制御できます。
安全性に関する重要なコンセプト
Gemini モデルの安全性に関する重要なコンセプトは次のとおりです。
安全に関する設定: アプリコードで定義する構成。モニタリングする有害カテゴリと、コンテンツをブロックするしきい値を指定します。
安全フィルタ: Google の安全性のディメンションに照らしてプロンプトとモデルの回答を評価するサーバーサイドの分類器。フィルタは、構成された安全設定に基づいてコンテンツをブロックします。
安全性評価: レスポンス オブジェクトでモデルから返される評価メタデータ。評価は、有害カテゴリごとに検出された潜在的な有害性の確率と重大度を示します。
サポートされているモデル
gemini-4-argongemini-3.8-flash(および以前のgemini-3.7-flash、gemini-3.6-flash、gemini-3.5-flash)gemini-3.5-flash-lite(および以前のgemini-3.1-flash-lite)gemini-nano-banana-2.1(Nano Banana 2.1)gemini-3.1-flash-image(Nano Banana 2)gemini-3.1-flash-lite-image(Nano Banana 2 Lite)gemini-3-pro-image(Nano Banana Pro)
gemini-3.1-pro-preview モデルと、一般用途および画像生成用の Gemini 2.5 モデル(非推奨)も、この機能をサポートしています。
アプリで安全に関する設定を構成する
|
プロバイダGemini APIをクリックして、このページでプロバイダ固有の コンテンツとコードを表示します。 |
安全性設定は、GenerativeModel インスタンスの初期化の一環として構成します。この構成は、そのモデル インスタンスの存続期間中維持されます。
このページでは、利用可能な有害コンテンツのカテゴリと、各カテゴリに設定できるしきい値について説明します。
Swift
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
import FirebaseAILogic
let safetySettings = [
SafetySetting(harmCategory: .harassment, threshold: .blockOnlyHigh),
SafetySetting(harmCategory: .hateSpeech, threshold: .blockMediumAndAbove)
]
// Specify the safety settings as part of creating the `GenerativeModel` instance.
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
modelName: "GEMINI_MODEL_NAME",
safetySettings: safetySettings
)
// ...
Kotlin
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
// ...
val safetySettings = listOf(
SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.ONLY_HIGH),
SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.MEDIUM_AND_ABOVE)
)
// Specify the safety settings as part of creating the `GenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "GEMINI_MODEL_NAME",
safetySettings = safetySettings
)
// ...
Java
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
// ...
List safetySettings = List.of(
new SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.ONLY_HIGH),
new SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.MEDIUM_AND_ABOVE)
);
// Specify the safety settings as part of creating the `GenerativeModel` instance.
GenerativeModelFutures model = GenerativeModelFutures.from(
FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel(
/* modelName */ "GEMINI_MODEL_NAME",
/* generationConfig is optional */ null,
safetySettings
)
);
// ...
Web
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
import { HarmBlockThreshold, HarmCategory, getAI, getGenerativeModel, GoogleAIBackend } from "firebase/ai";
// ...
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
const safetySettings = [
{
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
{
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
];
// Specify the safety settings as part of creating the `GenerativeModel` instance.
const model = getGenerativeModel(ai, {
model: "GEMINI_MODEL_NAME",
safetySettings,
});
// ...
Dart
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
import 'package:firebase_ai/firebase_ai.dart';
final safetySettings = [
SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.medium),
];
// Specify the safety settings as part of creating the `GenerativeModel` instance.
final model = FirebaseAI.googleAI().generativeModel(
model: 'GEMINI_MODEL_NAME',
safetySettings: safetySettings,
);
// ...
Unity
GenerativeModel インスタンスの作成時に SafetySetting を構成します。
// ...
var safetySettings = new SafetySetting[] {
new SafetySetting(HarmCategory.Harassment, SafetySetting.HarmBlockThreshold.OnlyHigh),
new SafetySetting(HarmCategory.HateSpeech, SafetySetting.HarmBlockThreshold.MediumAndAbove)
};
// Specify the safety settings as part of creating the `GenerativeModel` instance.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
var model = ai.GetGenerativeModel(
modelName: "GEMINI_MODEL_NAME",
safetySettings: safetySettings
);
// ...
利用可能な有害カテゴリ
安全フィルタは、次の構成可能な有害カテゴリに照らしてプロンプトとモデルの回答を評価します。
| 有害カテゴリ | 説明 |
|---|---|
HARM_CATEGORY_HARASSMENT |
個人またはアイデンティティをターゲットにした、否定的、脅迫的、威圧的、いじめ、虐待的なコメント。 |
HARM_CATEGORY_HATE_SPEECH |
保護対象の属性(人種、民族、宗教、障がい、年齢、国籍、従軍経験、性的指向、性同一性など)に基づいて、個人または集団を攻撃、侮辱、憎悪を助長、または暴力を扇動するコンテンツ。 |
HARM_CATEGORY_SEXUALLY_EXPLICIT |
性行為、ポルノ、その他のわいせつなコンテンツやエロティックなコンテンツに関する情報が含まれる。 |
HARM_CATEGORY_DANGEROUS_CONTENT |
有害な行為、違法な商品やサービス、武器、自傷行為、危険な行為を助長、促進、奨励、またはそれらの方法を提示している。 |
HARM_CATEGORY_CIVIC_INTEGRITY |
有権者を誤解させたり、市民活動や選挙プロセスを妨害したりするために使用される可能性のあるコンテンツ。(一部のモデルと地域でサポートされています)。 |
構成不可の安全フィルタ
構成可能なカテゴリに加えて、すべてのリクエストは、調整できないシステムレベルのフィルタを通過します。
児童性的虐待のコンテンツ(CSAM)/ 禁止コンテンツ: 禁止コンテンツとしてフラグが付けられたプロンプトまたはレスポンスは、直ちにブロックされます(
PROHIBITED_CONTENT)。個人を特定できる機密情報(SPII): 機密性の高い個人データ(金融口座番号や国民 ID など)を漏洩するリスクがある回答はブロックされます(
SPII)。
しきい値を設定する
アプリで管理する有害コンテンツのカテゴリごとに、しきい値を設定する必要があります。評価されたコンテンツがそのしきい値に達するか、それを超えると、コンテンツはブロックされます。
安全性評価の仕組み: 確率と重大度
安全フィルタは、次の 2 つの異なるディメンションでコンテンツを評価します。
確率: コンテンツが特定の有害カテゴリに該当するというモデルの信頼度。
重大度: コンテンツが有害である場合に、潜在的な危害の大きさまたは程度。
各ディメンションには、NEGLIGIBLE、LOW、MEDIUM、HIGH のいずれかのレベルが割り当てられます。
コンテンツには、確率が高く、重大度レベルが低い(例: 軽度のコメディ的な冗談や親しみのある侮辱)や、確率が低く、重大度レベルが高い(例: 暴力に言及する医学的または歴史的な議論)があります。
利用可能な有害なコンテンツのブロックしきい値
アプリで管理する有害コンテンツのカテゴリに、次のいずれかのしきい値を設定できます。
| しきい値 | 説明 | 許可されるレベル |
|---|---|---|
BLOCK_LOW_AND_ABOVE |
最も厳しい。 確率(または重大度)が LOW、MEDIUM、または HIGH の場合にコンテンツをブロックします。
|
NEGLIGIBLE のみ許可 |
BLOCK_MEDIUM_AND_ABOVE |
中程度の制限。 確率(または重大度)が MEDIUM または HIGH の場合にコンテンツをブロックします。
|
NEGLIGIBLE と LOW を許可します。 |
BLOCK_ONLY_HIGH |
最も制限の少ないアクティブなフィルタ。 確率(または重大度)が HIGH の場合にのみコンテンツをブロックします。
|
NEGLIGIBLE、LOW、MEDIUM を許可します。 |
BLOCK_NONE |
このカテゴリでは、自動応答のブロックが無効になっています。安全性評価のメタデータは引き続き計算され、レスポンスとともに返されるため、アプリはカスタム モデレーションを実行できます。 | すべてのコンテンツが許可されています |
OFF |
このカテゴリの安全フィルタを完全にオフにします。自動ブロックは行われず、安全性評価メタデータは返されません。 | すべてのコンテンツが許可されています |
安全性評価を確認してブロックされたコンテンツを処理する
コンテンツは、リクエスト中の 2 つの段階でブロックされる可能性があります。
プロンプトがブロックされました(
PromptFeedback): モデルが出力を生成する前に、入力プロンプトが安全フィルタに違反しました。レスポンス候補は返されません。レスポンス候補がブロックされました(
finishReason == SAFETY): モデルが、構成されたしきい値を超える候補レスポンスを評価または生成しました。生成された候補テキストが消去または削除されます。
SafetyRating オブジェクト
評価されたプロンプトまたはレスポンス候補には、SafetyRating オブジェクトの配列が含まれています。各レーティングは、次の情報を提供します。
Gemini Developer API と Agent Platform Gemini API (formerly Vertex AI) の両方で使用できるプロパティ:
category: 評価されたHarmCategory。probability: 離散評価(NEGLIGIBLE、LOW、MEDIUM、HIGH)。blocked: この特定の評価によってコンテンツがブロックされた場合はtrue。
Agent Platform Gemini API (formerly Vertex AI) で使用できる追加のプロパティ:
probabilityScore:0.0~1.0の浮動小数点信頼スコア。severity: 個別の重大度レベル(NEGLIGIBLE、LOW、MEDIUM、HIGH)。severityScore:0.0~1.0の浮動小数点数の重大度スコア。
SafetyRating オブジェクトの例
次の例は、候補が安全フィルタによってブロックされた場合の未加工の JSON レスポンス ペイロードを示しています。
{
"candidates": [
{
"finishReason": "SAFETY",
"safetyRatings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"probability": "HIGH",
"blocked": true
}
]
}
],
"usageMetadata": {
"promptTokenCount": 24,
"totalTokenCount": 24
}
}
コード内の安全性のエラーをキャッチする
コンテンツがブロックされると、クライアント SDK はブロックを例外またはエラーコードとして表示し、アプリが適切に処理できるようにします。
Swift
GenerateContentError.promptBlocked または GenerateContentError.responseStoppedEarly をキャッチできます。
do {
let response = try await model.generateContent("Your prompt here")
print(response.text ?? "No text generated.")
} catch GenerateContentError.promptBlocked(let response) {
// The input prompt was blocked
if let feedback = response.promptFeedback {
let reason = feedback.blockReason?.rawValue ?? "unknown"
print("Prompt blocked for reason: \(reason)")
for rating in feedback.safetyRatings {
let cat = rating.category.rawValue
let prob = rating.probability.rawValue
print("Category: \(cat), probability: \(prob)")
}
}
} catch GenerateContentError.responseStoppedEarly(let reason, let response) {
// Candidate response was blocked or stopped early
if reason == .safety {
print("Response blocked due to safety.")
if let candidate = response.candidates.first {
for rating in candidate.safetyRatings where rating.blocked {
print("Blocked by category: \(rating.category.rawValue)")
}
}
}
} catch {
print("Unexpected error: \(error)")
}
Kotlin
PromptBlockedException をキャッチするか、candidate.finishReason を検査できます。
try {
val response = model.generateContent("Your prompt here")
val candidate = response.candidates.firstOrNull()
if (candidate?.finishReason == FinishReason.SAFETY) {
val blockedRating =
candidate.safetyRatings.firstOrNull { it.blocked }
println("Response blocked by category: ${blockedRating?.category}")
} else {
println(response.text)
}
} catch (e: PromptBlockedException) {
val reason = e.response?.promptFeedback?.blockReason
println("Prompt was blocked: $reason")
} catch (e: Exception) {
println("Error generating content: ${e.message}")
}
Java
PromptBlockedException をキャッチするか、candidate.getFinishReason() を検査できます。
try {
GenerateContentResponse response = model.generateContent("Your prompt here").get();
Candidate candidate = response.getCandidates().isEmpty() ? null : response.getCandidates().get(0);
if (candidate != null && candidate.getFinishReason() == FinishReason.SAFETY) {
SafetyRating blockedRating = null;
for (SafetyRating rating : candidate.getSafetyRatings()) {
if (Boolean.TRUE.equals(rating.getBlocked())) {
blockedRating = rating;
break;
}
}
System.out.println("Response blocked by category: " +
(blockedRating != null ? blockedRating.getCategory() : "unknown"));
} else {
System.out.println(response.getText());
}
} catch (ExecutionException e) {
if (e.getCause() instanceof PromptBlockedException) {
PromptBlockedException pbe = (PromptBlockedException) e.getCause();
GenerateContentResponse blockedResponse = pbe.getResponse();
String reason = (blockedResponse != null && blockedResponse.getPromptFeedback() != null)
? String.valueOf(blockedResponse.getPromptFeedback().getBlockReason())
: "unknown";
System.out.println("Prompt was blocked: " + reason);
} else {
System.out.println("Error generating content: " + e.getMessage());
}
} catch (InterruptedException e) {
System.out.println("Generation was interrupted: " + e.getMessage());
}
Web
promptFeedback と candidate.finishReason を検査できます。
try {
const response = await model.generateContent("Your prompt here");
// Check if the prompt was blocked
if (response.promptFeedback?.blockReason) {
console.warn(`Prompt blocked: ${response.promptFeedback.blockReason}`);
return;
}
const candidate = response.candidates?.[0];
if (candidate?.finishReason === "SAFETY") {
const blockedRating = candidate.safetyRatings?.find((r) => r.blocked);
console.warn(`Response blocked by category: ${blockedRating?.category}`);
} else {
console.log(response.text);
}
} catch (error) {
console.error("Error generating content:", error);
}
Dart
promptFeedback と candidate.finishReason を検査できます。
try {
final response = await model.generateContent([Content.text('Your prompt here')]);
// Check if the prompt was blocked
if (response.promptFeedback?.blockReason != null) {
print('Prompt blocked: ${response.promptFeedback?.blockReason}');
return;
}
final candidate = response.candidates.firstOrNull;
if (candidate?.finishReason == FinishReason.safety) {
final blockedRating =
candidate?.safetyRatings?.where((r) => r.isBlocked == true).firstOrNull;
print('Response blocked by category: ${blockedRating?.category.name}');
} else {
print(response.text);
}
} catch (e) {
print('Error generating content: $e');
}
Unity
PromptFeedback と candidate.FinishReason を検査できます。
try {
var response = await model.GenerateContentAsync("Your prompt here");
// Check if the prompt was blocked
if (response.PromptFeedback?.BlockReason != null) {
Debug.LogWarning($"Prompt blocked: {response.PromptFeedback.BlockReason}");
return;
}
var candidate = response.Candidates.FirstOrDefault();
if (candidate?.FinishReason == FinishReason.Safety) {
var blockedRating = candidate.SafetyRatings?.FirstOrDefault(r => r.Blocked);
Debug.LogWarning($"Response blocked by category: {blockedRating?.Category}");
} else {
Debug.Log(response.Text);
}
} catch (Exception ex) {
Debug.LogError($"Error generating content: {ex.Message}");
}
責任あるアプリ設計のベスト プラクティス
多層防御: 安全性フィルタはガードレールであり、指示ではありません。安全性設定を、明示的なシステム指示や、トーンとスコープをガイドするターゲットを絞ったプロンプト設計と組み合わせます。
適切なユーザー フィードバック: コンテンツがブロックされたときに、クラッシュしたり、空白の画面を表示したりしないでください。
finishReason == SAFETYまたはPromptBlockedExceptionを検出し、コンテンツ ガイドラインに沿ってリクエストを処理できなかったことをユーザーに通知するわかりやすいメッセージを表示します。カスタム モデレーションに
BLOCK_NONEを使用する: 独自のクライアントサイドまたはサーバーサイドのモデレーション パイプラインがすでにある場合は、しきい値をBLOCK_NONEに設定して、自動ブロックなしでモデルのsafetyRatingsを受信し、アプリでカスタム モデレーション ポリシーを適用できるようにします。利用規約を確認する: 制限の緩い設定(
BLOCK_ONLY_HIGHまたはBLOCK_NONE)を使用する場合は、アプリが Google の生成 AI の使用禁止に関するポリシーに引き続き準拠していることを確認してください。
コンテンツ生成を制御するその他のオプション
- プロンプト設計の詳細を確認して、ニーズに合った出力を生成するようにモデルに指示します。
- モデル パラメータを構成して、モデルがレスポンスを生成する方法(最大出力トークン、出力トークンの繰り返し確率など)を制御します。
- システム指示を設定して、モデルの動作を制御します。この機能は、エンドユーザーからの詳細な指示がモデルに伝達される前に追加するプリアンブルのようなものです。
- プロンプトとともにレスポンス スキーマを渡して、特定の出力スキーマを指定します。この機能は、JSON 出力を生成する際によく使用されますが、分類タスク(モデルに特定のラベルやタグを使用させる場合など)にも使用できます。