
Au-delà du prompt : contourner les LLM à appel de fonctions via des traces de modération simulées
Ce dépôt contient l'implémentation officielle de notre article :
Beyond the Prompt: Jailbreaking Function-Calling LLMs via Simulated Moderation Traces
Si vous trouvez ce dépôt utile pour vos recherches, nous vous invitons à citer notre article. Les questions, rapports de bugs et problèmes de reproductibilité sont les bienvenus via les 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
Nous fournissons un script d'installation pour configurer automatiquement l'environnement Python et installer toutes les dépendances requises.
chmod +x install.sh
./install.sh
Une fois l'installation terminée, activez l'environnement virtuel :
source .venv/bin/activate
Vous pouvez également créer manuellement l'environnement avec Conda :
conda create -n SMT python=3.12
conda activate SMT
pip install -r requirements.txt
Créez utils/config.json à partir du fichier d'exemple :
cp utils/config.example.json utils/config.json
Un fichier de configuration minimal doit suivre ce format :
{
"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"
}
}
Les deux entrées correspondent à :
llm_api : le point de terminaison API compatible OpenAI par défaut pour les modèles commerciaux.local : un point de terminaison d'inférence local compatible OpenAI, utilisé pour certains modèles locaux sélectionnés.Ouvrez main.py et modifiez la configuration de l'expérience au début du fichier :
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",
]
Utilisez des identifiants de modèle valides pour le point de terminaison API configuré dans utils/config.json.
Les paramètres par défaut sont définis dans main.py :
MAX_THREADS = 1
MAX_ROUNDS = 3
TURNS_NUM = 3
RESET = False
Leur signification est :
| Paramètre | Description |
|---|---|
MAX_THREADS | Nombre maximal de workers simultanés par modèle cible |
MAX_ROUNDS | Nombre maximal de cycles de nouvelle tentative externes |
TURNS_NUM | Nombre maximal de tentatives d'interaction multi-tours par échantillon |
RESET | Indique s'il faut supprimer un checkpoint existant avant l'évaluation |
Définir :
RESET = True
pour démarrer une nouvelle exécution pour le modèle sélectionné. Laissez-le à False pour reprendre à partir d'un checkpoint existant.
python main.py
Pour chaque modèle cible, le script effectue automatiquement les opérations suivantes :
data/.Les résultats sont enregistrés sous :
output/attack_checkpoint_<dataset>_<model>.json
Par exemple :
output/attack_checkpoint_SafeBench-Tiny_gpt-4o-2024-11-20.json
Chaque élément de benchmark est stocké avec des champs similaires à :
{
"target_question": {
"success": true,
"queries": 3,
"payload": "...",
"score": 60
}
}
Le script rapporte les métriques suivantes :
| Métrique | Description |
|---|---|
| ASR | Taux de réussite des attaques : pourcentage d'échantillons dont le score atteint le seuil configuré |
| Avg.Q | Nombre moyen de requêtes API utilisées par échantillon |
| Avg.Score | Score d'évaluation externe moyen sur l'ensemble des échantillons |
Les principales expériences SMT sont basées sur des API et ne nécessitent pas de GPU local.
MAX_ROUNDS = 3 et TURNS_NUM = 3, SMT utilise au plus 9 requêtes au modèle cible par échantillon de benchmark avant l'arrêt anticipé.Pour les modèles déployés localement, les exigences supplémentaires en GPU et en mémoire dépendent du modèle sélectionné et du backend d'inférence.
Les API de LLM commerciaux sont continuellement mises à jour. Même en utilisant le même alias de modèle, les résultats peuvent varier en raison de mises à jour des modèles côté fournisseur, du comportement de routage, de modifications des politiques de sécurité, des paramètres de décodage ou de défaillances transitoires de l'API.
Pour améliorer la reproductibilité :