
Код для «Управление цензурой: выявление векторов представлений для контроля „мыслей“ LLM»
Этот репозиторий содержит реализацию кода для «Направляя цензуру: раскрытие векторов представлений для управления „мыслями" LLM» от Hannah Cyberey и David Evans.
Мы представляем метод, который находит «векторы управления» во внутренних представлениях LLM для обнаружения и контроля уровня цензуры в выходах моделей. Ознакомьтесь с этим блог-постом для краткого обзора нашей работы.
Попробуйте наши демо:
ПРИМЕЧАНИЕ: Обе демо-версии требуют учетной записи Huggingface. Они размещены на ZeroGPU от Huggingface, который бесплатен для всех пользователей с ограниченной дневной квотой использования.
Скачайте репозиторий:
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
Файл конфигурации будет сохранен в указанную директорию. В качестве альтернативы вы можете использовать python -m llm_steering.run --config_file CONFIG_FILE, передав YAML-файл конфигурации в формате, определенном в llm_steering/config.py.
Для моделей рассуждений мы используем следующую конфигурацию:
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. По умолчанию применяются значения от -1 до 1 с шагом 0.2. Все выходы моделей будут сохранены в 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: Идентификатор(ы) слоя(ёв) для вмешательства. По умолчанию используется только верхний слой, определённый при валидации вектора.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: 300 промптов, отобранных из Alpaca-Cleaned.xstest_safe, xstest_unsafe: Полный набор промптов из XSTest.ccp_sensitive: Промпты CCP Sensitive, охватывающие 68 различных чувствительных тем. Для каждой темы — 20 промптов.ccp_sensitive_sampled: Уменьшенный набор CCP Sensitive, содержащий 5 промптов на тему.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}
}