
За пределами промпта: взлом LLM с вызовом функций через имитацию следов модерации
Этот репозиторий содержит официальную реализацию нашей статьи:
Beyond the Prompt: Jailbreaking Function-Calling LLMs via Simulated Moderation Traces
Если вы находите этот репозиторий полезным для своих исследований, пожалуйста, рассмотрите возможность цитирования нашей статьи. Вопросы, сообщения об ошибках и проблемы с воспроизводимостью приветствуются через GitHub Issues.

.
├── install.sh # Installation script for setting up the environment and dependencies
├── main.py # Main evaluation entry point
├── demo.ipynb # Minimal working example
├── requirements.txt # Python dependencies
├── data/
│ ├── SafeBench-Tiny.txt # Default benchmark
│ └── JailbreakBench.txt # Optional benchmark
├── figures/
│ ├── pipline.jpg # Framework overview
│ ├── main_res1.jpg # Main result figure
│ └── main_res2.jpg # Main result figure
├── utils/
│ ├── config.example.json # Example API configuration
│ ├── eval_h_cot.py # External evaluation utility
│ ├── fake_tool_call_noharmful.json
│ ├── moderation_generator.py
│ └── moderation_validator.py
└── output/ # Checkpoints and evaluation results
Мы предоставляем скрипт установки для автоматической настройки окружения Python и установки всех необходимых зависимостей.
chmod +x install.sh
./install.sh
После завершения установки активируйте виртуальное окружение:
source .venv/bin/activate
В качестве альтернативы вы можете вручную создать окружение с помощью Conda:
conda create -n SMT python=3.12
conda activate SMT
pip install -r requirements.txt
Создайте utils/config.json на основе файла-примера:
cp utils/config.example.json utils/config.json
Минимальный файл конфигурации должен соответствовать следующему формату:
{
"llm_api": {
"base_url": "https://your-api-endpoint/v1",
"api_key": "YOUR_API_KEY"
},
"local": {
"base_url": "http://localhost:1234/v1",
"api_key": "YOUR_LOCAL_API_KEY"
}
}
Эти две записи соответствуют:
llm_api: API-эндпоинт по умолчанию, совместимый с OpenAI, для коммерческих моделей.local: локальный эндпоинт инференса, совместимый с OpenAI, используемый для выбранных локальных моделей.Откройте main.py и измените конфигурацию эксперимента в начале файла:
DATA_FILE = "SafeBench-Tiny.txt"
# DATA_FILE = "JailbreakBench.txt"
TARGET_MODELS = [
"gpt-4o-2024-11-20",
# "gpt-5.4-2026-03-05",
# "qwen3-max-2026-01-23",
# "gemini-3-flash-preview",
# "deepseek-v4-flash",
# "claude-sonnet-4-5-20250929",
]
Используйте идентификаторы моделей, допустимые для конечной точки API, настроенной в utils/config.json.
Параметры по умолчанию определены в main.py:
MAX_THREADS = 1
MAX_ROUNDS = 3
TURNS_NUM = 3
RESET = False
Их значения:
| Параметр | Описание |
|---|---|
MAX_THREADS | Максимальное число одновременных воркеров на целевую модель |
MAX_ROUNDS | Максимальное число внешних раундов повторных попыток |
TURNS_NUM | Максимальное число попыток многоходового взаимодействия на образец |
RESET | Отбрасывать ли существующую контрольную точку перед оценкой |
Задайте:
RESET = True
для запуска нового прогона для выбранной модели. Оставьте False, чтобы возобновить с существующей контрольной точки.
python main.py
Для каждой целевой модели скрипт автоматически:
data/.Результаты сохраняются в:
output/attack_checkpoint_<dataset>_<model>.json
Например:
output/attack_checkpoint_SafeBench-Tiny_gpt-4o-2024-11-20.json
Каждый элемент бенчмарка хранится с полями, аналогичными:
{
"target_question": {
"success": true,
"queries": 3,
"payload": "...",
"score": 60
}
}
Скрипт сообщает следующие метрики:
| Метрика | Описание |
|---|---|
| ASR | Доля успешных атак: процент выборок, чья оценка достигает заданного порога |
| Avg.Q | Среднее количество API-запросов, использованных на одну выборку |
| Avg.Score | Средняя оценка внешнего оценивания по всем выборкам |
Основные эксперименты SMT основаны на API и не требуют локального GPU.
MAX_ROUNDS = 3 и TURNS_NUM = 3 SMT использует не более 9 запросов к целевой модели на одну выборку бенчмарка до досрочной остановки.Для локально развёрнутых моделей дополнительные требования к GPU и памяти зависят от выбранной модели и бэкенда инференса.
Коммерческие API LLM постоянно обновляются. Даже при использовании одного и того же псевдонима модели результаты могут различаться из-за обновлений моделей на стороне провайдера, поведения маршрутизации, изменений политик безопасности, настроек декодирования или временных сбоев API.
Для повышения воспроизводимости:
Все эксперименты, описанные в этом репозитории, были проведены в июне 2026 года. Поскольку смоделированные трассы валидации включают рандомизированные элементы, выходные данные моделей по своей природе стохастичны, а возможности моделей и внешние механизмы обнаружения продолжают развиваться, точные истории взаимодействия и воспроизведённые результаты могут отличаться от приведённых здесь даже при одинаковой конфигурации высокого уровня.