Les modèles Gemini sont conçus en faisant de la sécurité la première des priorités. Toutefois, ils peuvent toujours générer des réponses nuisibles, en particulier lorsqu'ils reçoivent des requêtes explicites en ce sens. Pour renforcer la sécurité et limiter les cas d'utilisation abusive, vous pouvez configurer des filtres de sécurité afin de bloquer les réponses potentiellement nuisibles.
Deux niveaux de protection sont fournis :
Protections de base intégrées :
- Tous les modèles Gemini intègrent des protections contre les préjudices graves (tels que l'exploitation d'enfants, les cyberattaques et les armes dangereuses).
- Ces protections sont toujours actives, appliquées automatiquement à toutes les requêtes et réponses, et ne peuvent pas être modifiées ni désactivées.
Filtres de sécurité configurables :
- Gemini API fournit des filtres de sécurité configurables supplémentaires que vous définissez à l'aide des paramètres de sécurité de votre application.
- Ces paramètres vous permettent de contrôler le seuil à partir duquel le contenu est bloqué dans quatre principales catégories de préjudice : harcèlement, incitation à la haine, contenu à caractère sexuel explicite et contenu dangereux.
Concepts de sécurité importants
Voici quelques concepts importants à comprendre lorsque vous travaillez avec la sécurité des modèles Gemini :
Paramètres de sécurité : configuration que vous définissez dans le code de votre application pour spécifier les catégories de préjudice à surveiller et le seuil à partir duquel bloquer le contenu.
Filtres de sécurité : classificateurs côté serveur qui évaluent les prompts et les réponses du modèle par rapport aux dimensions de sécurité de Google. Les filtres bloquent le contenu en fonction des paramètres de sécurité que vous avez configurés.
Scores de sécurité : métadonnées d'évaluation renvoyées par le modèle dans l'objet de réponse. Les évaluations indiquent la probabilité et la gravité des préjudices potentiels détectés pour chaque catégorie de préjudice.
Modèles compatibles
gemini-4-argongemini-3.8-flash(et les versions plus anciennesgemini-3.7-flash,gemini-3.6-flashetgemini-3.5-flash)gemini-3.5-flash-lite(et l'anciengemini-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)
Le modèle gemini-3.1-pro-preview, ainsi que les modèles Gemini 2.5 à usage général et de génération d'images (qui sont obsolètes), sont également compatibles avec cette fonctionnalité.
Configurer les paramètres de sécurité dans votre application
|
Cliquez sur votre fournisseur Gemini API pour afficher le contenu et le code spécifiques au fournisseur sur cette page. |
Vous configurez les paramètres de sécurité lors de l'initialisation d'une instance GenerativeModel. La configuration est conservée pendant toute la durée de vie de cette instance de modèle.
Découvrez les catégories de préjudice disponibles et les seuils que vous pouvez définir pour chaque catégorie plus loin sur cette page.
Swift
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
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
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
// ...
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
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
// ...
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
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
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
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
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
Configurez SafetySetting lors de la création d'une instance GenerativeModel :
// ...
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
);
// ...
Catégories de préjudice disponibles
Les filtres de sécurité évaluent les prompts et les réponses du modèle par rapport aux catégories de préjudice configurables suivantes :
| Catégorie de préjudice | Description |
|---|---|
HARM_CATEGORY_HARASSMENT |
Commentaires négatifs, menaçants, intimidants ou abusifs ciblant une personne ou une identité. |
HARM_CATEGORY_HATE_SPEECH |
Contenus qui attaquent, dénigrent, incitent à la haine ou à la violence envers des individus ou des groupes en raison de caractéristiques protégées (telles que l'origine ethnique, la religion, le handicap, l'âge, la nationalité, le statut d'ancien combattant, l'orientation sexuelle ou l'identité de genre). |
HARM_CATEGORY_SEXUALLY_EXPLICIT |
Contient des références à des actes sexuels, de la pornographie ou d'autres contenus obscènes et érotiques. |
HARM_CATEGORY_DANGEROUS_CONTENT |
Promeut, facilite, encourage ou fournit des instructions pour des actes dangereux, des biens et services illégaux, des armes, l'automutilation ou des activités dangereuses. |
HARM_CATEGORY_CIVIC_INTEGRITY |
Contenus susceptibles d'être utilisés pour induire les électeurs en erreur ou pour compromettre les processus civiques et électoraux. (Disponible pour certains modèles et dans certaines régions). |
Filtres de sécurité non configurables
En plus des catégories configurables, toutes les requêtes passent par des filtres au niveau du système qui ne peuvent pas être ajustés :
Contenus d'abus sexuels sur mineurs/Contenu interdit : les requêtes ou les réponses signalées pour contenu interdit sont immédiatement bloquées (
PROHIBITED_CONTENT).Informations personnelles sensibles : les réponses susceptibles d'exposer des données à caractère personnel sensibles (comme des numéros de compte financier ou des numéros d'identification nationale) sont bloquées (
SPII).
Définir les seuils
Pour chaque catégorie de préjudice que vous souhaitez contrôler dans votre application, vous devez définir un seuil. Si le contenu évalué atteint ou dépasse ce seuil, il est bloqué.
Fonctionnement de l'évaluation de la sécurité : probabilité et gravité
Les filtres de sécurité évaluent le contenu selon deux dimensions distinctes :
Probabilité : niveau de confiance du modèle quant à l'appartenance du contenu à une catégorie de préjudice donnée.
Gravité : ampleur ou degré du préjudice potentiel si le contenu est nuisible.
Chaque dimension se voit attribuer l'un des niveaux suivants : NEGLIGIBLE, LOW, MEDIUM ou HIGH.
Un contenu peut avoir une probabilité élevée avec un niveau de gravité faible (par exemple, des plaisanteries légères ou des insultes amicales) ou une probabilité faible avec un niveau de gravité élevé (par exemple, des discussions médicales ou historiques mentionnant de la violence).
Seuils de blocage de préjudice disponibles
Vous pouvez définir l'un des seuils suivants pour les catégories de préjudice que vous souhaitez contrôler dans votre application :
| Seuil | Description | Niveaux autorisés |
|---|---|---|
BLOCK_LOW_AND_ABOVE |
La plus restrictive. Bloque le contenu lorsque la probabilité (ou la gravité) est LOW, MEDIUM ou HIGH.
|
Autorise uniquement NEGLIGIBLE
|
BLOCK_MEDIUM_AND_ABOVE |
Restriction modérée. Bloque le contenu lorsque la probabilité (ou la gravité) est MEDIUM ou HIGH.
|
Autorise NEGLIGIBLE et LOW |
BLOCK_ONLY_HIGH |
Filtre actif le moins restrictif. Bloque le contenu uniquement lorsque la probabilité (ou la gravité) est HIGH.
|
Autorise NEGLIGIBLE, LOW et MEDIUM.
|
BLOCK_NONE |
Le blocage des réponses automatiques est désactivé pour cette catégorie. Les métadonnées des évaluations de sécurité sont toujours calculées et renvoyées avec la réponse afin que votre application puisse effectuer une modération personnalisée. | Tous les contenus autorisés |
OFF |
Désactive entièrement le filtre de sécurité pour cette catégorie. Aucun blocage automatique ne se produit et aucune métadonnée d'évaluation de la sécurité n'est renvoyée. | Tous les contenus autorisés |
Inspecter les évaluations de sécurité et gérer le contenu bloqué
Le contenu peut être bloqué à deux étapes d'une requête :
Requête bloquée (
PromptFeedback) : la requête d'entrée a enfreint les filtres de sécurité avant que le modèle ne génère une sortie. Aucune réponse candidate n'est renvoyée.Réponse candidate bloquée (
finishReason == SAFETY) : le modèle a évalué ou généré une réponse candidate qui a dépassé le seuil que vous avez configuré. Le texte candidat généré est effacé ou masqué.
L'objet SafetyRating
Chaque requête ou réponse candidate évaluée contient un tableau d'objets SafetyRating. Chaque classification fournit les informations suivantes :
Propriétés disponibles avec Gemini Developer API et Agent Platform Gemini API (formerly Vertex AI) :
category:HarmCategoryévalué.probability: note discrète (NEGLIGIBLE,LOW,MEDIUMouHIGH).blocked:truesi cette évaluation spécifique a entraîné le blocage du contenu.
Propriétés supplémentaires disponibles avec Agent Platform Gemini API (formerly Vertex AI) :
probabilityScore: score de confiance à virgule flottante compris entre0.0et1.0.severity: niveau de gravité discret (NEGLIGIBLE,LOW,MEDIUMouHIGH).severityScore: score de gravité à virgule flottante compris entre0.0et1.0.
Exemple d'objet SafetyRating
L'exemple suivant illustre la charge utile de réponse JSON brute lorsqu'un candidat est bloqué par des filtres de sécurité :
{
"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
}
}
Détecter les erreurs de sécurité dans le code
Lorsque du contenu est bloqué, les SDK clients affichent le blocage sous la forme d'une exception ou d'un code d'erreur afin que votre application puisse le gérer correctement.
Swift
Vous pouvez intercepter GenerateContentError.promptBlocked ou 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
Vous pouvez intercepter PromptBlockedException ou inspecter 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
Vous pouvez intercepter PromptBlockedException ou inspecter 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
Vous pouvez inspecter promptFeedback et 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
Vous pouvez inspecter promptFeedback et 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
Vous pouvez inspecter PromptFeedback et 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}");
}
Bonnes pratiques pour concevoir des applications de manière responsable
Défense en profondeur : les filtres de sécurité sont des garde-fous, pas des instructions. Combinez les paramètres de sécurité avec des instructions système explicites et une conception de requêtes ciblée pour guider le ton et la portée.
Commentaires utilisateur appropriés : ne plantez jamais et n'affichez pas d'écran vide lorsque le contenu est bloqué. Détectez
finishReason == SAFETYouPromptBlockedExceptionet affichez un message convivial informant l'utilisateur que la requête n'a pas pu être traitée conformément à vos consignes relatives au contenu.Utiliser
BLOCK_NONEpour la modération personnalisée : si vous disposez déjà de votre propre pipeline de modération côté client ou côté serveur, définissez les seuils surBLOCK_NONEpour recevoir lessafetyRatingsdu modèle sans blocage automatisé, ce qui permet à votre application d'appliquer des règles de modération personnalisées.Consultez les conditions d'utilisation : si vous utilisez des paramètres moins restrictifs (
BLOCK_ONLY_HIGHouBLOCK_NONE), assurez-vous que votre application respecte toujours le Règlement sur les utilisations interdites de Google.
Autres options pour contrôler la génération de contenu
- Découvrez comment concevoir des requêtes afin d'influencer le modèle pour qu'il génère des résultats adaptés à vos besoins.
- Configurez les paramètres du modèle pour contrôler la façon dont le modèle génère une réponse, comme le nombre maximal de jetons de sortie, la probabilité de jetons de sortie répétés, etc.
- Définissez des instructions système pour orienter le comportement du modèle. Cette fonctionnalité est semblable à un préambule que vous ajoutez avant que le modèle ne soit exposé à d'autres instructions de l'utilisateur final.
- Transmettez un schéma de réponse avec le prompt pour spécifier un schéma de sortie spécifique. Cette fonctionnalité est le plus souvent utilisée pour générer une sortie JSON, mais elle peut également être utilisée pour des tâches de classification (par exemple, lorsque vous souhaitez que le modèle utilise des étiquettes ou des tags spécifiques).