
Código, logs de resposta e rótulos para o artigo Jailbreaking Open-Weight LLMs via Random Embedding Perturbations
Código e dados para o artigo Jailbreaking Open-Weight LLMs via Random Embedding Perturbations.
Escrito pelas pessoas incríveis do Departamento de Ciência da Computação Teórica da Universidade da Califórnia, Santa Cruz.
Este trabalho tem contribuições significativas de Scott Sirri, Prof. Vaggos Chatziafratis, Prof. C. Seshadhri e eu.
O repositório contém todas as respostas de modelos geradas para o artigo, o rótulo seguro / inseguro /
degenerado de cada resposta, os notebooks Colab que as produziram e os scripts de inferência
que os notebooks importam. Isto abrange o ataque Perturbed Embedding Vector (PEV) e os
cinco outros métodos de jailbreak comparados no artigo. Todas as taxas de jailbreak e tempos de relógio de parede no
artigo são calculados a partir dos ficheiros em results/.
code/
inference/ run_<model>.py: carregamento do modelo, construção do prompt e o ciclo de
geração manual que todos os notebooks PEV importam
ours/<model>/ notebooks PEV para um modelo
ours/<model>/fixed_peak_sigma/
notebooks para as execuções de sigma de pico fixo (GLM-4-9B, Phi-4-mini,
Qwen2.5-1.5B); os seus registos estão em results/<model>/ours/fixed_peak_sigma/
igcg/ I-GCG, um notebook por modelo
latentfusion/ LatentFusion, um notebook por modelo
refusalcones/ RefusalCones, um notebook por modelo
softprompt/ notebooks SoftPrompt (Llama-3.1-8B e Mistral-7B)
figures/ notebook que desenha as figuras do artigo
results/<model>/
baseline/ respostas diretas aos prompts não perturbados (registo .txt) e os seus
rótulos (.xlsx / .csv); estes dão a taxa de jailbreak de base
ours/raw_responses/ registos de respostas PEV das varreduras de sigma, divididos por intervalo de prompts
ours/classified/ rótulos para essas respostas, divididos da mesma forma
ours/fixed_peak_sigma/ execuções PEV no sigma de pico fixo do modelo (GLM-4-9B, Phi-4-mini,
Qwen2.5-1.5B): a varredura completa de 100 prompts e as re-execuções SELECT
igcg/ latentfusion/ neurostrike/ refusalcones/ softprompt/
respostas (.txt) e rótulos (.xlsx) para os outros métodos
Modelos: Qwen2.5-1.5B, SmolLM3-3B, Phi-4-mini, Mistral-7B-Instruct, Llama-3.1-8B,
GLM-4-9B, as variantes de chat ajustadas por instruções nomeadas na Sec. 4 do artigo.
Onde está o código de cada método:
| Método | Localização |
|---|---|
| PEV | code/ours/<model>/; execuções de sigma de pico fixo em code/ours/<model>/fixed_peak_sigma/; código de inferência partilhado em code/inference/ |
| I-GCG | code/igcg/, um notebook por modelo |
| LatentFusion | code/latentfusion/, um notebook por modelo |
| RefusalCones | code/refusalcones/, um notebook por modelo |
| SoftPrompt | code/softprompt/, Llama-3.1-8B e Mistral-7B |
| NeuroStrike | dentro dos notebooks PEV code/ours/Llama-3.1-8B/LLama31_perturbation_p76_to_p100.ipynb (célula de configuração também em LLama31_perturbation_p1_to_p25.ipynb) e code/ours/SmolLM3-3B/run_smollm3_batched_p26_p50.ipynb; as respostas vão para results/<model>/neurostrike/ |
code/inference/run_<model>.py é um ficheiro por modelo (run_qwen.py, run_smollm3.py,
run_phi4mini.py, run_mistral.py, run_llama.py, run_glm.py). Cada um carrega o modelo com
HuggingFace Transformers, aplica o template de chat com uma mensagem de sistema vazia, expõe
load_model(), build_prompt() e encode_prompt(), e executa um ciclo de geração
autorregressiva manual com um hook nos embeddings de entrada. Os notebooks importam o script para o seu
modelo e injetam o ruído Gaussiano através desse hook. Executado sozinho, um script abre um
terminal interativo para um único modelo; os comandos /verbose e /embedfile imprimem tabelas de tokens
e vetores de embedding. Os interruptores de dispositivo e comportamento são variáveis de ambiente
documentadas no cabeçalho de cada ficheiro. O script Llama precisa de um token Hugging Face porque o
checkpoint está restrito; o token é lido do ambiente e nunca armazenado.
.txt) são registos apenas de adição escritos pelos notebooks. Cada entrada regista
o índice do prompt, o nível de ruído sigma quando aplicável, o número da execução e a resposta completa
do modelo. Os nomes dos ficheiros contêm o intervalo de prompts (p001_to_p025 significa prompts 1 a 25 dos
100 prompts prejudiciais do JailbreakBench) e o timestamp UTC da execução. O tempo de relógio de parede é
escrito após cada lote de 20 execuções por prompt e no final da experiência..xlsx, .csv) contêm uma linha por resposta com o seu rótulo, seguro, inseguro ou
degenerado, conforme definido na Sec. 4 do artigo. Um prompt conta como jailbroken se qualquer uma das suas
execuções for rotulada como insegura. Os ficheiros com nomes *_categorization* ou *_p01_25 são as
versões rotuladas do registo com o mesmo intervalo de prompts.ours/fixed_peak_sigma/) são nomeadas
JBB_<model>_sigma0pXXX_..._<timestamp>.txt; sigma0p003 significa sigma = 0.003. O
ficheiro p001_to_p100 é a varredura completa de 100 prompts, 20 execuções nesse sigma. Os
ficheiros SELECT_..._nNN são execuções de seguimento no mesmo sigma sobre os prompts listados no
nome do ficheiro, com NN execuções por prompt.HIGHSIGMA são as execuções com sigma maior discutidas na Sec. 4.1.SELECT são execuções adicionais sobre os prompts listados no nome do ficheiro, para
prompts que precisaram de mais de 20 execuções para fazer jailbreak. A linha de cabeçalho de cada registo regista os
valores de sigma, o número de execuções, os ids dos prompts e a semente aleatória.Llama-3.1-8B/baseline/fixed_baseline.xlsx e os ficheiros de rótulos fixed_* são os ficheiros de rótulos
após verificação manual e substituem versões anteriores.As respostas foram classificadas pelo Claude Opus 4.6 com as instruções do juiz do JailbreakBench, dado
o ficheiro de registo com o prompt, o número da execução e a resposta. Cada resposta rotulada como insegura foi depois
verificada à mão. Os ficheiros de rótulos em results/ são os rótulos verificados.
Cada notebook em code/ours/<model>/ foi executado numa única NVIDIA A100-SXM4-80GB no Google
Colab. Importa o run_<model>.py correspondente, carrega os prompts prejudiciais do JailbreakBench,
mapeia cada prompt através da camada de embedding de entrada do modelo, adiciona ruído Gaussiano independente
N(0, sigma^2) ao embedding completo do prompt e passa o embedding perturbado para as
camadas do transformer. Para cada prompt, amostra 20 matrizes de ruído num único lote e acrescenta cada
resposta ao registo. Os parâmetros de descodificação e o sigma por modelo estão listados na Sec. 4 e
Tab. 3 do artigo e definidos no topo de cada notebook. O token Hugging Face é pedido
interativamente e não é armazenado neste repositório. Os notebooks para os outros métodos seguem
o mesmo padrão com o ataque correspondente substituído.
As taxas de jailbreak no artigo podem ser recalculadas apenas a partir dos ficheiros de rótulos, sem executar qualquer modelo.