
Codice per 'Steering the CensorShip: Uncovering Representation Vectors for LLM "Thought" Control'
Questo repository contiene l'implementazione del codice per Steering the CensorShip: Uncovering Representation Vectors for LLM "Thought" Control di Hannah Cyberey e David Evans.
Presentiamo un metodo che individua i "vettori di steering" nei meccanismi interni degli LLM per rilevare e controllare il livello di censura nelle uscite dei modelli. Dai un'occhiata a questo post del blog per una breve panoramica del nostro lavoro.
Prova le nostre demo:
NOTA: Entrambe le demo richiedono un account Huggingface. È ospitato con ZeroGPU di Huggingface, che è gratuito per tutti gli utenti con una quota di utilizzo giornaliera limitata.
Scarica il repository:
git clone https://github.com/hannahxchen/llm-censorship-steering.git
cd llm-censorship-steering
Crea un ambiente virtuale con Python 3.11+ e attivalo:
conda create -y -n censorship-steering python=3.11
conda activate censorship-steering
Installa le dipendenze:
pip install -r requirements.txt
Trovare un Vettore di Steering
Per trovare un vettore di steering per la censura in un modello a istruzioni, esegui:
python -m llm_steering.run \
--run_train \
--model_name meta-llama/Llama-2-7b-chat-hf \
--censor_type refusal \
--n_train 1000 --n_val 500 \
--threshold 0.1 \
--filter_layer_pct 0.2
Un file di configurazione verrà salvato nella directory specificata. In alternativa, puoi usare python -m llm_steering.run --config_file CONFIG_FILE passando un file di configurazione YAML, seguendo il formato definito in llm_steering/config.py.
Per i modelli di ragionamento, usiamo la seguente configurazione:
python -m llm_steering.run \
--run_train \
--model_name deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
--censor_type thought_suppress \
--n_train -1 --n_val 1000 \
--threshold 0.1 \
--filter_layer_pct 0.05 \
--save_dir SAVE_DIR
Applicare il Vettore di Steering
Usa il seguente comando per applicare il vettore di steering:
python -m llm_steering.run
--run_steering \
--config_file SAVE_DIR/config.yaml \
--generation_batch_size 8 \
--coeff -1 \
--datasets jailbreakbench ccp_sensitive
Puoi impostare un singolo coefficiente con --coeff oppure un intervallo di coefficienti usando --min_coeff, --max_coeff e --increment. Di default, applica valori da -1 a 1 con un incremento di 0.2. Tutte le uscite del modello verranno salvate in SAVE_DIR/evaluation/.
Tutti gli argomenti di llm_steering/run.py:
(Per l'addestramento e la validazione)
model_name: Usa il nome del repository del modello su Huggingface.censor_type: Usa "refusal" per i modelli a istruzioni e "thought_suppress" per i modelli di ragionamento.method: Metodo per calcolare i vettori candidati. Opzioni disponibili: WMD (differenza delle medie pesata), MD (differenza delle medie). Il metodo predefinito è WMD.n_train, n_valid: Numero di esempi di addestramento e validazione. Se -1, vengono usati tutti gli esempi.threshold: Punteggio soglia per etichettare gli esempi censurati/non censurati.filter_layer_pct: Filtra l'ultimo N% dei layer.save_dir: Percorso della directory per salvare i risultati.(Per l'applicazione dei vettori di steering)
run_steering: Applica il vettore di steering trovato.compute_projection: Calcola le proiezioni scalari.datasets: Dataset a cui applicare lo steering. (Vedi i dataset disponibili qui sotto)layer_ids: ID dei layer su cui intervenire. Di default usa solo il layer superiore identificato durante la validazione del vettore.coeff: Esegui con un singolo valore di coefficiente.min_coeff: Coefficiente minimo.max_coeff: Coefficiente massimo.increment: Incremento del coefficiente.max_new_tokens: Numero massimo di token generati.num_return_sequences: Numero di sequenze generate per input.top_p: Valore top p per il campionamento.temperature: Temperatura per il campionamento.(Argomenti comuni)
config_file: Percorso del file di configurazione YAML.use_cache: Riutilizza i risultati memorizzati nella cache. Utile se devi riprendere il processo ma non vuoi rieseguire tutto. Lo script riutilizzerà/salterà gli artefatti salvati (ad es. dati di addestramento/validazione preprocessati, uscite generate con un coefficiente).batch_size: Dimensione del batch per l'estrazione delle attivazioni.generation_batch_size: Dimensione del batch per eseguire la generazione.seed: Seme casuale.Dataset disponibili:
jailbreakbench: Split dannosa da JailbreakBench.sorrybench: Set completo di prompt da SorryBench.alpaca_test_sampled: 300 prompt campionati da Alpaca-Cleaned.xstest_safe, xstest_unsafe: Set completo di prompt da XSTest.ccp_sensitive: Prompt CCP Sensitive che coprono 68 diversi argomenti sensibili. Ogni argomento ha 20 prompt.ccp_sensitive_sampled: Un set più piccolo di CCP Sensitive, che contiene 5 prompt per argomento.deccp_censored: Split censurata da deccp.Per valutare le uscite generate con WildGuard, esegui:
python -m llm_steering.run_eval \
--config_file CONFIG_FILE_PATH \
--batch_size BATCH_SIZE \
--run_wildguard
Lo script elaborerà tutti i file delle uscite del modello salvati in SAVE_DIR/evaluation/. Aggiungi --use_cache per saltare quelli già elaborati.
WildGuard fornisce tre tipi di rilevamento e produce uscite nel seguente formato:
Harmful request: yes
Response refusal: yes
Harmful response: no
Estraiamo la probabilità del token "yes" o "no" per ogni tipo di rilevamento. I risultati verranno aggiunti allo stesso file delle uscite generate.
Se trovi utile questo lavoro, considera di citare il nostro articolo:
@inproceedings{cyberey2025steering,
title={Steering the CensorShip: Uncovering Representation Vectors for {LLM} ''Thought'' Control},
author={Hannah Cyberey and David Evans},
booktitle={Second Conference on Language Modeling},
year={2025}
}