Esta es la base del código de imprompter
. Proporciona componentes esenciales para reproducir y probar el ataque presentado en el artículo. También puedes crear tu propio ataque encima.
Un screencast que muestra cómo un atacante puede filtrar la PII del usuario en un producto LLM del mundo real (Mistral LeChat) con nuestro mensaje adversario:
Puede encontrar más demostraciones en vídeo en nuestro sitio web. Mientras tanto, ¡muchas gracias a Matt Burges de WIRED y Simon Willison por escribir historias interesantes (WIRED, Simon's Blog) que cubren este proyecto!
Configure el entorno Python con pip install .
o pdm install
(pdm). Recomendamos utilizar un entorno virtual (por ejemplo, conda
con pdm venv
).
Para GLM4-9b
y Mistral-Nemo-12B
se requiere una GPU VRAM de 48 GB. Para Llama3.1-70b
se requieren 3x 80 GB de VRAM.
Hay dos archivos de configuración que necesitan atención potencial antes de ejecutar el algoritmo.
./configs/model_path_config.json
define la ruta del modelo huggingface en su sistema. Lo más probable es que necesites modificar esto en consecuencia.
./configs/device_map_config.json
configura el mapeo de capas para cargar los modelos en múltiples gpu. Mostramos nuestra configuración para cargar LLama-3.1-70B en 3 GPU Nvidia A100 80G. Es posible que deba ajustar esto en consecuencia para sus entornos computacionales.
Siga los scripts de ejecución de ejemplo, por ejemplo ./scripts/T*.sh
. Las explicaciones de cada argumento se pueden encontrar en la Sección 4 de nuestro artículo.
El programa de optimización generará resultados en archivos .pkl
y registros en la carpeta ./results
. El archivo pickle actualiza cada paso durante la ejecución y siempre almacena los 100 mensajes adversarios principales actuales (con la menor pérdida). Está estructurado como un montón mínimo, donde la parte superior es el aviso con la menor pérdida. Cada elemento del montón es una tupla de (<loss>, <adversarial prompt in string>, <optimization iteration>, <adversarial prompt in tokens>)
. Siempre puede reiniciar desde un archivo pickle existente agregando argumentos --start_from_file <path_to_pickle>
a su script de ejecución original.
La evaluación se realiza a través de evaluation.ipynb
. Siga las instrucciones detalladas allí para generaciones sobre pruebas de conjuntos de datos, cálculo de métricas, etc.
Un caso especial son las métricas de preparación/recuperación de PII. Se calculan de forma independiente con pii_metric.py
. Tenga en cuenta que --verbose
brinda detalles completos de su PII de cada entrada de conversación para depuración y --web
debe agregarse cuando los resultados se obtienen de productos reales en la web.
Uso de ejemplo (resultado no web, es decir, prueba local):
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/local_evaluations/T11.json
Uso de ejemplo (resultado web, es decir, prueba de producto real):
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/product_evaluations/N6_lechat.json --web --verbose
Usamos Selenium para automatizar el proceso de prueba en productos reales (Mistral LeChat y ChatGLM). Proporcionamos el código en el directorio browser_automation
. Tenga en cuenta que solo hemos probado esto en un entorno de escritorio en Windows 10 y 11. Se supone que también funciona en Linux/MacOS, pero no está garantizado. Puede que necesite algunos pequeños ajustes.
Ejemplo de uso: 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
especifica el producto, en este momento admitimos chatglm
y mistral
dos opciones.
--browser
define el navegador que se utilizará, debes usar chrome
o edge
.
--dataset
apunta al conjunto de datos de conversación para probar
--prompt_pkl
hace referencia al archivo pkl desde el que leer el mensaje y --prompt_idx
define el índice ordenado del mensaje que se utilizará desde el pkl. Alternativamente, se puede definir el mensaje en main.py
directamente y no proporcionar estas dos opciones.
Proporcionamos todos los scripts ( ./scripts
) y conjuntos de datos ( ./datasets
) para obtener las indicaciones (T1-T12) que presentamos en el artículo. Además, también proporcionamos el archivo de resultados pkl ( ./results
) para cada uno de los mensajes siempre que conservemos una copia y el resultado de la evaluación de ellos ( ./evaluations
) obtenido a través de evaluation.ipynb
. Tenga en cuenta que para el ataque de exfiltración de PII, los conjuntos de datos de entrenamiento y prueba contienen PII del mundo real. Aunque se obtienen del conjunto de datos público de WildChat, decidimos no hacerlos públicos directamente por motivos de privacidad. Proporcionamos un subconjunto de entrada única de estos conjuntos de datos en ./datasets/testing/pii_conversations_rest25_gt_example.json
para su referencia. Comuníquese con nosotros para solicitar la versión completa de estos dos conjuntos de datos.
Iniciamos la divulgación a Mistral y al equipo de ChatGLM el 9 de septiembre de 2024 y el 18 de septiembre de 2024, respectivamente. Los miembros del equipo de seguridad de Mistral respondieron rápidamente y reconocieron la vulnerabilidad como un problema de gravedad media . Solucionaron la filtración de datos al deshabilitar la representación de rebajas de imágenes externas el 13 de septiembre de 2024 (encuentre el reconocimiento en el registro de cambios de Mistral). Confirmamos que la solución funciona. El equipo de ChatGLM nos respondió el 18 de octubre de 2024 después de múltiples intentos de comunicación a través de varios canales y declaró que habían comenzado a trabajar en ello.
Considere citar nuestro artículo si lo encuentra valioso.
@misc{fu2024impromptertrickingllmagents, title={Imprompter: engañar a los agentes de LLM para que utilicen herramientas inadecuadas}, autor = {Xiaohan Fu y Shuheng Li y Zihan Wang y Yihao Liu y Rajesh K. Gupta y Taylor Berg-Kirkpatrick y Earlence Fernandes}, año={2024}, eprint={2410.14923}, archivePrefix={arXiv}, clase primaria={cs.CR}, URL={https://arxiv.org/abs/2410.14923}, }