Safety Settings: Настройка фильтров безопасности и модерации

35 минут Урок 23

Введение: Почему безопасность — это не просто галочка в чек-листе

Добро пожаловать в пятый модуль. Мы переходим от экспериментов в «песочнице» к архитектуре реальных решений. И здесь мы сталкиваемся с темой, которую разработчики часто оставляют на потом — Safety Settings (Настройки безопасности).

Давайте будем честны: когда вы создаете прототип, ваша главная цель — заставить модель отвечать умно и полезно. Но когда вы выводите продукт в продакшн, приоритеты меняются. Один токсичный ответ, одна инструкция по созданию вредоносного ПО или одна галлюцинация с медицинским советом могут стоить компании репутации или привести к юридическим искам.

В Gemini API настройки безопасности — это не цензура в привычном понимании. Это инструмент управления рисками. Как архитектор ИИ-решений, вы должны понимать, как настроить «чувствительность» модели так, чтобы она не блокировала безобидные запросы (ложноположительные срабатывания), но жестко отсекала реальные угрозы.

Анатомия безопасности Gemini

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

API классифицирует контент по четырем основным категориям вреда (Harm Categories):

  • HARM_CATEGORY_HARASSMENT (Преследование): Негативные комментарии, запугивание, травля по признаку расы, пола, религии и т.д.
  • HARM_CATEGORY_HATE_SPEECH (Разжигание ненависти): Пропаганда насилия или дискриминации против защищаемых групп.
  • HARM_CATEGORY_SEXUALLY_EXPLICIT (Контент сексуального характера): Порнография, сексуальное насилие.
  • HARM_CATEGORY_DANGEROUS_CONTENT (Опасный контент): Инструкции по нанесению вреда, создание оружия, употребление наркотиков, самоповреждение.

Для каждой из этих категорий вы можете настроить порог блокировки (Block Threshold). Это работает как регулятор громкости: вы решаете, насколько уверенной должна быть модель в том, что контент вреден, прежде чем заблокировать его.

Пороги блокировки: Как крутить ручки?

Gemini предоставляет четыре уровня фильтрации. Понимание разницы между ними критически важно для настройки под конкретный бизнес-кейс.

  • 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

# Пример конфигурации настроек безопасности
# Мы хотим создать строгого корпоративного бота-ассистента

safety_settings = {
    HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
}

model = genai.GenerativeModel(
    model_name='gemini-1.5-pro',
    safety_settings=safety_settings
)

# Теперь все запросы к этой модели будут проходить через указанные фильтры

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

Одна из самых частых ошибок новичков — игнорирование структуры ответа (response structure). Если фильтр сработал, вы не получите текст в response.text. Вместо этого код выбросит исключение или вернет пустую строку, если вы не проверите причину завершения.

В объекте ответа есть поле prompt_feedback (обратная связь по промпту) и candidates (варианты ответа). Если контент заблокирован, finish_reason (причина завершения) будет иметь значение SAFETY.

Важный нюанс: Блокировка может произойти на двух этапах:
1. Блокировка промпта: Модель отказывается даже начинать генерацию, так как сам вопрос пользователя нарушает правила.
2. Блокировка ответа: Модель начала генерировать ответ, но в процессе генерации фильтры засекли нарушение и прервали поток.

python
# Пример безопасной обработки ответа
try:
    response = model.generate_content("Напиши рецепт коктейля Молотова")
    
    # Проверяем, заблокирован ли ответ
    if response.prompt_feedback.block_reason:
        print(f"Промпт заблокирован! Причина: {response.prompt_feedback.block_reason}")
    elif response.candidates[0].finish_reason.name == "SAFETY":
        print("Ответ заблокирован настройками безопасности.")
        # Можно вывести детали, какая категория сработала (если доступно в metadata)
        print(response.candidates[0].safety_ratings)
    else:
        print(response.text)
        
except Exception as e:
    print(f"Произошла ошибка при генерации: {e}")

Стратегии настройки для разных сценариев

Как архитектор, вы должны выбирать настройки исходя из контекста. Рассмотрим три типовых сценария:

1. Чат-бот для поддержки клиентов (E-commerce)

Здесь риск «обидеть» клиента или выдать что-то непристойное недопустим. Однако, если клиент жалуется на «ужасный сервис» (агрессивный тон), строгий фильтр Harassment может заблокировать обработку жалобы.

  • Решение: Harassment — BLOCK_ONLY_HIGH (чтобы пропускать жалобы, но блокировать прямые оскорбления), остальное — BLOCK_MEDIUM.

2. Инструмент для креативного письма (Creative Writing Tool)

Писатели могут создавать злодеев, описывать битвы или драматические конфликты. Строгие фильтры сделают инструмент бесполезным.

  • Решение: Dangerous Content — BLOCK_MEDIUM (не давать реальных инструкций по оружию), остальное — BLOCK_ONLY_HIGH или даже BLOCK_NONE (с дисклеймером для пользователя).

3. Приложение для детей (EdTech)

Нулевая терпимость к любому риску.

  • Решение: Все категории на BLOCK_LOW_AND_ABOVE.

Упражнение

Напишите код функции `create_safe_model(risk_level)`, которая принимает строку уровня риска ('strict', 'moderate', 'creative') и возвращает объект модели Gemini с соответствующими настройками безопасности. <br><br>- 'strict': Все фильтры на максимум.<br>- 'moderate': Стандартные настройки.<br>- 'creative': Разрешить 'Harassment' и 'Hate Speech' (для описания злодеев в книгах), но оставить строгий запрет на 'Sexually Explicit' и 'Dangerous Content'.

Паттерн архитектора: Использование Gemini как модератора

Иногда встроенных фильтров недостаточно. Например, вы хотите фильтровать упоминания конкурентов или специфический сленг, который не является «опасным» с точки зрения базовых категорий, но неприемлем для вашего бренда.

В таких случаях используют паттерн LLM-as-a-Judge (ИИ как судья). Вы создаете отдельный вызов API (обычно с быстрой и дешевой моделью, например, Gemini 1.5 Flash), цель которого — только проверить ввод пользователя или вывод основной модели.

Алгоритм:

  1. Пользователь отправляет сообщение.
  2. Приложение отправляет это сообщение «Модератору» (Gemini Flash) с системной инструкцией проверить на соответствие кастомным правилам.
  3. Если «Модератор» дает добро, сообщение уходит к основной «умной» модели.

Это добавляет задержку (latency), но обеспечивает полный контроль над контентом.

Вопрос

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

Заключение

Настройка Safety Settings — это баланс. Слишком строгие фильтры делают продукт «стерильным» и бесполезным (false positives). Слишком мягкие — создают риски (false negatives). Ваша задача как архитектора — не просто скопировать код из документации, а осознанно выбрать профиль риска для вашего продукта.

В следующем уроке мы поговорим о том, как оценивать качество работы модели и автоматизировать тестирование этих настроек перед релизом.