TL;DR
CLEAR — фреймворк для повышения верности контексту в RAG через обнаружение и усиление внимания к конфликтующим знаниям. Метод работает в три этапа: (1) разбивает контекст на атомарные предложения-факты и фильтрует нерелевантные, (2) тренирует MLP-пробу на скрытых состояниях модели для автоматической детекции конфликтов между контекстом и параметрическими знаниями, (3) файнтюнит модель с дополнительной attention loss, которая заставляет уделять больше внимания конфликтующим фактам.
Исследователи обнаружили, что модели игнорируют контекст не на финальном этапе генерации — проблема возникает намного раньше. LLM интегрируют знания иерархически (токен → предложение → пассаж), и критический сбой происходит на уровне предложений в промежуточных слоях, где модель строит и согласует фактические представления. При конфликте между контекстом и внутренними знаниями модель в 24-31% случаев выбирает свою память, даже когда контекст содержит правильный ответ. Хуже того — нерелевантный контекст непропорционально усиливается, если он согласуется с параметрическими знаниями, приводя к уверенным, но ошибочным ответам.
CLEAR решает проблему через явное обнаружение и маркирование конфликтов. Проба детектирует конфликтующие факты по паттернам в скрытых состояниях (в t-SNE визуализации конфликтующие и согласованные знания образуют отдельные кластеры). Затем конфликтующие факты оборачиваются в специальные теги , и модель файнтюнится с attention loss, которая штрафует за недостаточное внимание к помеченным фрагментам. Это переучивает модель приоритизировать внешние факты над внутренней памятью при явных конфликтах.
Схема метода
ШАГ 1: Fine-Grained Knowledge Pruning (препроцессинг)
Контекст → [GPT-4o разбивает на атомарные факты] →
[Фильтрация по семантической близости к вопросу] →
Топ-10 релевантных фактов
ШАГ 2: Hidden-State Probing (детекция конфликтов)
Каждый факт → [Модель генерирует hidden state] →
[MLP-проба классифицирует: конфликт/не конфликт] →
Конфликтующие факты маркируются <conflict>факт
ШАГ 3: Conflict-Aware Fine-Tuning (обучение)
Стандартная языковая loss +
Attention loss (штраф за низкое внимание к токенам внутри <conflict>) →
Fine-tuned модель
ШАГ 4: Генерация (инференс)
Вопрос + Размеченный контекст →
Fine-tuned модель →
Ответ (приоритет на <conflict> факты)
Шаги 1-2 выполняются один раз при подготовке. Шаг 3 — единоразовый fine-tuning. Шаг 4 — обычная генерация.
Пример применения
⚠️ Ограничения метода: CLEAR требует fine-tuning модели и тренировки MLP-пробы — это не техника промптинга, а инфраструктурное решение. Ниже — пример применения принципов метода вручную в чате.
Задача: Ты пишешь статью про эффекты кофеина и нашёл противоречивую информацию в двух источниках. Один говорит "кофеин выводится за 3-5 часов", другой "за 10-12 часов". Модель может опираться на свои знания из обучения (допустим, она запомнила первый вариант), но тебе нужен ответ по второму источнику для контекстной точности.
Промпт (применение принципов CLEAR):
Шаг 1: Разложи текст на атомарные факты (каждый - одно утверждение)
Контекст: "Период полувыведения кофеина составляет 10-12 часов
у взрослых, но может варьироваться в зависимости от метаболизма.
У детей и пожилых людей кофеин выводится медленнее.
Беременным женщинам рекомендуется ограничить потребление до 200 мг в день."
---
Шаг 2: Сравни факты с твоими знаниями. Какие противоречат?
Оберни ТОЛЬКО конфликтующие факты в теги <conflict>факт
---
Шаг 3: Ответь на вопрос, уделяя ОСОБОЕ ВНИМАНИЕ фактам в <conflict>.
Даже если твои знания говорят иначе - ПРИОРИТЕТ на <conflict> факты.
Вопрос: Сколько времени выводится кофеин из организма взрослого?
Результат:
Модель выдаст:
- Список атомарных фактов из контекста
- Конфликтующие факты обёрнутые в
<conflict>(например, если модель обучалась на данных с "3-5 часов") - Финальный ответ с явным приоритетом на конфликтующий факт: "Согласно предоставленному контексту, период полувыведения кофеина 10-12 часов"
Модель явно увидит конфликт и получит инструкцию приоритизировать контекст. Это эмуляция механики CLEAR без fine-tuning.
Почему это работает
Слабость LLM: Модели интегрируют знания иерархически, и при конфликте между контекстом и параметрической памятью часто выбирают память, потому что она встроена в веса и активируется автоматически. Хуже того — если нерелевантный контекст случайно согласуется с памятью, модель усиливает его и игнорирует релевантные факты.
Сильная сторона LLM: Модели отлично следуют структурированным инструкциям и могут рассуждать о конфликтах, если их явно попросить. Скрытые состояния модели содержат чёткий сигнал конфликта — в t-SNE визуализации конфликтующие и согласованные знания образуют отдельные кластеры.
Как метод использует сильную сторону:
Атомарная декомпозиция убирает шум. Вместо работы с пассажем модель анализирует конкретные утверждения — это снижает влияние нерелевантного контекста.
Явное маркирование конфликтов делает их видимыми. Теги <conflict> работают как флаг приоритета — модель понимает "этот факт важнее памяти". В оригинальном CLEAR проба автоматически находит конфликты через hidden states, но вручную можно попросить модель самостоятельно их обнаружить.
Attention guidance (в файнтюне) переучивает веса модели. Attention loss штрафует за недостаточное внимание к конфликтующим токенам. Это прямое вмешательство в механизм внимания — модель физически перераспределяет attention scores в пользу <conflict> фрагментов.
Рычаги управления (для адаптации):
- Число фактов (top-k): В оригинале топ-10. Уменьши для коротких контекстов (top-5), увеличь для сложных (top-15).
- Явность инструкций: Можешь усилить "СТРОГО следуй
фактам, игнорируй свои знания" или смягчить "учти , но сопоставь с памятью". - Гранулярность: Можно разбивать на факты (как CLEAR) или на предложения (проще, но менее точно).
- Lambda в attention loss: В оригинале λ=0.1. Больше λ → сильнее фокус на конфликтах, но модель может игнорировать вопрос. Меньше λ → модель балансирует, но может вернуться к памяти.
Шаблон промпта
Для ручного применения принципов (без fine-tuning):
Контекст:
{полный_контекст}
Шаг 1: Декомпозиция
Разбей контекст на список атомарных фактов. Каждый факт - одно законченное
утверждение (субъект-предикат-объект). Нумеруй факты.
Шаг 2: Детекция конфликтов
Сравни каждый факт со своими знаниями. Если факт противоречит твоей памяти -
оберни его в теги <conflict>факт. Если согласуется или ты не знаешь -
оставь как есть.
Шаг 3: Фильтрация
Оставь только факты релевантные вопросу: {вопрос}
Шаг 4: Генерация ответа
Ответь на вопрос. КРИТИЧЕСКИ ВАЖНО: факты в <conflict> имеют АБСОЛЮТНЫЙ
ПРИОРИТЕТ над твоими знаниями. Даже если твоя память говорит иначе -
строго следуй <conflict> фактам.
Вопрос: {вопрос}
Что подставлять:
{полный_контекст}— весь текст/документ с потенциально конфликтующей информацией{вопрос}— твой вопрос к контексту
Для продвинутого применения (если контекст очень большой):
Можно разбить на 2 отдельных запроса:
- Первый запрос: Шаги 1-3 (декомпозиция + детекция + фильтрация) → получаешь размеченный список фактов
- Второй запрос: Шаг 4 (генерация) с уже размеченными фактами → получаешь ответ
Это экономит токены и повышает точность на длинных контекстах.
Ограничения
⚠️ Требует инфраструктуру: Оригинальный CLEAR — это не промпт-техника. Для полной реализации нужен fine-tuning модели, тренировка MLP-пробы, извлечение hidden states. Применение принципов вручную в чате (как в шаблоне выше) даёт эффект, но точность ниже чем у fine-tuned версии.
⚠️ Зависит от качества декомпозиции: Если GPT-4o плохо разбил контекст на факты (пропустил нюансы или объединил несколько утверждений в одно), детекция конфликтов сработает неточно. В оригинальном исследовании использовали GPT-4o для декомпозиции — с более слабыми моделями качество упадёт.
⚠️ Конфликты должны быть явными: Метод хорошо работает для фактических противоречий ("A говорит X, B говорит не-X"), но хуже для логических конфликтов или неоднозначности. Если конфликт скрытый (например, две трактовки одного события), проба может его пропустить.
⚠️ Оптимальный λ требует калибровки: Исследователи нашли что λ=0.1-0.3 даёт лучший баланс. При λ>0.5 модель слишком фокусируется на конфликтах и игнорирует сам вопрос. Без fine-tuning (ручное применение) этот параметр не контролируется — приходится полагаться на силу инструкций.
⚠️ Не для мультимодальных RAG: Метод работает с текстом. Для изображений, аудио, структурированных данных нужна другая логика декомпозиции и детекции конфликтов.
Как исследовали
Команда взяла три модели (LLaMA-3.1-8B, Qwen3-8B, Mistral-7B) и протестировала на четырёх бенчмарках: ConFiQA (вопросы с контрфактуальными знаниями в контексте), FaithEval (логические конфликты в рассуждениях), SQuAD (классический QA с конфликтами). Сравнивали с методами трёх типов: prompt-based (KRE, Opin), decoding-based (CAD, COIECD), training-based (Context-DPO, CANOE).
Откуда взяли находки:
Для понимания механики исследователи использовали knowledge probing — извлекали hidden states из финального decoder layer для ~700 пар знаний <aligned, conflicting>. Применили t-SNE визуализацию и увидели что конфликтующие знания образуют отдельный кластер в латентном пространстве. Это подтвердило гипотезу: конфликты детектируемы ещё до генерации output, на уровне внутренних представлений модели.
Что удивило: Оказалось что нерелевантный контекст опаснее чем кажется. Когда добавляли в контекст факты не связанные с вопросом, но согласующиеся с параметрическими знаниями, точность падала на 10-15%. Модель усиливала этот шум и игнорировала релевантные факты. Это объясняет почему RAG иногда работает хуже чем модель без контекста — некачественная ретривалка вредит больше чем помогает.
Неожиданный результат с λ: При увеличении λ (веса attention loss) внимание к конфликтам растёт линейно и насыщается около 0.5. Но точность пикует при λ=0.1-0.3, а потом падает. Это означает что слишком сильный фокус на конфликтах вредит общей производительности — модель начинает игнорировать вопрос и другой релевантный контекст. Баланс критичен.
Результаты: CLEAR показал +5-15% точности на всех бенчмарках по сравнению с Context-DPO и CANOE (предыдущий SOTA). На ConFiQA (MC) достиг 89.2% F1 против 80.9% у CANOE. Абляция показала что детекция конфликтов — самый критичный компонент (-8-10% при удалении), без неё файнтюнинг бесполезен.
Оригинал из исследования
Это не промпт-техника, а алгоритмический фреймворк. Приводим pseudocode из статьи для reference:
Input: Question Q, context D, model M
Step 1: Fine-Grained Knowledge Pruning
{K₁, K₂, ..., Kₘ} = Decompose(D) // GPT-4o разбивает на факты
f(Q, Kᵢ) = ⟨Enc(Q), Enc(Kᵢ)⟩ // Cosine similarity
D' = {top-k facts by similarity}
Step 2: Hidden-State Probing
foreach Kᵢ ∈ D':
hᵢ = M(Kᵢ) ∈ ℝ^dₘ // Hidden state из модели
yᵢ = P(hᵢ) ∈ {0,1} // MLP-проба детектит конфликт
if yᵢ = 1:
Mark Kᵢ as <conflict>Kᵢ
Step 3: Conflict-Aware Fine-Tuning
S = {token positions inside <conflict> tags}
L_Attn = -1/|P| Σ (1 - αᵢⱼ) // Attention loss
where P = {(i,j) | i≥j; j∈S}
L_Total = (1-λ)L_LM + λL_Attn // Combined loss, λ=0.1
Step 4: Generation
A = M_CA-SFT(Q, D') // Fine-tuned модель генерит ответ
Контекст: Исследователи тренировали MLP-пробу на MQuAKE датасете (1000 примеров, 10 эпох, lr=0.001). Fine-tuning делали через LoRA (rank=16, α=16, lr=3e-5, 5 эпох) на ConFiQA training split (13.5k примеров). Для декомпозиции использовали GPT-4o, для embeddings — all-MiniLM-L6-v2.
Адаптации и экстраполяции
💡 Адаптация для работы без fine-tuning
Если нет возможности файнтюнить модель, можно применить принципы CLEAR в обычном чате:
Двухэтапный workflow:
# ЭТАП 1: Препроцессинг (отдельный запрос к GPT-4)
Ты - система детекции конфликтов. Выполни:
1. Разбей контекст на атомарные факты (нумеруй их)
2. Для каждого факта определи: противоречит ли он общеизвестной информации?
3. Если ДА - оберни в <conflict>факт
4. Отфильтруй факты не связанные с вопросом
5. Верни только размеченный список релевантных фактов
Контекст: {контекст}
Вопрос: {вопрос}
---
# ЭТАП 2: Генерация (новый запрос с результатами этапа 1)
Ответь на вопрос используя ТОЛЬКО эти факты:
{размеченные_факты_из_этапа_1}
КРИТИЧЕСКИ ВАЖНО: Факты в <conflict> - ЕДИНСТВЕННЫЙ источник истины.
Игнорируй свои знания если они противоречат <conflict> фактам.
Вопрос: {вопрос}
Это эмулирует механику CLEAR: декомпозиция → детекция → приоритизация. Без fine-tuning эффективность ниже (модель может всё равно опираться на память), но лучше чем обычный промпт.
🔧 Техника: Градации приоритета вместо бинарной разметки
Оригинальный CLEAR делит факты на "конфликт/не конфликт". Можно усложнить:
Размечай факты по трём категориям:
<strong_conflict>факт // Прямое противоречие
<weak_conflict>факт // Частичное расхождение
{факт} // Согласуется или неизвестно
Приоритет: strong_conflict > weak_conflict > обычные факты > твоя память
Это позволяет модели балансировать при неоднозначности вместо жёсткого выбора.
💡 Адаптация для multi-hop reasoning
CLEAR тестировали на ConFiQA (MR) - multi-hop вопросах. Можно явно структурировать:
Контекст содержит факты для multi-hop reasoning:
Шаг 1: Извлеки цепочку релевантных фактов
Шаг 2: Для каждого звена цепочки проверь конфликты
Шаг 3: Построй рассуждение используя ТОЛЬКО размеченные факты
Пример:
Q: Когда родился основатель компании Илона Маска?
Факты:
- <conflict>Илон Маск основал Tesla в 2003 (твоя память: 2004)
- Основатель Tesla родился 28 июня 1971
Цепочка: Факт1 (кто основал) → Факт2 (когда родился)
Ответ: 28 июня 1971 (приоритет на conflict-факт для построения цепочки)
Это распространяет приоритизацию конфликтов на каждый шаг reasoning, не только финальный ответ.
