Этот пост посвящен sponge-примерам (губкам) — угрозе для третьего элемента триады безопасности — доступности. В контексте LLM inference такие сценарии можно рассматривать как частный случай Model DoS: отдельный запрос заставляет модель тратить непропорционально много времени и энергии на генерацию ответа.
💸 Откуда берется стоимость генерации LLM?
Глобально можно разделить затраты обработки промпта на две части — prefill (чтение запроса и всех приложенных файлов) и decode (последовательная генерация токена за токеном).
Стоимость prefill стабильно растет с длиной входа, и нагрузка вполне предсказуема — decode, напротив, не всегда зависит от размера промпта, и тем не менее, способен занимать практически всю долю затраченных ресурсов. Поэтому мы решили изучить атаки именно на второй компонент стоимости.
🛑 Как модель решает завершить написание ответа?
На каждом шаге генерации модель выполняет одну и ту же задачу — рассчитать вероятности появления каждого токена из словаря, а затем по правилам декодирования выбрать следующий токен. Стохастические методы декодинга называются сэмплингом (temperature, top-p). Существует специальный токен End-of-sequence (EOS), смысловое значение которого — ответ закончен. В момент, когда модель решает завершить ответ, высоковероятным токеном становится EOS — токен выбирается и decode заканчивается. Стало быть, подавляя вероятность генерации EOS на каждом шагу, мы добьемся дорогого ответа.
📉 Как мы можем снизить вероятность EOS?
Важно: на выбор токенов напрямую влияют параметры сэмплинга. Например, чем ближе значение температуры к нулю, тем более жадным становится выбор токенов — генерация приближается к greedy decoding. То есть чем ниже значение параметра, тем чаще модель будет выбирать токены с наибольшей вероятностью. Теперь увидим, как это может привести к циклам.
🌀 Первый пример дорогой и долгой бесполезной генерации, который вы могли видеть — это циклы. Попросим модель написать слово «Привет» 100 раз, и на 101-м шаге у нее в контексте будет большая цепочка с одним правилом: после каждого «Привет» следовало «Привет». Тем самым мы заметно усилили вероятность продолжения паттерна, и здесь важную роль сыграет сэмплинг. Даже при условии выученного правила (топ-1 вероятность у слова «Привет»), при высокой температуре модель могла бы выбрать топ-2 токен или топ-3..., и цикл был бы сломан, генерация могла бы удачно завершиться. Но при жадном сэмплинге мы заметно увеличиваем шансы раз за разом выбирать "Привет". Цикл порождает цикл, и способ заметно снизить вероятность повторов — сделать декодинг менее жадным.
🌫 Посмотрим теперь с другой стороны: почему вам стоит ограничивать параметр температуры ещё и сверху? Чем выше температура, тем выше шанс, что модель сгенерирует не топ-1 токен, а менее вероятный. Представим, что в модель передали запрос с экстремально высокой температурой, хоть миллион. Тогда будет получен случайный поток токенов: модель потеряет всякую логическую нить, а вероятность выбора EOS устремится к случайному попаданию в токен из словаря.
✅ На этих двух примерах мы показали два способа вызвать дорогую генерацию — циклы и шум. В дальнейших постах мы разберем, как мультимодальные модели могут попадать в такие состояния, что такое труднозаметные почти-циклы и как строить защиту от дорогой генерации: max tokens, rate limits и детекторы повторов.
📚 По теме: эта серия постов берет свое начало из нашей исследовательской работы по sponge-примерам и дорогой генерации. Тезисы опубликованы в сборнике Недели науки СПбПУ:
https://elib.spbstu.ru/dl/2/i26-137.pdf/download/i26-137.pdfключевые слова:
sponge attack, Model DoS, expensive generation, greedy decoding, EOS