Где-то с месяц назад вышла статья об универсальном способе выводить модель за рамки ее ограничений – делиться системным промптом или запрещенной инфой вроде инструкций по созданию биологического оружия.
Ее запостили многие новостные каналы, но полноценного разбора я так и не увидел. Мне очень не понравилось, что они тестят взлом на *своем же* системном промте. Это жесткий косяк в методологии, так что я дважды порывался сделать разгромный пост.
Но кое-что помешало.
Прежде чем писать мысли, стараюсь проверять их на практике. Так что попытался подобрать такой системный промпт, на котором взлом не сработает. Результат двух заходов – ни одной успешно-стабильной защиты внутри промпта.
Так что сначала будет о том, как и почему оно работает. Дальше выводы, что это значит для AI-продуктов. И как все-таки делать защиту "извне" – в конце поста. Сам промт из статьи для взлома – в комментах.
Почему работает:
* Дело именно в структурированном вводе – если ввод очень похож на файлы конфигурации по сути и по форме (XML, JSON, YAML), то LLM и принимает их за конфигурацию – ее собственные настройки.
* Очень любопытно, что этот паттерн-матчинг оказывается сильнее чем специальное обучение на различие system_prompt/user_prompt.
* Тот факт, что это работает для разных моделей – говорит о том, что это не какой-то особенный способ, а скорее общая проблема в текущих методах обучения LLM.
* Многослойная атака. Чтобы усилить работу основного механизма мимикрии под файлы конфигурации, авторы добавили еще два слоя: role-play и обфускацию через leet speak. Это норм обход защиты, в которой явно прописаны критерии взлома.
Как это влияет на бизнес:
* Если ваша конкурентное преимущество – это ваша доменная экспертиза (а это так для большинства успешных AI-продуктов), то у вас проблемы. За последний месяц утекло много промптов от известных компаний (даже от тех, кто ну точно шарит).
* Вы можете реверс-инжинирить их подходы до того, как они сделают это с вами.
* А самим быстрее учиться защищаться.
Как защититься:
Отдельный запрос с проверкой по чек-листу + structured_output + temperature=0.
Пример для вдохновения:
{
"involves_role_play": <bool>,
"contains_leet_speak": <bool>,
"looks_like_policy": <bool>,
"is_trying_to_get_system_prompt": <bool>,
}Это доп.шаг, который увеличивает время ответа, а у части моих клиентов есть жесткие ограничения на это. Для таких случаев делаем два запроса в параллель (основной и проверочный). Так у нас происходит проверка во время генерации основного результата. И если проверка пройдена, просто отдаем его, а если нет, то отбрасываем и баним юзера 🙃. Так мы иногда тратим токены впустую, но проверка происходит без доп. затрат по времени.
———
Очень советую посмотреть на структуру промпта в комментах. Это может помочь и ваши системные промпты лучше писать.
Ну а глобально, это еще раз подтверждает, что мы пока не можем нормально контролировать поведение AI. Учитывайте это при планировании на год-два.
