RepE: Хак активаций нейросети для снижения галлюцинаций LLM | AiManual
AiManual Logo Ai / Manual.
29 Дек 2025 Гайд

RepE: Как хакнуть активации нейросети и заставить её меньше галлюцинировать

Полный гайд по Representation Engineering (RepE) — как управлять активационными слоями LLM, чтобы снизить энтропию и заставить модель меньше галлюцинировать.

Проблема: Почему LLM так часто галлюцинируют?

Если вы работали с большими языковыми моделями (LLM), вы наверняка сталкивались с ситуацией, когда модель уверенно говорит неправду, придумывает факты или даёт опасные советы. Это явление называется галлюцинациями, и оно связано с фундаментальной проблемой современных нейросетей — высокой энтропией в активационных слоях.

Традиционные методы контроля (системные промпты, fine-tuning, RLHF) работают на уровне ввода-вывода, но не затрагивают внутренние представления модели. Representation Engineering (RepE) предлагает другой подход: прямое вмешательство в активационные паттерны нейросети во время инференса.

Ключевая идея: Галлюцинации возникают из-за «шумных» активаций в промежуточных слоях модели. Если мы сможем контролировать эти активации, мы сможем управлять уровнем уверенности и креативности модели.

Решение: Representation Engineering (RepE)

RepE — это методология, позволяющая находить «направления» в пространстве активаций, соответствующие определённым концепциям (правдивость, креативность, токсичность), и затем манипулировать ими во время генерации текста.

В отличие от методов вроде fine-tuning или RLHF, которые требуют переобучения модели, RepE работает в реальном времени и не меняет веса модели.

1 Находим «направления» правдивости

Первым шагом нужно собрать два набора данных: примеры, где модель говорит правду (ground truth), и примеры, где она галлюцинирует. Затем мы прогоняем эти примеры через модель и собираем активации из промежуточных слоев.

import torch
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer

# Загружаем модель и токенизатор
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B-Instruct", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")

# Хук для сбора активаций
activations = {}
def get_activation(name):
    def hook(model, input, output):
        activations[name] = output.detach()
    return hook

# Регистрируем хук для последнего слоя MLP
model.model.layers[-1].mlp.register_forward_hook(get_activation("last_mlp"))

# Собираем активации для правдивых и ложных утверждений
truthful_acts = []
hallucinated_acts = []

# Примеры правдивых утверждений (нужно собрать реальный датасет)
truthful_examples = [
    "Столица Франции — Париж.",
    "Вода кипит при 100 градусах Цельсия.",
    "Python — это интерпретируемый язык программирования."
]

# Примеры галлюцинаций (можно сгенерировать, попросив модель придумать факты)
hallucinated_examples = [
    "Столица Франции — Лион.",
    "Вода кипит при 80 градусах Цельсия.",
    "Python — это компилируемый язык, как C++."
]

for example in truthful_examples:
    inputs = tokenizer(example, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs)
    truthful_acts.append(activations["last_mlp"].mean(dim=1))

# Аналогично для hallucinated_examples...

2 Вычисляем вектор направления

После сбора активаций мы вычисляем разницу между средними активациями для правдивых и ложных утверждений. Этот вектор и будет нашим «направлением правдивости».

# Преобразуем списки в тензоры
truthful_tensor = torch.stack(truthful_acts).mean(dim=0)
hallucinated_tensor = torch.stack(hallucinated_acts).mean(dim=0)

# Вычисляем вектор направления
direction = truthful_tensor - hallucinated_tensor
direction = direction / direction.norm()  # Нормализуем

print(f"Размерность вектора направления: {direction.shape}")
print(f"Норма вектора: {direction.norm().item():.4f}")
💡
Вектор направления — это по сути «разница в паттернах активаций» между правдивым и галлюцинирующим поведением. Чем больше его норма, тем сильнее различаются эти состояния.

3 Инжектируем направление во время инференса

Теперь, когда у нас есть вектор направления, мы можем модифицировать активации модели во время генерации текста, добавляя или вычитая этот вектор с определённым коэффициентом (коэффициентом усиления).

def intervene_inference(prompt, direction, coefficient=0.5, layer_index=-1):
    """Генерируем текст с инжекцией направления в активации"""
    
    # Функция для модификации активаций во время forward pass
    def intervention_hook(module, input, output):
        # Добавляем направление к активациям
        modified_output = output + coefficient * direction.to(output.device)
        return modified_output
    
    # Регистрируем хук для целевого слоя
    hook = model.model.layers[layer_index].mlp.register_forward_hook(
        intervention_hook
    )
    
    # Генерация с модифицированными активациями
    inputs = tokenizer(prompt, return_tensors="pt")
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=100,
            do_sample=True,
            temperature=0.7,
        )
    
    # Удаляем хук после генерации
    hook.remove()
    
    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# Тестируем
prompt = "Расскажи мне о физических свойствах воды..."
original_output = "..."  # Генерация без вмешательства
modified_output = intervene_inference(prompt, direction, coefficient=0.3)

print("Оригинальная генерация:", original_output[:200])
print("\nМодифицированная генерация:", modified_output[:200])

Пошаговый план внедрения RepE

