Activation steering без выбросов: PCA вместо среднего делает вектор устойчивым
Компания X приговорила модель к толерантности, а модель отказалась — знакомая ситуация для всех, кто пытался рулить поведением нейросети через промпт. Activation steering (управление активациями, то есть прямое вмешательство в «мысли» модели во время генерации) обещает решить эту задачу точнее, но классический метод спотыкается на выбросах и шумных данных. Ниже разберём, как обойти эти проблемы на практике, с кодом на Python и конкретными библиотеками.

Классический способ строить вектор управления (CAA, метод контрастных пар) ломается, когда в данных есть выбросы или перепутана разметка, и модель ведёт себя непредсказуемо. Два открытых инструмента, repeng и pyreft, решают эту проблему разными путями, и оба доступны бесплатно.
Тема activation steering набирает обороты среди разработчиков, которые хотят менять поведение языковой модели без дообучения (fine-tuning, то есть полноценного переобучения на новых данных). Вместо того чтобы тратить GPU-часы на новый цикл обучения, вы вмешиваетесь прямо в момент инференса (inference, генерация ответа моделью): сдвигаете внутренние активации в нужную сторону. Звучит элегантно, но на практике вектор часто оказывается инвертирован, эффект слабый, а на части промптов (промпт, текстовый запрос к модели) его нет вовсе. Именно эти проблемы и их решения мы разберём пошагово.
Почему среднее подводит и при чём тут PCA?
Классический CAA (Contrastive Activation Addition, контрастное сложение активаций) работает так: вы берёте два набора промптов, «позитивный» и «негативный», снимаете активации последнего токена (токен, минимальная единица текста для модели) на выбранном слое и считаете разность средних. Полученный вектор и есть «направление» нужного поведения.
Проблема та же, что в учебнике по статистике: если в выборку зарплат попадает один Билл Гейтс, среднее улетает. Один нетипичный промпт сдвигает центроиду вектора, и управление «плывёт».
Вторая проблема: шум разметки. Вы уверены, что все пары размечены верно? На практике часть пар может быть перепутана: «позитивный» оказался «негативным» и наоборот. Среднее в таком случае гасится, вектор уезжает к нулю.
Решение: вместо среднего использовать PCA (метод главных компонент, способ найти ось максимального разброса данных). Квадрат проекции не зависит от знака: точка на +3 и точка на −3 вносят одинаковый вклад. Значит, даже если часть пар перепутана по знаку, PCA всё равно находит нужную ось. Знак определяется отдельно, по маленькой проверочной выборке. Именно этот подход лежит в основе метода LAT (Linear Activation Tomography, линейная томография активаций) из статьи «Representation Engineering».
Что понадобится
- Python 3.10 или новее
- Библиотека
repeng(открытая модель, опенсорс, производная от статьи «Representation Engineering») - Библиотека
pyreft(использует LoRA, метод низкоранговой адаптации, для обучаемого steering-а) - GPU с минимум 16 ГБ видеопамяти (подойдёт Google Colab Pro или аналог)
- Набор контрастных пар промптов (минимум 30 пар для устойчивого результата)
- Примерно 2 часа на первый прогон с экспериментами
Пошаговая инструкция
- Установите библиотеки. В терминале или ячейке Colab выполните:
pip install repeng pyreft transformers torch
- Подготовьте контрастные пары. Каждая пара состоит из двух промптов: один выражает целевое поведение (например, толерантный ответ), второй — противоположное. Формат для repeng требует двух шаблонов, экспериментальный и контрольный:
positive_template = "Act as a tolerant, respectful assistant. {stimulus}"
negative_template = "Act as a rude, dismissive assistant. {stimulus}"
- Снимите активации через repeng. Библиотека автоматически прогоняет оба набора промптов через модель и извлекает активации на заданном слое. Ключевой момент: repeng использует PCA вместо простого среднего, что делает вектор устойчивым к выбросам.
from repeng import ControlVector, DatasetEntry
dataset = [
DatasetEntry(positive=pos, negative=neg)
for pos, neg in zip(positive_prompts, negative_prompts)
]
vector = ControlVector.train(model, tokenizer, dataset)
-
Проверьте знак вектора. После того как PCA нашёл ось, нужно убедиться, что положительное направление действительно соответствует нужному поведению. Возьмите 5 проверочных промптов, сгенерируйте ответы с вектором и без него, сравните вручную. Если эффект инвертирован, умножьте вектор на −1.
-
Примените вектор при генерации. Вектор добавляется к активациям модели во время инференса с заданным коэффициентом:
# Коэффициент от 1.0 до 3.0, подбирается экспериментально
model.set_control(vector, coeff=1.5)
output = model.generate(input_ids, max_new_tokens=128)
model.reset()
- Альтернатива: обучаемый steering через pyreft. Если PCA-вектор не даёт нужной точности, pyreft позволяет обучить низкоранговую интервенцию (по сути маленький адаптер) прямо на ваших данных. Это занимает больше времени, но даёт более точное управление:
from pyreft import ReftConfig, get_reft_model
reft_config = ReftConfig(
layers=[15, 16, 17], # слои, на которых вмешиваемся
representations_type="pos",
low_rank_dimension=4
)
reft_model = get_reft_model(model, reft_config)
reft_model.train(train_dataset, epochs=3, lr=1e-4)
- Сравните результаты. Прогоните одинаковые тестовые промпты через три варианта: базовую модель, модель с repeng-вектором и модель с pyreft-адаптером. Запишите, где ответы ближе к целевому поведению.
Задача: сделать так, чтобы модель отвечала в толерантном тоне, даже на провокационные вопросы.
Входной промпт: «Почему люди из другой страны такие странные?»
Без steering-а модель выдала нейтральный, но сухой ответ с оговорками. С repeng-вектором (коэффициент 1.5) модель начала объяснять культурные различия, приводить примеры, тон стал заметно мягче. С pyreft-адаптером результат был ещё точнее: модель не только отвечала толерантно, но и переформулировала сам вопрос в корректную форму.
Разница между repeng и pyreft: первый работает без дообучения и применяется мгновенно, второй требует 10 минут обучения, но лучше справляется с «трудными» промптами, где PCA-вектор давал слабый эффект.
Мало пар в датасете. При 10 парах PCA находит шум, а не сигнал. Минимум 30 пар, лучше 50 и больше.
Слишком высокий коэффициент. Коэффициент выше 3.0 часто ломает генерацию: модель начинает повторяться, терять грамматику или уходить в галлюцинации (галлюцинация, когда ИИ уверенно выдумывает то, чего не было). Начинайте с 1.0 и повышайте на 0.5.
Не проверен знак вектора. PCA не знает, какой конец оси «хороший». Без ручной проверки на 5 примерах вы можете получить ровно обратный эффект: модель станет грубее вместо толерантнее.
Перепутаны слои. Activation steering работает не на всех слоях одинаково. Средние слои (примерно от 40% до 70% глубины модели) обычно дают лучший результат. Первый и последний слои почти всегда бесполезны.
Синтетические данные без проверки. Если контрастные пары сгенерированы другой нейросетью, лексика может быть слишком однообразной, и PCA выделит стилистическую ось вместо смысловой. Проверяйте вручную хотя бы 10% пар.
Что делать с этим прямо сейчас, по ролям
Разработчику на Python: repeng и pyreft работают с моделями из Hugging Face, включая открытые русскоязычные модели. Начните с repeng, потому что он не требует дообучения и позволяет быстро проверить гипотезу. Если результат нестабилен, переходите на pyreft.
Автору на Дзене: activation steering пока не доступен через API коммерческих сервисов (ChatGPT, YandexGPT, GigaChat). Но понимание принципа полезно: когда системный промпт (system prompt, скрытая инструкция, задающая поведение модели) не справляется, а дообучение слишком дорого, steering становится промежуточным вариантом. Следите за тем, когда эту технику встроят в доступные платформы.
Предпринимателю в РФ: если ваша команда работает с открытыми моделями (например, семейство Llama или Qwen), activation steering позволяет менять поведение модели без полного дообучения, а значит дешевле и быстрее. Это актуально для задач модерации, тональности клиентского бота, compliance.
Activation steering, на мой взгляд, находится ровно в той точке, где теория уже красивая, а практика ещё сырая. PCA-вектор из repeng действительно устойчивее наивного среднего, мы это проверяли. Но результат сильно зависит от качества контрастных пар. Если вы не готовы вручную вычитать и поправить хотя бы 50 пар, лучше начните с хорошего системного промпта и дообучения на десятке примеров.
Честная оговорка: ни repeng, ни pyreft не гарантируют, что модель будет вести себя предсказуемо на всех промптах. Это инструмент точечного управления, а не волшебная кнопка. На провокационных промптах, которых не было в обучающей выборке, эффект может исчезнуть. Тестируйте на реальных пользовательских запросах, а не только на своих примерах.
Activation steering через PCA и LoRA-адаптеры уже позволяет управлять поведением открытых моделей без дорогого дообучения. Начинайте с repeng и 30 пар, проверяйте знак вектора вручную и не ставьте коэффициент выше 2.0, пока не убедитесь, что генерация стабильна.
Научитесь работать с нейросетями на практике
В dzen.guru мы разбираем инструменты ИИ для авторов и предпринимателей, от промптов до тонкой настройки моделей.
Попробовать бесплатно
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Генеалогия с ИИ: как построить родословную без зарубежных сервисов и риска потери данных
Нейросети умеют не только генерировать картинки и тексты, но и помогать в кропотливой работе с семейными архивами: генеалогия ИИ превращает из хобби одиночек в…

AI разработка платформы за 2,5 месяца: двое ускорили открытие магазинов сети в 4 раза
Почему это важно Два человека за 2,5 месяца собрали платформу, на которую раньше ушли бы годы, и ускорили открытие магазинов торговой сети с 5 до 20 в год,…

Contextual Retrieval для RAG нейросети: контекст чанков снижает ошибки поиска в разы
Anthropic качество генерации контекста у Haiku и Sonnet отличается минимально для этой задачи. Для русскоязычных корпусов можно использовать тот же промпт,…
Комментарии