
LLM 내부 상태와 100개 이상의 어텐션/확률 특징을 분석하여 RAG 시스템에서 문서 오염 공격을 탐지하는 분류기를 훈련합니다.
D-SCAN은 RAG(Retrieval-Augmented Generation) 시스템에서 문서 오염 공격(document poisoning attack)을 탐지하기 위한 분석 프레임워크입니다. 생성 과정에서 LLM 내부 상태(토큰 확률 및 어텐션 가중치)를 수집하고, 다차원 특징을 추출하여 정상 문서와 오염된 검색 문서를 구분하는 분류기를 학습합니다.
이 프로젝트는 기본적으로 Llama-3.1-8B-Instruct를 사용합니다. 모델을 로컬 경로에 다운로드하고 collect_inner_state.py의 MODEL_ID 변수를 업데이트하세요:
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: 확률 시퀀스의 샘플 간 MSEcspc_divergence_index: 샘플 간 발산 지수compute_feature.py 명령줄 인자python 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
| Filename | Description |
|---|---|
single_metric_analysis.json | 각 지표에 대한 AUC, p-value, Cohen's d 등 |
full_analysis_results.json |
fit_D-SCAN.ipynb)노트북 워크플로우:
compute_feature.py의 출력인 full_analysis_results.json 읽기노트북의 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 실행 중 범주별 분류기 성능도 출력됩니다:
| Field | Type | Description |
|---|
outer_ppl_probs | List[Tensor] | 각 샘플의 토큰 생성 확률 |
inner_ppl_matrix | List[List[Tensor]] | 각 생성 단계에서 입력 시퀀스에 대한 어텐션 가중치(레이어 평균) |
doc_ranges | Dict[str, List[int]] | 입력 시퀀스에서 각 문서의 토큰 위치 범위 |
generated_sequences | List[List[int]] | 각 샘플의 생성된 토큰 ID 시퀀스 |
| # | 범주 | 클래스 이름 | # 특징 | 핵심 아이디어 |
|---|
| 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, 발산 지수 |
| Argument | Default | Description |
|---|
--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 | 모델 경로(생성된 시퀀스 디코딩을 위해 토크나이저 로드용) |
| 전체 특징 행렬 + 레이블 |
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_* |