
Código para 'Dirigiendo la Censura: Descubriendo Vectores de Representación para el Control del "Pensamiento" de LLM'
Este repositorio contiene la implementación del código de Dirigiendo la Censura: Descubriendo Vectores de Representación para el Control del "Pensamiento" en LLM por Hannah Cyberey y David Evans.
Presentamos un método que encuentra "vectores de dirección" a partir de las representaciones internas de los LLM para detectar y controlar el nivel de censura en las salidas del modelo. Consulta esta entrada de blog para una breve descripción de nuestro trabajo.
Prueba nuestras demos:
NOTA: Ambas demos requieren una cuenta de Huggingface. Está alojado con ZeroGPU de Huggingface, que es gratuito para todos los usuarios con una cuota diaria de uso limitada.
Descarga el repositorio:
git clone https://github.com/hannahxchen/llm-censorship-steering.git
cd llm-censorship-steering
Crea un entorno virtual con Python 3.11+ y actívalo:
conda create -y -n censorship-steering python=3.11
conda activate censorship-steering
Instala las dependencias:
pip install -r requirements.txt
Encontrar un vector de dirección
Para encontrar un vector de dirección de censura para un modelo de instrucción, ejecuta:
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
Se guardará un archivo de configuración en el directorio especificado. Alternativamente, puedes usar python -m llm_steering.run --config_file CONFIG_FILE pasando un archivo de configuración YAML, siguiendo el formato definido en llm_steering/config.py.
Para modelos de razonamiento, usamos la siguiente configuración:
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
Aplicando el vector de dirección
Usa el siguiente comando para aplicar el vector de dirección:
python -m llm_steering.run
--run_steering \
--config_file SAVE_DIR/config.yaml \
--generation_batch_size 8 \
--coeff -1 \
--datasets jailbreakbench ccp_sensitive
Puedes establecer un solo coeficiente con --coeff o establecer un rango de coeficientes usando --min_coeff, --max_coeff e --increment. Por defecto, aplica valores de -1 a 1 con un incremento de 0.2. Todas las salidas del modelo se guardarán en SAVE_DIR/evaluation/.
Todos los argumentos de llm_steering/run.py:
(Para entrenamiento y validación)
model_name: Usa el nombre del repositorio del modelo en Huggingface.censor_type: Usa "refusal" para modelos de instrucción y "thought_suppress" para modelos de razonamiento.method: Método para calcular vectores candidatos. Opciones disponibles: WMD (diferencia de medias ponderada), MD (diferencia de medias). El método predeterminado es WMD.n_train, n_valid: Número de ejemplos de entrenamiento y validación. Si es -1, se usan todos los ejemplos.threshold: Puntuación umbral para etiquetar ejemplos censurados/no censurados.filter_layer_pct: Filtra el último N por ciento de las capas.save_dir: Ruta del directorio para guardar los resultados.(Para aplicar vectores de dirección)
run_steering: Aplica el vector de dirección encontrado.compute_projection: Calcula proyecciones escalares.datasets: Conjunto(s) de datos sobre los que aplicar la dirección. (Consulta los conjuntos de datos disponibles a continuación)layer_ids: Id(s) de capa para intervenir. Por defecto usa solo la capa superior identificada durante la validación del vector.coeff: Ejecuta un único valor de coeficiente.min_coeff: Coeficiente mínimo.max_coeff: Coeficiente máximo.increment: Incremento del coeficiente.max_new_tokens: Número máximo de tokens generados.num_return_sequences: Número de secuencias generadas por entrada.top_p: Valor de top p para el muestreo.temperature: Temperatura para el muestreo.(Argumentos comunes)
config_file: Ruta al archivo de configuración YAML.use_cache: Reutiliza los resultados en caché almacenados. Útil si necesitas reanudar el proceso pero no quieres volver a ejecutar todo. El script reutilizará/omitirá los artefactos guardados (por ejemplo, datos de entrenamiento/validación preprocesados, salidas generadas con un coeficiente).batch_size: Tamaño de lote para extraer activaciones.generation_batch_size: Tamaño de lote para ejecutar la generación.seed: Semilla aleatoria.Conjuntos de datos disponibles:
jailbreakbench: División de daños de JailbreakBench.sorrybench: Conjunto completo de indicaciones de SorryBench.alpaca_test_sampled: 300 indicaciones muestreadas de Alpaca-Cleaned.xstest_safe, xstest_unsafe: Conjunto completo de indicaciones de XSTest.ccp_sensitive: Indicaciones de CCP Sensitive que cubren 68 temas sensibles diferentes. Cada tema tiene 20 indicaciones.ccp_sensitive_sampled: Un conjunto más pequeño de CCP Sensitive, que contiene 5 indicaciones por tema.deccp_censored: División censurada de deccp.Para evaluar las salidas generadas con WildGuard, ejecuta:
python -m llm_steering.run_eval \
--config_file CONFIG_FILE_PATH \
--batch_size BATCH_SIZE \
--run_wildguard
El script procesará todos los archivos de salidas del modelo guardados en SAVE_DIR/evaluation/. Añade --use_cache para omitir los que ya han sido procesados.
WildGuard proporciona tres tipos de detección y produce salidas en el siguiente formato:
Harmful request: yes
Response refusal: yes
Harmful response: no
Extraemos la probabilidad del token "yes" o "no" para cada tipo de detección. Los resultados se añadirán al mismo archivo que las salidas generadas.
Si encuentras útil este trabajo, considera citar nuestro artículo:
@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}
}