Los modelos de Gemini están diseñados para priorizar la seguridad. Sin embargo, aún pueden generar respuestas dañinas, en especial cuando se les solicita de forma explícita. Para mejorar aún más la seguridad y minimizar el uso inadecuado, puedes configurar filtros de seguridad para bloquear respuestas potencialmente dañinas.
Se proporcionan dos capas de protección de seguridad:
Protecciones principales integradas:
- Todos los modelos de Gemini incluyen protecciones integradas contra daños graves (como explotación infantil, ciberataques y armas peligrosas).
- Estas protecciones están siempre activas, se aplican automáticamente a todas las instrucciones y respuestas, y no se pueden modificar ni inhabilitar.
Filtros de seguridad configurables:
- La Gemini API proporciona filtros de seguridad configurables adicionales que defines con la configuración de seguridad de tu app.
- Estos parámetros de configuración te permiten controlar el umbral en el que se bloquea el contenido en cuatro categorías de daño principales: Hostigamiento, Incitación al odio o a la violencia, Contenido sexual explícito y Contenido peligroso.
Conceptos de seguridad importantes
Cuando trabajes con la seguridad de los modelos de Gemini, estos son algunos conceptos importantes que debes comprender:
Configuración de seguridad: Es la configuración que defines en el código de tu app y que especifica qué categorías de daño se deben supervisar y en qué umbral se debe bloquear el contenido.
Filtros de seguridad: Son los clasificadores del servidor que evalúan las instrucciones y las respuestas del modelo en función de las dimensiones de seguridad de Google. Los filtros bloquean el contenido según la configuración de seguridad que establezcas.
Calificaciones de seguridad: Son los metadatos de evaluación que devuelve el modelo en el objeto de respuesta. Las calificaciones indican la probabilidad y la gravedad del daño potencial detectado para cada categoría de daño.
Modelos compatibles
gemini-4-argongemini-3.8-flash(y los modelos anterioresgemini-3.7-flash,gemini-3.6-flashygemini-3.5-flash)gemini-3.5-flash-lite(y la versión anteriorgemini-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)
El modelo gemini-3.1-pro-preview, así como los modelos Gemini 2.5 de uso general y de generación de imágenes (que están obsoletos), también admiten esta capacidad.
Configura los parámetros de seguridad en tu app
|
Haz clic en tu proveedor de Gemini API para ver el contenido y el código específicos del proveedor en esta página. |
La configuración de seguridad se establece como parte de la inicialización de una instancia de
GenerativeModel. La configuración se mantiene durante el ciclo de vida de esa instancia del
modelo.
Obtén información sobre las categorías de daño disponibles y los umbrales que puedes establecer para cada categoría más adelante en esta página.
Swift
Configura
SafetySetting
cuando crees una instancia de 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
Configura
SafetySetting
cuando crees una instancia de 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
Configura
SafetySetting
cuando crees una instancia de 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
Configura
SafetySetting
cuando crees una instancia de 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
Configura
SafetySetting
cuando crees una instancia de 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
Configura
SafetySetting
cuando crees una instancia de 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
);
// ...
Categorías de daño disponibles
Los filtros de seguridad evalúan las instrucciones y las respuestas del modelo en función de las siguientes categorías de daño configurables:
| Categoría de daño | Descripción |
|---|---|
HARM_CATEGORY_HARASSMENT |
Comentarios negativos, amenazantes, intimidantes, de bullying o abusivos dirigidos a una persona o identidad. |
HARM_CATEGORY_HATE_SPEECH |
Contenido que ataque, degrade, fomente el odio o incite a la violencia contra personas o grupos en función de atributos protegidos (como raza, origen étnico, religión, discapacidad, edad, nacionalidad, condición de veterano, orientación sexual o identidad de género) |
HARM_CATEGORY_SEXUALLY_EXPLICIT |
Incluye referencias a actos sexuales, pornografía o cualquier otro contenido obsceno y erótico. |
HARM_CATEGORY_DANGEROUS_CONTENT |
Promueve, facilita, fomenta o proporciona instrucciones para actos dañinos, bienes y servicios ilegales, armas, autolesiones o actividades peligrosas. |
HARM_CATEGORY_CIVIC_INTEGRITY |
Contenido que podría usarse para engañar a los votantes o socavar los procesos cívicos y electorales (compatible con modelos y regiones seleccionados). |
Filtros de seguridad no configurables
Además de las categorías configurables, todas las solicitudes pasan por filtros a nivel del sistema que no se pueden ajustar:
Material de abuso sexual infantil (CSAM) / contenido prohibido: Las instrucciones o respuestas marcadas por contenido prohibido se bloquean de inmediato (
PROHIBITED_CONTENT).Información de identificación personal sensible (IIPS): Se bloquean las respuestas que corren el riesgo de exponer datos personales sensibles (como números de cuentas financieras o IDs nacionales) (
SPII).
Establece umbrales
Para cada categoría de daño que quieras controlar en tu app, debes establecer un umbral. Si el contenido evaluado cumple o supera ese umbral, se bloquea.
Cómo funciona la evaluación de seguridad: Probabilidad vs. gravedad
Los filtros de seguridad evalúan el contenido en dos dimensiones distintas:
Probabilidad: Es la confianza del modelo de que el contenido se encuentra dentro de una categoría de daño determinada.
Gravedad: Es la magnitud o el grado de daño potencial en caso de que el contenido sea dañino.
A cada dimensión se le asigna uno de estos niveles:
NEGLIGIBLE, LOW, MEDIUM o HIGH.
El contenido puede tener una probabilidad alta con un nivel de gravedad bajo (por ejemplo, bromas cómicas leves o insultos amistosos) o probabilidad baja con un nivel de gravedad alto (por ejemplo, debates médicos o históricos que mencionen violencia).
Umbrales de bloqueo de daño disponibles
Puedes establecer cualquiera de los siguientes umbrales para las categorías de daño que quieres controlar en tu app:
| Umbral | Descripción | Niveles permitidos |
|---|---|---|
BLOCK_LOW_AND_ABOVE |
Más restrictivo. Bloquea el contenido cuando la probabilidad (o gravedad) es LOW, MEDIUM o HIGH.
|
Solo permite
NEGLIGIBLE
|
BLOCK_MEDIUM_AND_ABOVE |
Restricción moderada. Bloquea el contenido cuando la probabilidad (o gravedad) es MEDIUM o HIGH.
|
Permite
NEGLIGIBLE y LOW |
BLOCK_ONLY_HIGH |
Es el filtro activo menos restrictivo. Bloquea el contenido solo cuando la probabilidad (o gravedad) es HIGH.
|
Permite
NEGLIGIBLE, LOW y MEDIUM
|
BLOCK_NONE |
El bloqueo de respuestas automáticas está inhabilitado para esta categoría. Los metadatos de las calificaciones de seguridad se siguen calculando y devolviendo con la respuesta para que tu app pueda realizar una moderación personalizada. | Se permite todo el contenido |
OFF |
Desactiva por completo el filtro de seguridad para esta categoría. No se produce ningún bloqueo automático ni se devuelven metadatos de clasificación de seguridad. | Se permite todo el contenido |
Inspecciona las clasificaciones de seguridad y controla el contenido bloqueado
El contenido se puede bloquear en dos etapas durante una solicitud:
Instrucción bloqueada (
PromptFeedback): La instrucción de entrada infringió los filtros de seguridad antes de que el modelo generara cualquier resultado. No se devuelven candidatos de respuesta.Candidato de respuesta bloqueado (
finishReason == SAFETY): El modelo evaluó o generó una respuesta candidata que superó el umbral configurado. El texto candidato generado se borra o se oculta.
El objeto SafetyRating
Cada instrucción o respuesta candidata evaluada contiene un array de objetos SafetyRating. Cada calificación proporciona lo siguiente:
Propiedades disponibles con Gemini Developer API y Agent Platform Gemini API (formerly Vertex AI):
category: Es elHarmCategoryevaluado.probability: Es una calificación discreta (NEGLIGIBLE,LOW,MEDIUMoHIGH).blocked: Estruesi esta calificación específica provocó que se bloqueara el contenido.
Propiedades adicionales disponibles con Agent Platform Gemini API (formerly Vertex AI):
probabilityScore: Es una puntuación de confianza de punto flotante de0.0a1.0.severity: Es un nivel de gravedad discreto (NEGLIGIBLE,LOW,MEDIUMoHIGH).severityScore: Es una puntuación de gravedad de punto flotante de0.0a1.0.
Ejemplo de objeto SafetyRating
En el siguiente ejemplo, se ilustra la carga útil de la respuesta JSON sin procesar cuando los filtros de seguridad bloquean un candidato:
{
"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
}
}
Detecta errores de seguridad en el código
Cuando se bloquea el contenido, los SDKs de cliente muestran el bloqueo como una excepción o un código de error para que tu app pueda controlarlo de forma correcta.
Swift
Puedes detectar GenerateContentError.promptBlocked o
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
Puedes detectar PromptBlockedException o inspeccionar 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
Puedes detectar PromptBlockedException o inspeccionar 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
Puedes inspeccionar promptFeedback y 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
Puedes inspeccionar promptFeedback y 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
Puedes inspeccionar PromptFeedback y 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}");
}
Prácticas recomendadas para el diseño responsable de apps
Defensa en profundidad: Los filtros de seguridad son una protección, no una instrucción. Combina la configuración de seguridad con instrucciones del sistema explícitas y un diseño de instrucciones específico para guiar el tono y el alcance.
Comentarios de los usuarios de forma correcta: Nunca se debe producir una falla ni mostrar una pantalla en blanco cuando se bloquea el contenido. Detecta
finishReason == SAFETYoPromptBlockedExceptiony muestra un mensaje amigable que informe al usuario que la solicitud no se pudo completar según tus lineamientos del contenido.Usa
BLOCK_NONEpara la moderación personalizada: Si ya tienes tu propia canalización de moderación del cliente o del servidor, establece los umbrales enBLOCK_NONEpara recibir elsafetyRatingsdel modelo sin bloqueo automatizado, lo que permite que tu app aplique políticas de moderación personalizadas.Revisa las Condiciones del Servicio: Si usas parámetros de configuración menos restrictivos (
BLOCK_ONLY_HIGHoBLOCK_NONE), asegúrate de que tu app siga cumpliendo con la Política de Uso Prohibido de Google.
Otras opciones para controlar la generación de contenido
- Obtén más información sobre el diseño de instrucciones para que puedas influir en el modelo para que genere un resultado específico para tus necesidades.
- Configura los parámetros del modelo para controlar cómo el modelo genera una respuesta, como la cantidad máxima de tokens de salida, la probabilidad de que se repitan los tokens de salida, etcétera.
- Establecer instrucciones del sistema para dirigir el comportamiento del modelo Esta función es como un preámbulo que agregas antes de que el modelo se exponga a otras instrucciones del usuario final.
- Pasa un esquema de respuesta junto con la instrucción para especificar un esquema de salida específico. Esta función se usa con mayor frecuencia cuando se genera un resultado JSON, pero también se puede usar para tareas de clasificación (como cuando quieres que el modelo use etiquetas específicas).