Esta é a base de código do imprompter
. Ele fornece componentes essenciais para reproduzir e testar o ataque apresentado no artigo. Você também pode criar seu próprio ataque.
Um screencast mostrando como um invasor pode exfiltrar as PII do usuário no produto LLM do mundo real (Mistral LeChat) com nosso prompt adversário:
Mais demonstrações em vídeo podem ser encontradas em nosso site. Enquanto isso, muito obrigado a Matt Burges da WIRED e Simon Willison por escreverem histórias legais (WIRED, Simon's Blog) cobrindo este projeto!
Configure o ambiente python com pip install .
ou pdm install
(pdm). Recomendamos o uso de ambiente virtual (por exemplo, conda
com pdm venv
).
Para GLM4-9b
e Mistral-Nemo-12B
é necessária uma GPU VRAM de 48 GB. Para Llama3.1-70b
são necessários 3x 80 GB de VRAM.
Existem dois arquivos de configuração que precisam de atenção potencial antes de você executar o algoritmo
./configs/model_path_config.json
define o caminho do modelo huggingface em seu sistema. Você provavelmente precisará modificar isso de acordo.
./configs/device_map_config.json
configura o mapeamento de camadas para carregar os modelos em multi-GPU. Mostramos nossa configuração para carregar LLama-3.1-70B em 3 GPUs Nvidia A100 80G. Talvez seja necessário ajustar isso de acordo com seus ambientes computacionais.
Siga os scripts de execução de exemplo, por exemplo, ./scripts/T*.sh
. As explicações de cada argumento podem ser encontradas na Seção 4 do nosso artigo.
O programa de otimização gerará resultados em arquivos .pkl
e logs na pasta ./results
. O arquivo pickle atualiza cada etapa durante a execução e sempre armazena os 100 principais prompts adversários atuais (com menor perda). Ele é estruturado como um heap mínimo, onde no topo está o prompt com menor perda. Cada elemento do heap é uma tupla de (<loss>, <adversarial prompt in string>, <optimization iteration>, <adversarial prompt in tokens>)
. Você sempre pode reiniciar a partir de um arquivo pickle existente adicionando argumentos --start_from_file <path_to_pickle>
ao seu script de execução original.
A avaliação é feita através de evaluation.ipynb
. Siga as instruções detalhadas para gerações em relação ao conjunto de dados de teste, cálculo de métricas, etc.
Um caso especial são as métricas de prec/recall de PII. Eles são calculados de forma independente com pii_metric.py
. Observe que --verbose
fornece detalhes completos de PII de cada entrada de conversa para depuração e --web
deve ser adicionado quando os resultados forem obtidos de produtos reais na web.
Exemplo de uso (resultado não web, ou seja, teste local):
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/local_evaluations/T11.json
Exemplo de uso (resultado da web, ou seja, teste de produto 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 o processo de teste em produtos reais (Mistral LeChat e ChatGLM). Fornecemos o código no diretório browser_automation
. Observe que testamos isso apenas em um ambiente de desktop no Windows 10 e 11. Supõe-se que funcione também em Linux/MacOS, mas não é garantido. Pode precisar de alguns pequenos ajustes.
Exemplo 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 o produto, no momento oferecemos suporte para chatglm
e mistral
duas opções.
--browser
define o navegador a ser usado, você deve usar chrome
ou edge
.
--dataset
aponta para o conjunto de dados de conversa para testar
--prompt_pkl
refere-se ao arquivo pkl para ler o prompt e --prompt_idx
define o índice ordenado do prompt a ser usado no pkl. Alternativamente, pode-se definir o prompt em main.py
diretamente e não fornecer essas duas opções.
Fornecemos todos os scripts ( ./scripts
) e conjuntos de dados ( ./datasets
) para obter os prompts (T1-T12) que apresentamos no artigo. Além disso, também fornecemos o arquivo de resultado pkl ( ./results
) para cada um dos prompts, desde que ainda mantenhamos uma cópia e o resultado da avaliação deles ( ./evaluations
) obtido por meio de evaluation.ipynb
. Observe que para o ataque de exfiltração de PII, os conjuntos de dados de treinamento e teste contêm PII do mundo real. Embora sejam obtidos do conjunto de dados público do WildChat, decidimos não torná-los diretamente públicos por questões de privacidade. Fornecemos um subconjunto de entrada única desses conjuntos de dados em ./datasets/testing/pii_conversations_rest25_gt_example.json
para sua referência. Entre em contato conosco para solicitar a versão completa desses dois conjuntos de dados.
Iniciamos a divulgação para a equipe Mistral e ChatGLM em 9 de setembro de 2024 e 18 de setembro de 2024, respectivamente. Os membros da equipe de segurança da Mistral responderam prontamente e reconheceram a vulnerabilidade como um problema de gravidade média . Eles corrigiram a exfiltração de dados desativando a renderização de markdown de imagens externas em 13 de setembro de 2024 (encontre o reconhecimento no changelog do Mistral). Confirmamos que a correção funciona. A equipe ChatGLM nos respondeu em 18 de outubro de 2024 após várias tentativas de comunicação por meio de vários canais e afirmou que começou a trabalhar nisso.
Por favor, considere citar nosso artigo se você achar este trabalho valioso.
@misc{fu2024impromptertrickingllmagents, title = {Imprompter: enganando agentes LLM para uso impróprio de ferramentas}, autor={Xiaohan Fu e Shuheng Li e Zihan Wang e Yihao Liu e Rajesh K. Gupta e Taylor Berg-Kirkpatrick e Earlence Fernandes}, ano={2024}, eprint={2410.14923}, archivePrefix={arXiv}, classeprimária={cs.CR}, url={https://arxiv.org/abs/2410.14923}, }