Этап Действие Ожидаемый результат
1. Подготовка Собрать датасет правдивых/ложных утверждений для вашей предметной области 100-500 примеров каждого типа
2. Анализ Определить, какие слои модели наиболее информативны для вашей задачи Список из 3-5 целевых слоёв
3. Вычисление Вычислить векторы направления для каждого слоя Набор векторов размерности hidden_size
4. Калибровка Подобрать оптимальные коэффициенты усиления для каждого слоя Коэффициенты от -1.0 до +1.0
5. Внедрение Интегрировать вмешательство в pipeline инференса Рабочий прототип с уменьшенными галлюцинациями

Нюансы и возможные ошибки

Предупреждение: Слишком сильное вмешательство (большой коэффициент) может сделать модель слишком консервативной или даже «заглушить» её креативность. Начинайте с малых значений (0.1-0.3).

Ошибка 1: Неправильный выбор слоя

Не все слои одинаково полезны для контроля галлюцинаций. Ранние слои часто отвечают за базовые паттерны языка, а поздние — за семантику и логику. Для контроля правдивости лучше подходят слои в последней трети модели.

Ошибка 2: Недостаточный датасет

Если у вас мало примеров (менее 50 каждого типа), вектор направления будет шумным и может ухудшить качество генерации. Как и в обучении специализированных моделей, качество данных критически важно.

Ошибка 3: Игнорирование контекстной зависимости

Вектор направления, вычисленный на одном типе промптов, может не работать на других. Например, направление для научных фактов может плохо работать для исторических утверждений. Решение — создавать специализированные векторы для разных доменов.

Практическое применение: RAG + RepE

Одно из самых мощных применений RepE — комбинация с Retrieval-Augmented Generation (RAG). Вместо того чтобы просто подавать контекст в модель, мы можем использовать RepE, чтобы «привязать» модель к этому контексту и снизить вероятность отклонений.

def rag_with_repe(query, retrieved_context, direction, coefficient=0.4):
    """RAG с инжекцией направления правдивости"""
    
    prompt = f"""Используя следующий контекст, ответь на вопрос.
Контекст: {retrieved_context}
Вопрос: {query}
Ответ:"""
    
    # Генерируем с вмешательством
    answer = intervene_inference(prompt, direction, coefficient)
    
    return answer

# Пример использования
query = "Какие свойства у графена?"
context = "Графен — это двумерный материал из углерода..."  # Из вашей векторной БД
answer = rag_with_repe(query, context, direction)
print(answer)

Этот подход особенно полезен при работе с длинными документами в RAG-системах, где модель часто «забывает» контекст и начинает галлюцинировать.

Сравнение с другими методами

Метод Преимущества Недостатки Когда использовать
RepE Работает в реальном времени, не требует переобучения, точечное воздействие Требует анализа активаций, сложная калибровка Когда нужен быстрый контроль без fine-tuning
Fine-tuning Постоянное улучшение, адаптация под домен Требует вычислительных ресурсов, может переобучиться Для специализированных приложений
RLHF Учитывает человеческие предпочтения Сложно и дорого, требует аннотаций Для consumer-facing приложений
Промпт-инжиниринг Простота, не требует изменений модели Ограниченная эффективность, неустойчивость Быстрые прототипы

FAQ: Ответы на частые вопросы

1. RepE работает с любыми моделями?

Да, но эффективность зависит от архитектуры. Лучше всего работает с трансформерами (GPT, LLaMA, Mistral). Для моделей с другими активационными функциями могут потребоваться адаптации.

2. Сколько данных нужно для RepE?

Минимум 50-100 примеров каждого класса (правда/галлюцинация). Чем больше и разнообразнее данные, тем точнее будет вектор направления.

3. Можно ли контролировать не только правдивость?

Абсолютно! RepE можно использовать для контроля креативности, токсичности, формальности стиля и даже юмористического тона. Нужно просто собрать соответствующие датасеты.

4. RepE замедляет инференс?

Минимально — добавляется только операция сложения тензоров. В отличие от методов вроде AETHER-X, RepE не требует изменений в вычислительном графе.

5. Можно ли комбинировать RepE с другими методами?

Да, особенно эффективна комбинация с DevOps-подходами к мониторингу моделей. RepE для реального контроля, мониторинг — для обнаружения аномалий.

Заключение: Когда стоит использовать RepE?

Representation Engineering — это мощный инструмент для тех, кому нужен тонкий контроль над поведением LLM без дорогостоящего переобучения. Особенно полезен он в:

  • Продакшн-системах, где нельзя позволить модели галлюцинировать
  • Исследовательских проектах, где нужно быстро тестировать гипотезы о внутренней работе моделей
  • Специализированных приложениях вроде медицинских или юридических ассистентов
  • Образовательных инструментах, где важна точность информации

Как и любой продвинутый метод, RepE требует понимания внутренней работы нейросетей и аккуратной настройки. Но потраченное время окупается существенным снижением опасных галлюцинаций и повышением надёжности ваших LLM-приложений.

Следующие шаги: Начните с анализа активаций вашей модели на простых примерах. Поэкспериментируйте с разными слоями и коэффициентами. Помните — RepE это не серебряная пуля, а ещё один инструмент в арсенале ML-инженера, который нужно использовать осознанно и в сочетании с другими методами контроля качества генерации.