Настройка Safety Settings и фильтрация контента

35 минут Урок 31

Введение: Почему Safety Settings — это фундамент Enterprise-решений

Добро пожаловать в седьмой модуль. Мы уже научились выжимать максимум интеллекта из Gemini 3, использовать мультимодальность и управлять контекстом. Но когда речь заходит о выводе решения в продакшн (Production Deployment), на первый план выходит не столько «насколько умна модель», сколько «насколько она безопасна».

Представьте ситуацию: вы интегрировали чат-бота в банковское приложение. Если он случайно сгенерирует оскорбительный ответ или, галлюцинируя, предложит клиенту незаконную схему ухода от налогов, репутационный ущерб будет колоссальным. В корпоративной среде безопасность генерации (Safety) — это не опция, а требование compliance.

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

Анатомия безопасности: Категории вреда (Harm Categories)

Google обучает свои модели распознавать четыре основные категории потенциально вредоносного контента. Понимание этих категорий критически важно, так как настройки применяются к каждой из них индивидуально.

  • Harassment (Домогательства и травля): Негативные комментарии, направленные на конкретных людей или группы. Сюда входят запугивание, угрозы и унижения.
  • Hate Speech (Разжигание ненависти): Контент, пропагандирующий насилие или дискриминацию по признаку расы, религии, гендера и других защищаемых характеристик.
  • Sexually Explicit (Откровенный контент): Материалы сексуального характера. Важно отметить, что для медицинских приложений этот фильтр может давать ложноположительные срабатывания (например, в статьях по анатомии), и его нужно настраивать аккуратно.
  • Dangerous Content (Опасный контент): Инструкции или поощрение действий, которые могут нанести физический вред людям (создание оружия, самоповреждение, опасные челленджи).

Каждый раз, когда вы отправляете промпт, Gemini оценивает и сам запрос, и потенциальный ответ по этим шкалам.

Пороги блокировки (Block Thresholds): Тонкая настройка

Самая большая ошибка новичков — оставлять настройки по умолчанию, не понимая их логики. Gemini не просто говорит «да» или «нет». Она оценивает вероятность того, что контент небезопасен (Negligible, Low, Medium, High).

Мы управляем порогом, при котором срабатывает блокировка. Вот доступные уровни (Thresholds):

НастройкаЛогика работыСценарий применения
BLOCK_NONEПропускает всё, независимо от вероятности вреда.Внутренние инструменты для модерации контента, исследовательские задачи. Опасно для публичных ботов.
BLOCK_ONLY_HIGHБлокирует только контент с высокой вероятностью нарушения.Творческие приложения, генерация художественных текстов, где нужен «острый» сюжет, но без явной жести.
BLOCK_MEDIUM_AND_ABOVEБлокирует высокую и среднюю вероятность. (Часто является дефолтным значением).Сбалансированные приложения, помощники общего назначения.
BLOCK_LOW_AND_ABOVEБлокирует почти всё, где есть даже малейший намек на риск.Детские приложения, строгие корпоративные системы, государственные сервисы.

python
import google.generativeai as genai
from google.generativeai.types import HarmCategory, HarmBlockThreshold

# Конфигурация API (предполагается, что ключ уже настроен)
# genai.configure(api_key=os.environ["GEMINI_API_KEY"])

# Создаем словарь настроек безопасности
# Мы можем настроить каждую категорию индивидуально
safety_settings = {
    HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, # Строже к хейт-спичу
    HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH, # Мягче к описанию опасностей (например, для детективов)
}

model = genai.GenerativeModel(
    model_name="gemini-1.5-pro", # Или gemini-3.0-pro, если доступна
    safety_settings=safety_settings
)

# Пример запроса, который может вызвать срабатывание фильтров
prompt = "Расскажи историю о том, как злодей планирует захватить мир, используя химическое оружие."

response = model.generate_content(prompt)

print(f"Текст ответа: {response.text if response.parts else 'Ответ заблокирован'}")

Обработка заблокированных ответов

