Игорь Градов
Игорь Градов
7 мин
ai

Activation steering без выбросов: PCA вместо среднего делает вектор устойчивым

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

Activation steering без выбросов: PCA вместо среднего делает вектор устойчивым
Почему это важно

Классический способ строить вектор управления (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 часа на первый прогон с экспериментами

Пошаговая инструкция

  1. Установите библиотеки. В терминале или ячейке Colab выполните:
pip install repeng pyreft transformers torch
  1. Подготовьте контрастные пары. Каждая пара состоит из двух промптов: один выражает целевое поведение (например, толерантный ответ), второй — противоположное. Формат для repeng требует двух шаблонов, экспериментальный и контрольный:
positive_template = "Act as a tolerant, respectful assistant. {stimulus}"
negative_template = "Act as a rude, dismissive assistant. {stimulus}"
  1. Снимите активации через 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)
  1. Проверьте знак вектора. После того как PCA нашёл ось, нужно убедиться, что положительное направление действительно соответствует нужному поведению. Возьмите 5 проверочных промптов, сгенерируйте ответы с вектором и без него, сравните вручную. Если эффект инвертирован, умножьте вектор на −1.

  2. Примените вектор при генерации. Вектор добавляется к активациям модели во время инференса с заданным коэффициентом:

# Коэффициент от 1.0 до 3.0, подбирается экспериментально
model.set_control(vector, coeff=1.5)
output = model.generate(input_ids, max_new_tokens=128)
model.reset()
  1. Альтернатива: обучаемый 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)
  1. Сравните результаты. Прогоните одинаковые тестовые промпты через три варианта: базовую модель, модель с 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.

Мнение редакции dzen.guru

Activation steering, на мой взгляд, находится ровно в той точке, где теория уже красивая, а практика ещё сырая. PCA-вектор из repeng действительно устойчивее наивного среднего, мы это проверяли. Но результат сильно зависит от качества контрастных пар. Если вы не готовы вручную вычитать и поправить хотя бы 50 пар, лучше начните с хорошего системного промпта и дообучения на десятке примеров.

Честная оговорка: ни repeng, ни pyreft не гарантируют, что модель будет вести себя предсказуемо на всех промптах. Это инструмент точечного управления, а не волшебная кнопка. На провокационных промптах, которых не было в обучающей выборке, эффект может исчезнуть. Тестируйте на реальных пользовательских запросах, а не только на своих примерах.

Activation steering через PCA и LoRA-адаптеры уже позволяет управлять поведением открытых моделей без дорогого дообучения. Начинайте с repeng и 30 пар, проверяйте знак вектора вручную и не ставьте коэффициент выше 2.0, пока не убедитесь, что генерация стабильна.

Научитесь работать с нейросетями на практике

В dzen.guru мы разбираем инструменты ИИ для авторов и предпринимателей, от промптов до тонкой настройки моделей.

Попробовать бесплатно
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Генеалогия с ИИ: как построить родословную без зарубежных сервисов и риска потери данных
ai

Генеалогия с ИИ: как построить родословную без зарубежных сервисов и риска потери данных

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

7 мин
AI разработка платформы за 2,5 месяца: двое ускорили открытие магазинов сети в 4 раза
ai

AI разработка платформы за 2,5 месяца: двое ускорили открытие магазинов сети в 4 раза

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

5 мин
Contextual Retrieval для RAG нейросети: контекст чанков снижает ошибки поиска в разы
ai

Contextual Retrieval для RAG нейросети: контекст чанков снижает ошибки поиска в разы

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

6 мин