
Анализирует внутренние состояния LLM и более 100 признаков внимания/вероятности для обучения классификаторов, выявляющих атаки отравления документов в RAG-системах.
D-SCAN — это аналитический фреймворк для обнаружения атак, направленных на отравление документов в системах RAG (Retrieval-Augmented Generation). Он собирает внутренние состояния LLM во время генерации (вероятности токенов и веса внимания), извлекает многомерные признаки и обучает классификаторы для различения чистых и отравленных извлечённых документов.
Этот проект по умолчанию использует Llama-3.1-8B-Instruct. Загрузите модель в локальный каталог и обновите переменную MODEL_ID в файле collect_inner_state.py:
MODEL_ID = "/your/path/to/Llama-3.1-8B-Instruct"
Полный рабочий процесс состоит из трёх шагов: Сбор внутренних состояний → Вычисление признаков → Обучение классификатора. Вопросы и связанные с ними извлечённые документы доступны по адресу https://huggingface.co/datasets/An998/D-SCAN.
# Update configuration parameters in collect_inner_state.py, then run
python collect_inner_state.py
# Analyze both attack and clean data, compute all features, and save results
python compute_feature.py \
--attack_dir ./saved_reppl_weights_serial_query1_attack2_2wiki \
--clean_dir ./saved_reppl_weights_serial_query1_pure1_5_2wiki \
--output_dir ./analysis_results/2wiki_all \
--max_attack_samples 3000 \
--max_clean_samples 3000
Откройте fit_D-SCAN.ipynb и последовательно выполните ячейки, чтобы:
collect_inner_state.py)Для каждого входа «вопрос-документ» LLM выполняет многократную генерацию (по умолчанию: 10 сэмплов, temperature=1.0) и собирает следующие внутренние состояния:
MODEL_ID = "/path/to/model" # Model path
NUM_SAMPLES = 10 # Number of samples per question
MAX_NEW_TOKENS = 50 # Maximum generated tokens
TEMPERATURE = 1.0 # Sampling temperature
data_type = 'pure1_5' # Data type: 'pure1_5' (clean) or 'attack2' (attack)
dataset_name = 'hotpotqa' # Dataset: 'hotpotqa', '2wiki', 'musique'
Результаты сохраняются в файлах data_{batch_id}_reppl.pt и статистических файлах results_stats_*.jsonl.
compute_feature.py)Извлекает 10 категорий признаков размерностью 100+ из собранных внутренних состояний. Классификатор использует эти признаки, чтобы определить, присутствуют ли отравленные документы среди извлечённых документов для данного запроса.
1. PerplexityMetrics (Статистика вероятности генерации)
Вычисляется из outer_ppl_probs (вероятность каждого сгенерированного токена):
ppl_mean_prob: Средняя вероятность по всем сгенерированным токенамppl_std_prob: Стандартное отклонение вероятностиppl_min_prob: Минимальная вероятность (экстремальная неопределённость)ppl_low_prob_ratio: Доля токенов с низкой вероятностью (<0.1)ppl_cross_sample_var: Дисперсия средних вероятностей между сэмпламиppl_coef_variation: Коэффициент вариации (CV = std/mean)ppl_skewness: Асимметрия распределения вероятностейppl_kurtosis: Эксцесс распределения вероятностей2. AttentionEntropyMetrics (Энтропия внимания)
Вычисляется из inner_ppl_matrix (веса внимания на каждом шаге):
attn_entropy_mean/std/max: Среднее, стандартное отклонение и максимум энтропии распределения вниманияattn_entropy_cv: Коэффициент вариации энтропии внимания3. AttentionConcentrationMetrics (Концентрация внимания)
attn_top5/10/20_ratio_mean/std: Доля внимания, приходящаяся на Top-K% токеновattn_gini_mean/std: Коэффициент Джини распределения внимания (мера неравенства)4. DocumentAttentionDensityMetrics (Плотность внимания к документам)
doc_attn_dens_std/range/max/min: Стандартное отклонение, размах, максимум и минимум плотности внимания по документамdoc_attn_dens_entropy: Энтропия распределения плотности внимания по документамdoc_attn_dens_temporal_var_mean: Средняя временная дисперсия плотности внимания к документам5. SampleConsistencyMetrics (Согласованность между сэмплами)
sample_attn_consistency/std: Косинусное сходство между сэмплами для внимания на уровне токеновsample_doc_consistency: Косинусное сходство между сэмплами для внимания на уровне документовsample_doc_js_divergence: Расхождение JS между сэмплами для внимания на уровне документов6. AttentionDynamicsMetrics (Динамика внимания)
attn_doc_switch_mean/max: Количество переключений доминирующего документаattn_entropy_change_mean/std: Пошаговое изменение энтропии внимания7. TokenLevelAttentionMetrics (Флуктуация внимания на уровне токенов)
tla_std_mean/std/max/median/p90/p99/high_ratio/cv: Статистики стандартного отклонения внимания по токенам на протяжении шагов генерацииtla_ent_mean/std/max/median/p90/p99/high_ratio/cv: Статистики энтропии внимания по токенам на протяжении шагов генерации8. AnswerProbabilityMetrics (Глубокая статистика вероятности ответа)
aprob_p10/p25/p50/p75/p90/iqr: Квантили вероятностиaprob_high_ratio_05/08: Доля токенов с высокой вероятностьюaprob_low_ratio_01/001: Доля токенов с низкой вероятностьюaprob_log_mean/std/min: Статистики лог-вероятностиaprob_ppl_mean/std/max: Перплексия на уровне последовательностиaprob_geometric_mean: Геометрическое среднее вероятностейaprob_distribution_entropy: Информационная энтропия гистограммы вероятностей9. ProbabilityDynamicsMetrics (Динамика вероятности)
pdyn_diff_mean/abs_diff_mean/abs_diff_std/abs_diff_max: Статистики разностей вероятностейpdyn_max_drop/max_jump: Максимальное одношаговое падение/скачокpdyn_volatility_mean/std: Волатильностьpdyn_trend_slope_mean/std: Наклон линейного трендаpdyn_autocorr_mean/std: Коэффициент автокорреляцииpdyn_spike_ratio_01/03: Доля выбросов (точек резких изменений)10. CrossSampleProbabilityConsistencyMetrics (Согласованность вероятностей между сэмплами)
cspc_mean_prob_std/cv/range: Согласованность средних вероятностей между сэмпламиcspc_ppl_std/cv/range: Согласованность перплексии между сэмпламиcspc_min_prob_std/range: Согласованность минимальных вероятностейcspc_seq_cosine_mean/std: Косинусное сходство последовательностей вероятностей между сэмпламиcspc_seq_pearson_mean: Корреляция Пирсона последовательностей вероятностей между сэмпламиcspc_seq_mse_mean: Среднеквадратичная ошибка (MSE) последовательностей вероятностей между сэмпламиcspc_divergence_index: Индекс расхождения между сэмпламиcompute_feature.pypython compute_feature.py \
--attack_dir <attack_data_directory> \
--clean_dir <clean_data_directory> \
--output_dir <output_directory> \
--max_attack_samples 3000 \
--max_clean_samples 3000 \
--min_correct_count 0 \
--min_attack_target_count 0 \
--num_use_samples 10 \
--model_path /path/to/model # Optional: load tokenizer for accuracy calculation
| Имя файла | Описание |
|---|---|
single_metric_analysis.json |
fit_D-SCAN.ipynb)Рабочий процесс в ноутбуке:
full_analysis_results.json из compute_feature.pyПеременная use_features в ноутбуке обеспечивает гибкое управление подмножеством признаков, используемых классификаторами:
# Use all features
use_features = [f for f in feature_names if f not in exclude_cols]
# Use only attention-related features
use_features = [f for f in use_features if 'attn' in f]
# Combine by metric category (example)
use_features = [f for f in feature_names if f.startswith(('ppl_', 'doc_', 'sample_'))]
Производительность классификатора по каждой категории также выводится во время выполнения compute_feature.py:
| Поле | Тип | Описание |
|---|
outer_ppl_probs | List[Tensor] | Вероятность генерации токена для каждого сэмпла |
inner_ppl_matrix | List[List[Tensor]] | Веса внимания к входной последовательности на каждом шаге генерации (усреднённые по слоям) |
doc_ranges | Dict[str, List[int]] | Диапазон позиций токенов для каждого документа во входной последовательности |
generated_sequences | List[List[int]] | Последовательности идентификаторов сгенерированных токенов для каждого сэмпла |
| # | Категория | Имя класса | # Признаков | Основная идея |
|---|
| 1 | Статистика вероятности генерации | PerplexityMetrics | 8 | Отравленные документы могут повышать неопределённость модели при генерации, что отражается в изменениях распределения вероятностей |
| 2 | Энтропия внимания | AttentionEntropyMetrics | 4 | Высокая энтропия = рассеянное внимание = возможная конфликтующая информация; низкая энтропия = сфокусированное внимание |
| 3 | Концентрация внимания | AttentionConcentrationMetrics | 8 | Оценивает, сосредоточено ли внимание на нескольких токенах, через коэффициент Top-K и коэффициент Джини |
| 4 | Плотность внимания к документам | DocumentAttentionDensityMetrics | 6 | Сумма внимания, делённая на длину документа, устраняет смещение, связанное с длиной, в распределении внимания |
| 5 | Согласованность между сэмплами | SampleConsistencyMetrics | 4 | При отравлении паттерны внимания между сэмплами могут быть несогласованными (косинусное сходство, расхождение JS) |
| 6 | Динамика внимания | AttentionDynamicsMetrics | 4 | Частота переключений доминирующего документа и величина изменения энтропии во время генерации |
| 7 | Флуктуация внимания на уровне токенов | TokenLevelAttentionMetrics | 16 | Стабильность внимания на каждой позиции входного токена на протяжении шагов генерации (std, энтропия) |
| 8 | Глубокая статистика вероятности ответа | AnswerProbabilityMetrics | 18 | Квантили вероятности, доли токенов с высокой/низкой вероятностью, лог-вероятность, перплексия и т.д. |
| 9 | Динамика вероятности | ProbabilityDynamicsMetrics | 14 | Наклон тренда, автокорреляция, волатильность, доля выбросов в последовательности генерации |
| 10 | Согласованность вероятностей между сэмплами | CrossSampleProbabilityConsistencyMetrics | 13 | Косинусное сходство, корреляция Пирсона, MSE, индекс расхождения между сэмплами |
| Аргумент | По умолчанию | Описание |
|---|
--attack_dir | - | Каталог с данными атак (содержит файлы data_*_reppl.pt) |
--clean_dir | - | Каталог с чистыми данными |
--output_dir | - | Каталог для выходных данных |
--max_attack_samples | 3000 | Максимальное количество сэмплов атак |
--max_clean_samples | 3000 | Максимальное количество чистых сэмплов |
--min_correct_count | 0 | Минимальное количество правильных ответов в чистых данных (для фильтрации) |
--min_attack_target_count | 0 | Минимальное количество совпадений с целевым ответом в данных атак |
--num_use_samples | None | Количество сэмплов на вопрос для вычисления метрик (по умолчанию: все) |
--model_path | None | Путь к модели (для загрузки токенизатора и декодирования сгенерированных последовательностей) |
| AUC, p-value, коэффициент Коэна d и т.д. для каждой метрики |
full_analysis_results.json | Полная матрица признаков + метки |
document_detailed_metrics.json | Детальные метрики по каждому документу (сводка в JSON) |
document_detailed_metrics_full.pkl | Полные метрики на уровне документов (включая внимание на уровне шагов) |
| Группа признаков | Префикс / Ключевое слово |
|---|
perplexity | ppl_* |
attention_entropy | *entropy* (исключая doc и aprob) |
attention_concentration | *top*, *gini* |
document_attention | doc_* |
sample_consistency | *sample*, *consistency* |
attention_dynamics | *switch*, *change* |
token_level_attention | tla_* |
answer_probability | aprob_* |
probability_dynamics | pdyn_* |
cross_sample_prob_consistency | cspc_* |