
Code für „Die Zensur steuern: Aufdecken von Repräsentationsvektoren für die ‚Gedanken‘-Kontrolle von LLMs“
Dieses Repository enthält die Codeimplementierung für Steering the CensorShip: Uncovering Representation Vectors for LLM "Thought" Control von Hannah Cyberey und David Evans.
Wir stellen eine Methode vor, die „Steering Vectors“ aus den Interna von LLMs findet, um das Ausmaß der Zensur in Modellausgaben zu erkennen und zu steuern. Eine kurze Übersicht unserer Arbeit findest du in diesem Blogbeitrag.
Probiere unsere Demos aus:
HINWEIS: Beide Demos erfordern ein Huggingface-Konto. Sie werden mit Huggingfaces ZeroGPU gehostet, das allen Benutzern mit einem begrenzten täglichen Nutzungskontingent kostenlos zur Verfügung steht.
Lade das Repository herunter:
git clone https://github.com/hannahxchen/llm-censorship-steering.git
cd llm-censorship-steering
Erstelle eine virtuelle Umgebung mit Python 3.11+ und aktiviere sie:
conda create -y -n censorship-steering python=3.11
conda activate censorship-steering
Installiere die Abhängigkeiten:
pip install -r requirements.txt
Einen Steering Vector finden
Um einen Zensur-Steering-Vector für ein Instruktionsmodell zu finden, führe Folgendes aus:
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
Eine Konfigurationsdatei wird im angegebenen Verzeichnis gespeichert. Alternativ kannst du python -m llm_steering.run --config_file CONFIG_FILE verwenden, indem du eine YAML-Konfigurationsdatei übergibst, die dem in llm_steering/config.py definierten Format folgt.
Für Reasoning-Modelle verwenden wir die folgende Konfiguration:
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
Anwenden des Steering Vectors
Verwende den folgenden Befehl, um den Steering Vector anzuwenden:
python -m llm_steering.run
--run_steering \
--config_file SAVE_DIR/config.yaml \
--generation_batch_size 8 \
--coeff -1 \
--datasets jailbreakbench ccp_sensitive
Du kannst entweder einen einzelnen Koeffizienten mit --coeff festlegen oder einen Koeffizientenbereich mit --min_coeff, --max_coeff und --increment angeben. Standardmäßig werden Werte von -1 bis 1 mit einer Schrittweite von 0,2 angewendet. Alle Modellausgaben werden unter SAVE_DIR/evaluation/ gespeichert.
Alle Argumente von llm_steering/run.py:
(Für Training und Validierung)
model_name: Verwende den Namen des Modell-Repositorys auf Huggingface.censor_type: Verwende „refusal“ für Instruktionsmodelle und „thought_suppress“ für Reasoning-Modelle.method: Methode zur Berechnung von Kandidatenvektoren. Verfügbare Optionen: WMD (gewichtete Mittelwertdifferenz), MD (Differenz der Mittelwerte). Standardmethode ist WMD.n_train, n_valid: Anzahl der Trainings- und Validierungsbeispiele. Bei -1 werden alle Beispiele verwendet.threshold: Schwellenwert für die Kennzeichnung von zensierten/nicht zensierten Beispielen.filter_layer_pct: Filtert die letzten N Prozent der Layer.save_dir: Verzeichnispfad zum Speichern der Ergebnisse.(Zum Anwenden von Steering Vectors)
run_steering: Wende den gefundenen Steering Vector an.compute_projection: Berechne skalare Projektionendatasets: Datensatz/Datensätze, auf die das Steering angewendet werden soll. (Siehe unten verfügbare Datensätze)layer_ids: Layer-ID(s), an denen eingegriffen werden soll. Standardmäßig wird nur die oberste Schicht verwendet, die während der Vektorvalidierung ermittelt wurde.coeff: Führe einen einzelnen Koeffizientenwert aus.min_coeff: Minimaler Koeffizient.max_coeff: Maximaler Koeffizientincrement: Schrittweite des Koeffizienten.max_new_tokens: Maximale Anzahl generierter Tokens.num_return_sequences: Anzahl generierter Sequenzen pro Eingabe.top_p: Top-p-Wert für das Sampling.temperature: Temperatur für das Sampling.(Allgemeine Argumente)
config_file: Pfad zur YAML-Konfigurationsdatei.use_cache: Wiederverwenden gespeicherter Cache-Ergebnisse. Nützlich, wenn du den Prozess fortsetzen möchtest, aber nicht alles erneut ausführen willst. Das Skript verwendet/überspringt die gespeicherten Artefakte (z. B. vorverarbeitete Trainings-/Validierungsdaten, mit einem Koeffizienten erzeugte Ausgaben).batch_size: Batchgröße zum Extrahieren von Aktivierungen.generation_batch_size: Batchgröße für die Generierung.seed: Zufallsseed.Verfügbare Datensätze:
jailbreakbench: Schädlicher Teil von JailbreakBench.sorrybench: Voller Satz an Prompts von SorryBench.alpaca_test_sampled: 300 aus Alpaca-Cleaned gesampelte Prompts.xstest_safe, xstest_unsafe: Voller Satz an Prompts von XSTest.ccp_sensitive: CCP Sensitive-Prompts, die 68 verschiedene sensible Themen abdecken. Jedes Thema enthält 20 Prompts.ccp_sensitive_sampled: Eine kleinere Menge von CCP Sensitive mit 5 Prompts pro Thema.deccp_censored: Zensierter Teil von deccp.Um die generierten Ausgaben mit WildGuard zu evaluieren, führe Folgendes aus:
python -m llm_steering.run_eval \
--config_file CONFIG_FILE_PATH \
--batch_size BATCH_SIZE \
--run_wildguard
Das Skript verarbeitet alle Dateien mit Modellausgaben, die unter SAVE_DIR/evaluation/ gespeichert sind. Füge --use_cache hinzu, um bereits verarbeitete Dateien zu überspringen.
WildGuard bietet drei Arten der Erkennung und erzeugt Ausgaben im folgenden Format:
Harmful request: yes
Response refusal: yes
Harmful response: no
Wir extrahieren die Wahrscheinlichkeit des Tokens „yes“ oder „no“ für jede Erkennungsart. Die Ergebnisse werden zu derselben Datei wie die generierten Ausgaben hinzugefügt.
Wenn du diese Arbeit nützlich findest, ziehe bitte in Betracht, unser Paper zu zitieren:
@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}
}