В коде выше вы могли заметить проверку if response.parts. Это критически важный момент. Если Gemini блокирует ответ из-за настроек безопасности, объект response вернется, но response.text может быть пустым или вызвать ошибку при доступе.

Вам необходимо проверять атрибут prompt_feedback и candidates[0].finish_reason.

  • Finish Reason: Если он равен SAFETY, значит, генерация остановлена фильтром.
  • Safety Ratings: Показывает, какая именно категория превысила порог.

Давайте посмотрим, как правильно написать «безопасный» обработчик ответа, который не уронит ваш бэкенд при встрече с токсичным запросом.

python
from google.generativeai.types import FinishReason

def safe_generate(model, prompt):
    try:
        response = model.generate_content(prompt)
        
        # 1. Проверяем, не был ли заблокирован сам промпт (еще до генерации)
        if response.prompt_feedback.block_reason:
            print(f"ПРОМПТ ЗАБЛОКИРОВАН. Причина: {response.prompt_feedback.block_reason}")
            return None
            
        # 2. Проверяем причину завершения генерации
        # Обычно ответ находится в первом кандидате
        candidate = response.candidates[0]
        
        if candidate.finish_reason == FinishReason.SAFETY:
            print("ГЕНЕРАЦИЯ ПРЕРВАНА: Нарушение Safety Settings")
            # Детализируем, что именно пошло не так
            for rating in candidate.safety_ratings:
                print(f"  {rating.category.name}: {rating.probability.name}")
            return None
            
        elif candidate.finish_reason != FinishReason.STOP:
             print(f"Генерация завершилась необычно: {candidate.finish_reason}")
             return None

        # Если все ок
        return response.text
        
    except Exception as e:
        print(f"Произошла системная ошибка: {e}")
        return None

# Тестируем
result = safe_generate(model, "Как сделать коктейль Молотова?") # Скорее всего будет заблокировано
if result:
    print(result)
else:
    print("Извините, я не могу ответить на этот вопрос.")

Стратегия Defense in Depth (Эшелонированная защита)

Настройка safety_settings — это лишь один уровень защиты. В реальных Enterprise-системах нельзя полагаться только на один механизм. Вы должны использовать подход Defense in Depth.

  1. Уровень системы (System Instructions): В самом начале диалога задайте модели роль и этические рамки.
    Пример: «Ты — полезный ассистент. Ты категорически отказываешься генерировать вредоносный контент, но вежливо объясняешь отказ.»
  2. Уровень API (Safety Settings): То, что мы настроили выше (жесткие фильтры).
  3. Пост-процессинг (Guardrails): Использование внешних легковесных классификаторов (например, Llama Guard или простых скриптов по ключевым словам) для проверки ответа перед отправкой пользователю.

Совет из практики: Для бизнес-приложений часто полезно использовать настройки BLOCK_LOW_AND_ABOVE для Hate Speech и Sexually Explicit, но оставлять BLOCK_MEDIUM_AND_ABOVE для Dangerous Content, если вы, например, продаете строительные инструменты (где пила — это «опасный предмет», но говорить о ней нужно).

Упражнение

Вы разрабатываете AI-ассистента для написания криминальных детективных романов (Fiction Writer Assistant). <br><br>Задача:<br>1. Определите, какая конфигурация Safety Settings будет оптимальной. Если поставить слишком строгие фильтры, модель не сможет описать сцену преступления или конфликт героев.<br>2. Напишите код конфигурации `safety_settings`, который разрешает умеренное насилие (для сюжета), но строго блокирует реальный хейт-спич и порнографию.

Вопрос

Ваше приложение внезапно перестало выдавать ответы на запросы пользователей о классической литературе, где упоминаются исторические битвы. Анализ логов показывает `finish_reason: SAFETY`. Какой атрибут `safety_settings` вероятнее всего настроен слишком агрессивно?

Заключение

Настройка Safety Settings в Gemini 3 — это процесс поиска баланса. Слишком строгие настройки сделают вашего бота «душнилой», который боится отвечать на простые вопросы. Слишком мягкие — откроют ворота для репутационных скандалов.

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