Модели Gemini разработаны с учетом требований безопасности. Однако они все равно могут генерировать вредоносные ответы, особенно если их об этом попросить. Чтобы повысить безопасность и минимизировать злоупотребления, вы можете настроить фильтры безопасности, которые будут блокировать потенциально опасные ответы.
Предусмотрено два уровня защиты:
Встроенные средства защиты
- Все модели Gemini имеют встроенную защиту от серьезных угроз, таких как эксплуатация детей, кибератаки и опасное оружие.
- Эти средства защиты всегда активны, автоматически применяются ко всем запросам и ответам и не могут быть изменены или отключены.
Настраиваемые фильтры безопасности.
- Gemini API предоставляет дополнительные настраиваемые фильтры безопасности, которые вы задаете в настройках безопасности приложения.
- Эти настройки позволяют задать пороговое значение, при котором контент будет блокироваться. Оно устанавливается для четырех основных категорий вреда: харассмент, дискриминационные высказывания, откровенно сексуальный контент и опасный контент.
Важные принципы безопасности
При работе с безопасностью моделей 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
Настройте SafetySetting при создании экземпляра 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
Настройте SafetySetting при создании экземпляра 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
Настройте SafetySetting при создании экземпляра 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
Настройте SafetySetting при создании экземпляра 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
Настройте SafetySetting при создании экземпляра 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
Настройте SafetySetting при создании экземпляра 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
);
// ...
Доступные категории вреда
Фильтры безопасности оценивают запросы и ответы модели по следующим настраиваемым категориям вреда:
| Категория вреда | Описание |
|---|---|
HARM_CATEGORY_HARASSMENT |
Негативные, угрожающие, запугивающие комментарии, буллинг или оскорбления, направленные на человека или его личность. |
HARM_CATEGORY_HATE_SPEECH |
Контент, который содержит нападки, унижает, пропагандирует ненависть или подстрекает к насилию в отношении отдельных лиц или групп на основании защищенных признаков (таких как раса, этническое происхождение, религия, инвалидность, возраст, национальность, статус ветерана, сексуальная ориентация или гендерная идентичность). |
HARM_CATEGORY_SEXUALLY_EXPLICIT |
Содержит ссылки на половые акты, порнографию или прочий непристойный и эротический контент. |
HARM_CATEGORY_DANGEROUS_CONTENT |
Продвигает, поощряет, облегчает или предоставляет инструкции по совершению вредоносных действий, незаконных товаров и услуг, оружия, самоповреждения или опасных действий. |
HARM_CATEGORY_CIVIC_INTEGRITY |
Контент, который может использоваться для введения избирателей в заблуждение или подрыва гражданских и избирательных процессов. (Поддерживается на некоторых моделях и в некоторых регионах.) |
Ненастраиваемые фильтры безопасности
Помимо настраиваемых категорий, все запросы проходят через системные фильтры, которые нельзя изменить.
Изображение несовершеннолетних в сексуальном контексте/запрещенный контент. Запросы или ответы, помеченные как запрещенный контент, немедленно блокируются (
PROHIBITED_CONTENT).Конфиденциальная информация, позволяющая идентифицировать личность (SPII): Ответы, которые могут раскрыть конфиденциальные персональные данные (например, номера финансовых счетов или национальные удостоверения личности), блокируются (
SPII).
Указать пороговые значения
Для каждой категории вредоносного контента, которую вы хотите контролировать в своем приложении, необходимо установить пороговое значение. Если контент соответствует пороговому значению или превышает его, он блокируется.
Как работает оценка безопасности: вероятность и серьезность
Фильтры безопасности оценивают контент по двум параметрам:
Вероятность. Уверенность модели в том, что контент относится к определенной категории вреда.
Серьезность. Степень потенциального вреда, который может нанести контент.
Каждому параметру присваивается один из следующих уровней: 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 |
Полностью отключает фильтр безопасности для этой категории. Автоматическая блокировка не выполняется, и метаданные оценки безопасности не возвращаются. | Весь контент разрешен |
Как проверить оценки безопасности и обработать заблокированный контент
Контент может быть заблокирован на двух этапах обработки запроса:
Запрос заблокирован (
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), убедитесь, что ваше приложение по-прежнему соответствует Правилам в отношении запрещенного использования.
Другие способы управления генерацией контента
- Подробнее о создании запросов…
- Настройте параметры модели, чтобы управлять тем, как она генерирует ответ, например максимальное количество токенов вывода, вероятность повторения токенов вывода и т. д.
- Задайте системные инструкции, чтобы управлять поведением модели. Эта функция похожа на вводные инструкции, которые вы добавляете до того, как модель получит дальнейшие инструкции от конечного пользователя.
- Передайте схему ответа вместе с запросом, чтобы указать определенную схему вывода. Чаще всего эта функция используется при генерации выходных данных в формате JSON, но ее также можно применять для задач классификации, например когда нужно, чтобы модель использовала определенные метки или теги.