
Código para 'Steering the CensorShip: Uncovering Representation Vectors for LLM "Thought" Control'
Este repositório contém a implementação do código para Direcionando a Censura: Descobrindo Vetores de Representação para o Controle do "Pensamento" de LLMs de Hannah Cyberey e David Evans.
Apresentamos um método que encontra "vetores de direcionamento" nas partes internas de LLMs para detectar e controlar o nível de censura nas saídas dos modelos. Confira esta postagem no blog para uma breve visão geral do nosso trabalho.
Experimente nossas demos:
NOTA: Ambas as demonstrações exigem uma conta Huggingface. Elas estão hospedadas com o ZeroGPU da Huggingface, que é gratuito para todos os usuários com uma cota diária de uso limitada.
Baixe o repositório:
git clone https://github.com/hannahxchen/llm-censorship-steering.git
cd llm-censorship-steering
Crie um ambiente virtual com Python 3.11+ e ative-o:
conda create -y -n censorship-steering python=3.11
conda activate censorship-steering
Instale as dependências:
pip install -r requirements.txt
Encontrando um Vetor de Direcionamento
Para encontrar um vetor de direcionamento de censura para um modelo de instrução, execute:
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
Um arquivo de configuração será salvo no diretório especificado. Alternativamente, você pode usar python -m llm_steering.run --config_file CONFIG_FILE passando um arquivo de configuração YAML, seguindo o formato definido em llm_steering/config.py.
Para modelos de raciocínio, usamos a seguinte configuração:
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 o Vetor de Direcionamento
Use o seguinte comando para aplicar o vetor de direcionamento:
python -m llm_steering.run
--run_steering \
--config_file SAVE_DIR/config.yaml \
--generation_batch_size 8 \
--coeff -1 \
--datasets jailbreakbench ccp_sensitive
Você pode definir um único coeficiente com --coeff ou definir um intervalo de coeficientes usando --min_coeff, --max_coeff e --increment. Por padrão, ele aplica valores de -1 a 1 com um incremento de 0.2. Todas as saídas do modelo serão salvas em SAVE_DIR/evaluation/.
Todos os argumentos de llm_steering/run.py:
(Para treinamento e validação)
model_name: Use o nome do repositório do modelo no Huggingface.censor_type: Use "refusal" para modelos de instrução e "thought_suppress" para modelos de raciocínio.method: Método para calcular vetores candidatos. Opções disponíveis: WMD (diferença de médias ponderadas), MD (diferença entre médias). O método padrão é WMD.n_train, n_valid: Número de exemplos de treinamento e validação. Se -1, todos os exemplos são usados.threshold: Pontuação limite para rotular exemplos censurados/não censurados.filter_layer_pct: Filtrar os últimos N por cento das camadas.save_dir: Caminho do diretório para salvar os resultados.(Para aplicar vetores de direcionamento)
run_steering: Aplicar o vetor de direcionamento encontrado.compute_projection: Calcular projeções escalaresdatasets: Conjunto(s) de dados aos quais aplicar o direcionamento. (Veja os conjuntos de dados disponíveis abaixo)layer_ids: ID(s) da(s) camada(s) para intervir. Por padrão, usa apenas a camada principal identificada durante a validação do vetor.coeff: Executar um único valor de coeficiente.min_coeff: Coeficiente mínimo.max_coeff: Coeficiente máximoincrement: Incremento do coeficiente.max_new_tokens: Número máximo de tokens gerados.num_return_sequences: Número de sequências geradas por entrada.top_p: Valor de top p para amostragem.temperature: Temperatura para amostragem.(Argumentos comuns)
config_file: Caminho para o arquivo de configuração YAML.use_cache: Reutilizar resultados em cache armazenados. Útil se você precisar retomar o processo sem querer executar tudo novamente. O script reutilizará/ignorará os artefatos salvos (por exemplo, dados de treinamento/validação pré-processados, saídas geradas com um coeficiente).batch_size: Tamanho do lote para extrair ativações.generation_batch_size: Tamanho do lote para executar a geração.seed: Semente aleatória.Conjuntos de dados disponíveis:
jailbreakbench: Divisão prejudicial do JailbreakBench.sorrybench: Conjunto completo de prompts do SorryBench.alpaca_test_sampled: 300 prompts amostrados do Alpaca-Cleaned.xstest_safe, xstest_unsafe: Conjunto completo de prompts do XSTest.ccp_sensitive: Prompts do CCP Sensitive cobrindo 68 assuntos sensíveis diferentes. Cada assunto tem 20 prompts.ccp_sensitive_sampled: Um conjunto menor de CCP Sensitive, que contém 5 prompts por assunto.deccp_censored: Divisão censurada do deccp.Para avaliar as saídas geradas com WildGuard, execute:
python -m llm_steering.run_eval \
--config_file CONFIG_FILE_PATH \
--batch_size BATCH_SIZE \
--run_wildguard
O script processará todos os arquivos de saídas do modelo salvos em SAVE_DIR/evaluation/. Adicione --use_cache para pular aqueles que já foram processados.
WildGuard fornece três tipos de detecção e produz saídas no seguinte formato:
Harmful request: yes
Response refusal: yes
Harmful response: no
Extraímos a probabilidade do token "yes" ou "no" para cada tipo de detecção. Os resultados serão adicionados ao mesmo arquivo das saídas geradas.
Se você achar este trabalho útil, considere citar nosso artigo:
@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}
}