Как настроить параметры безопасности

Модели Gemini разработаны с учетом требований безопасности. Однако они все равно могут генерировать вредоносные ответы, особенно если их об этом попросить. Чтобы повысить безопасность и минимизировать злоупотребления, вы можете настроить фильтры безопасности, которые будут блокировать потенциально опасные ответы.

Предусмотрено два уровня защиты:

  • Встроенные средства защиты

    • Все модели Gemini имеют встроенную защиту от серьезных угроз, таких как эксплуатация детей, кибератаки и опасное оружие.
    • Эти средства защиты всегда активны, автоматически применяются ко всем запросам и ответам и не могут быть изменены или отключены.
  • Настраиваемые фильтры безопасности.

    • Gemini API предоставляет дополнительные настраиваемые фильтры безопасности, которые вы задаете в настройках безопасности приложения.
    • Эти настройки позволяют задать пороговое значение, при котором контент будет блокироваться. Оно устанавливается для четырех основных категорий вреда: харассмент, дискриминационные высказывания, откровенно сексуальный контент и опасный контент.

Перейти к примерам кода

Важные принципы безопасности

При работе с безопасностью моделей Gemini важно понимать следующие концепции:

  • Настройки безопасности. Конфигурация, которую вы задаете в коде приложения. Она определяет, какие категории вредоносного контента нужно отслеживать и при каком пороговом значении блокировать контент.

  • Фильтры безопасности. Классификаторы на стороне сервера, которые оценивают запросы и ответы модели на соответствие критериям безопасности Google. Фильтры блокируют контент на основе заданных вами настроек безопасности.

  • Оценки безопасности. Метаданные оценки, возвращаемые моделью в объекте ответа. Оценки указывают на вероятность и серьезность потенциального вреда, обнаруженного для каждой категории вреда.

Поддерживаемые модели

  • gemini-4-argon
  • gemini-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 Полностью отключает фильтр безопасности для этой категории. Автоматическая блокировка не выполняется, и метаданные оценки безопасности не возвращаются. Весь контент разрешен



Как проверить оценки безопасности и обработать заблокированный контент

Контент может быть заблокирован на двух этапах обработки запроса:

  1. Запрос заблокирован (PromptFeedback). Входной запрос нарушил правила безопасности до того, как модель сгенерировала ответ. Варианты ответа не возвращаются.

  2. Вариант ответа заблокирован (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, но ее также можно применять для задач классификации, например когда нужно, чтобы модель использовала определенные метки или теги.