D-SCANは、RAG(検索拡張生成)システムにおける文書ポイズニング攻撃を検出するための分析フレームワークです。生成中のLLM内部状態(トークン確率とアテンション重み)を収集し、多次元の特徴量を抽出して、クリーンな取得文書とポイズニングされた取得文書を判別する分類器を訓練します。
このプロジェクトはデフォルトでLlama-3.1-8B-Instructを使用します。モデルをローカルパスにダウンロードし、collect_inner_state.py内のMODEL_ID変数を更新してください:
MODEL_ID = "/your/path/to/Llama-3.1-8B-Instruct"
ワークフロー全体は3つのステップで構成されています:内部状態の収集 → 特徴量の計算 → 分類器の訓練。 質問と関連する取得文書は 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: 1ステップあたりの最大下落/跳躍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
| ファイル名 | 説明 |
|---|---|
single_metric_analysis.json | 各メトリクスのAUC、p値、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の実行中に表示されます:
| フィールド | 型 | 説明 |
|---|
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 | 生成ステップ全体にわたる各入力トークン位置でのアテンションの安定性(標準偏差、エントロピー) |
| 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 | モデルパス(生成シーケンスをデコードするためのトークナイザー読み込み用) |
| 完全な特徴量行列+ラベル |
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_* |