Ceci est la base de code de imprompter
. Il fournit des composants essentiels pour reproduire et tester l’attaque présentée dans l’article. Vous pouvez également créer votre propre attaque par-dessus.
Un screencast montrant comment un attaquant peut exfiltrer les informations personnelles de l'utilisateur dans un produit LLM réel (Mistral LeChat) avec notre invite contradictoire :
D’autres démos vidéo peuvent être trouvées sur notre site Web. En attendant, un grand merci à Matt Burges de WIRED et Simon Willison pour avoir écrit des histoires sympas (WIRED, Simon's Blog) couvrant ce projet !
Configurez l'environnement Python avec pip install .
ou pdm install
(pdm). Nous vous recommandons d'utiliser un environnement virtuel (par exemple conda
avec pdm venv
).
Pour GLM4-9b
et Mistral-Nemo-12B
un GPU VRAM de 48 Go est requis. Pour Llama3.1-70b
3x 80 Go de VRAM sont requis.
Il y a deux fichiers de configuration qui nécessitent une attention potentielle avant d'exécuter l'algorithme
./configs/model_path_config.json
définit le chemin du modèle Huggingface sur votre système. Vous devrez probablement le modifier en conséquence.
./configs/device_map_config.json
configure le mappage de couches pour charger les modèles sur multi-gpu. Nous montrons notre configuration pour le chargement de LLama-3.1-70B sur 3x GPU Nvidia A100 80G. Vous devrez peut-être ajuster cela en conséquence pour vos environnements informatiques.
Suivez les exemples de scripts d'exécution, par exemple ./scripts/T*.sh
. Les explications de chaque argument peuvent être trouvées dans la section 4 de notre article.
Le programme d'optimisation générera des résultats dans des fichiers .pkl
et des journaux dans le dossier ./results
. Le fichier pickle est mis à jour à chaque étape de l'exécution et stocke toujours les 100 principales invites contradictoires actuelles (avec la perte la plus faible). Il est structuré comme un tas min, dont le sommet est l'invite avec la perte la plus faible. Chaque élément du tas est un tuple de (<loss>, <adversarial prompt in string>, <optimization iteration>, <adversarial prompt in tokens>)
. Vous pouvez toujours redémarrer à partir d'un fichier pickle existant en ajoutant des arguments --start_from_file <path_to_pickle>
à son script d'exécution d'origine.
L'évaluation se fait via evaluation.ipynb
. Suivez les instructions détaillées qui s'y trouvent pour les générations contre l'ensemble de données de test, le calcul des métriques, etc.
Un cas particulier est celui des métriques PII prec/recall. Ils sont calculés de manière autonome avec pii_metric.py
. Notez que --verbose
donne tous les détails de vos informations personnelles sur chaque entrée de conversation pour le débogage et que --web
doit être ajouté lorsque les résultats sont obtenus à partir de produits réels sur le Web.
Exemple d'utilisation (résultat non Web, c'est-à-dire test local) :
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/local_evaluations/T11.json
Exemple d'utilisation (résultat Web, c'est-à-dire test de produit réel) :
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/product_evaluations/N6_lechat.json --web --verbose
Nous utilisons Selenium pour automatiser le processus de test sur des produits réels (Mistral LeChat et ChatGLM). Nous fournissons le code dans le répertoire browser_automation
. Notez que nous n'avons testé cela que sur un environnement de bureau sous Windows 10 et 11. Il est censé fonctionner également sous Linux/MacOS mais n'est pas garanti. Il faudra peut-être quelques petits ajustements.
Exemple d'utilisation : python browser_automation/main.py --target chatglm --browser chrome --output_dir test --dataset datasets/pii_conversations_rest25_gt.json --prompt_pkl results/T12.pkl --prompt_idx 1
--target
spécifie le produit, nous prenons actuellement en charge les deux options chatglm
et mistral
.
--browser
définit le navigateur à utiliser, vous devez utiliser chrome
ou edge
.
--dataset
pointe vers l'ensemble de données de conversation avec lequel tester
--prompt_pkl
fait référence au fichier pkl à partir duquel lire l'invite et --prompt_idx
définit l'index ordonné de l'invite à utiliser à partir du pkl. Alternativement, on peut définir l'invite directement dans main.py
et ne pas fournir ces deux options.
Nous fournissons tous les scripts ( ./scripts
) et ensembles de données ( ./datasets
) pour obtenir les invites (T1-T12) que nous présentons dans l'article. De plus, nous fournissons également le fichier de résultats pkl ( ./results
) pour chacune des invites tant que nous en conservons une copie et le résultat de leur évaluation ( ./evaluations
) obtenu via evaluation.ipynb
. Notez que pour l’attaque d’exfiltration de PII, les ensembles de données de formation et de test contiennent des PII du monde réel. Même s'ils sont obtenus à partir de l'ensemble de données public WildChat, nous décidons de ne pas les rendre directement publics pour des raisons de confidentialité. Nous fournissons un sous-ensemble d'entrée unique de ces ensembles de données sur ./datasets/testing/pii_conversations_rest25_gt_example.json
pour votre référence. Veuillez nous contacter pour demander la version complète de ces deux ensembles de données.
Nous avons initié la divulgation à l'équipe Mistral et ChatGLM le 9 septembre 2024 et le 18 septembre 2024, respectivement. Les membres de l'équipe de sécurité de Mistral ont réagi rapidement et ont reconnu la vulnérabilité comme un problème de gravité moyenne . Ils ont corrigé l'exfiltration des données en désactivant le rendu markdown des images externes le 13 septembre 2024 (retrouvez l'accusé de réception dans le journal des modifications de Mistral). Nous avons confirmé que le correctif fonctionne. L'équipe ChatGLM nous a répondu le 18 octobre 2024 après plusieurs tentatives de communication via divers canaux et a déclaré avoir commencé à y travailler.
Veuillez envisager de citer notre article si vous trouvez ce travail précieux.
@misc{fu2024impromptertrickingllmagents, title={Imprompter : inciter les agents LLM à utiliser incorrectement les outils}, author={Xiaohan Fu et Shuheng Li et Zihan Wang et Yihao Liu et Rajesh K. Gupta et Taylor Berg-Kirkpatrick et Earlence Fernandes}, année={2024}, eprint={2410.14923}, archivePrefix={arXiv}, PrimaryClass={cs.CR}, url={https://arxiv.org/abs/2410.14923}, }