
'검열 조종하기: LLM "사고" 제어를 위한 표현 벡터 발견'
이 저장소는 Hannah Cyberey와 David Evans의 검열 스티어링: LLM "사고" 제어를 위한 표현 벡터 발견 논문의 코드 구현을 포함합니다.
우리는 LLM 내부에서 "스티어링 벡터"를 찾아 모델 출력의 검열 수준을 감지하고 제어하는 방법을 소개합니다. 이 블로그 게시물에서 우리 작업에 대한 간략한 개요를 확인하세요.
데모를 사용해 보세요:
참고: 두 데모 모두 Huggingface 계정이 필요합니다. Huggingface의 ZeroGPU로 호스팅되며, 일일 사용량 제한이 있는 모든 사용자에게 무료입니다.
저장소를 다운로드합니다:
git clone https://github.com/hannahxchen/llm-censorship-steering.git
cd llm-censorship-steering
Python 3.11+ 가상 환경을 만들고 활성화합니다:
conda create -y -n censorship-steering python=3.11
conda activate censorship-steering
의존성을 설치합니다:
pip install -r requirements.txt
스티어링 벡터 찾기
명령형 모델에 대한 검열 스티어링 벡터를 찾으려면 다음을 실행하세요:
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
구성 파일이 지정된 디렉터리에 저장됩니다. 또는 llm_steering/config.py에 정의된 형식에 따라 YAML 구성 파일을 전달하여 python -m llm_steering.run --config_file CONFIG_FILE을 사용할 수 있습니다.
추론 모델의 경우 다음 구성을 사용합니다:
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
스티어링 벡터 적용
다음 명령을 사용하여 스티어링 벡터를 적용합니다:
python -m llm_steering.run
--run_steering \
--config_file SAVE_DIR/config.yaml \
--generation_batch_size 8 \
--coeff -1 \
--datasets jailbreakbench ccp_sensitive
--coeff로 단일 계수를 설정하거나 --min_coeff, --max_coeff, --increment로 계수 범위를 설정할 수 있습니다. 기본적으로 0.2 간격으로 -1부터 1까지의 값을 적용합니다. 모든 모델 출력은 SAVE_DIR/evaluation/에 저장됩니다.
llm_steering/run.py의 모든 인자:
(학습 및 검증용)
model_name: Huggingface의 모델 저장소 이름을 사용합니다.censor_type: 명령형 모델에는 "refusal"을, 추론 모델에는 "thought_suppress"를 사용합니다.method: 후보 벡터를 계산하는 방법. 사용 가능한 옵션: WMD (가중 평균 차이), MD (평균 차이). 기본 방법은 WMD입니다.n_train, n_valid: 학습 및 검증 예제 수. -1이면 모든 예제를 사용합니다.threshold: 검열/비검열 예제를 분류하기 위한 임계값 점수.filter_layer_pct: 마지막 N% 레이어를 필터링합니다.save_dir: 결과를 저장할 디렉터리 경로.(스티어링 벡터 적용용)
run_steering: 찾은 스티어링 벡터를 적용합니다.compute_projection: 스칼라 투영값을 계산합니다.datasets: 스티어링을 적용할 데이터셋. (아래 사용 가능한 데이터셋 참조)layer_ids: 개입할 레이어 ID. 기본값은 벡터 검증 중에 식별된 최상위 레이어만 사용합니다.coeff: 단일 계수 값을 실행합니다.min_coeff: 최소 계수.max_coeff: 최대 계수.increment: 계수의 증가 간격.max_new_tokens: 생성할 최대 토큰 수.num_return_sequences: 입력당 생성할 시퀀스 수.top_p: 샘플링을 위한 top p 값.temperature: 샘플링을 위한 온도.(공통 인자)
config_file: YAML 구성 파일 경로.use_cache: 저장된 캐시 결과를 재사용합니다. 프로세스를 재개해야 하지만 전체를 다시 실행하고 싶지 않을 때 유용합니다. 스크립트는 저장된 아티팩트(예: 전처리된 학습/검증 데이터, 계수로 생성된 출력)를 재사용/건너뜁니다.batch_size: 활성화 추출을 위한 배치 크기.generation_batch_size: 생성 실행을 위한 배치 크기.seed: 랜덤 시드.사용 가능한 데이터셋:
jailbreakbench: JailbreakBench의 유해 분할.sorrybench: SorryBench의 전체 프롬프트 세트.alpaca_test_sampled: Alpaca-Cleaned에서 샘플링된 300개의 프롬프트.xstest_safe, xstest_unsafe: XSTest의 전체 프롬프트 세트.ccp_sensitive: CCP Sensitive 프롬프트로 68개의 다양한 민감 주제를 다룹니다. 각 주제에는 20개의 프롬프트가 있습니다.ccp_sensitive_sampled: 주제당 5개의 프롬프트가 포함된 더 작은 CCP Sensitive 세트.deccp_censored: deccp의 검열 분할.WildGuard로 생성된 출력을 평가하려면 다음을 실행하세요:
python -m llm_steering.run_eval \
--config_file CONFIG_FILE_PATH \
--batch_size BATCH_SIZE \
--run_wildguard
스크립트는 SAVE_DIR/evaluation/ 아래에 저장된 모든 모델 출력 파일을 처리합니다. 이미 처리된 파일을 건너뛰려면 --use_cache를 추가하세요.
WildGuard는 세 가지 유형의 탐지를 제공하며 다음 형식으로 출력을 생성합니다:
Harmful request: yes
Response refusal: yes
Harmful response: no
각 탐지 유형에 대해 "yes" 또는 "no" 토큰의 확률을 추출합니다. 결과는 생성된 출력과 같은 파일에 추가됩니다.
이 작업이 유용하다고 생각되면 다음 논문을 인용해 주세요:
@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}
}