Безопасность, отказы и запасные варианты
В продакшене ваш код должен обрабатывать случай, когда Claude не станет (или не сможет) ответить ожидаемым образом. Сделанное хорошо, это незаметно для пользователей; сделанное плохо — это сбой или сбивающий с толку ответ.
Две разные вещи
- Отказ модели — Claude отклоняет запрос (например, считает его вредоносным). Ответ сигнализирует об этом (обычно через
stop_reason/контент отказа). Воспринимайте это как нормальный исход, а не как ошибку. - Блокировка классификатора/безопасности — отдельный слой безопасности может заблокировать контент. Это может выглядеть иначе, чем отказ модели.
Понимание того, что именно вы получили, позволяет реагировать соответствующе, а не повторять запрос вслепую.
Обрабатывайте это корректно
resp = client.messages.create(...)
if getattr(resp, "stop_reason", None) == "refusal":
# Don't show a raw/empty result. Offer a safe fallback or a clarifying ask.
show_user("I can't help with that as asked. Here's what I can do instead…")
else:
render(resp)
Снижайте нежелательные отказы
- Добавляйте легитимный контекст. Запрос может совпасть по шаблону с чем-то чувствительным, хотя намерение безвредно; указание реальной, легитимной цели помогает.
- Будьте конкретны. Расплывчатые или провокационные формулировки вызывают осторожность.
- Не боритесь с этим. Если запрос действительно недопустим, отказ корректен — спроектируйте изящный путь, а не пытайтесь обойти защиту.
Шаблоны запасных вариантов
- Уточняющий вопрос вместо тупика.
- Безопасная альтернатива («Я могу вместо этого суммировать публичную информацию»).
- Для конвейеров — передавайте человеку, когда уверенность/право невелики.