
Analyse les états internes des LLM et plus de 100 caractéristiques d'attention/probabilités pour entraîner des classifieurs capables de détecter les attaques d'empoisonnement de documents dans les systèmes RAG.
D-SCAN est un framework d'analyse permettant de détecter les attaques par empoisonnement de documents dans les systèmes RAG (Retrieval-Augmented Generation). Il collecte les états internes du LLM pendant la génération (probabilités de tokens et poids d'attention), extrait des caractéristiques multidimensionnelles et entraîne des classifieurs pour distinguer les documents récupérés sains des documents empoisonnés.
Ce projet utilise Llama-3.1-8B-Instruct par défaut. Téléchargez le modèle dans un chemin local et mettez à jour la variable MODEL_ID dans collect_inner_state.py :
MODEL_ID = "/your/path/to/Llama-3.1-8B-Instruct"
Le workflow complet comprend trois étapes : Collecter les états internes → Calculer les caractéristiques → Entraîner le classifieur. Les questions et les documents récupérés associés sont fournis sur 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
Ouvrez fit_D-SCAN.ipynb et exécutez les cellules séquentiellement pour :
collect_inner_state.py)Pour chaque entrée question-document, le LLM effectue une génération multi-échantillons (défaut : 10 échantillons, temperature=1.0) et collecte les états internes suivants :
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'
Les sorties sont enregistrées sous forme de fichiers data_{batch_id}_reppl.pt et de fichiers de statistiques results_stats_*.jsonl.
compute_feature.py)Extrait 10 catégories avec plus de 100 dimensions de caractéristiques à partir des états internes collectés. Le classifieur utilise ces caractéristiques pour déterminer si des documents empoisonnés sont présents parmi les documents récupérés pour une requête donnée.
1. PerplexityMetrics (Statistiques de probabilité de génération)
Calculées à partir de outer_ppl_probs (probabilité de chaque token généré) :
ppl_mean_prob : Probabilité moyenne sur tous les tokens générésppl_std_prob : Écart-type de la probabilitéppl_min_prob : Probabilité minimale (incertitude extrême)ppl_low_prob_ratio : Ratio de tokens à faible probabilité (<0.1)ppl_cross_sample_var : Variance des probabilités moyennes entre les échantillonsppl_coef_variation : Coefficient de variation (CV = std/mean)ppl_skewness : Asymétrie de la distribution de probabilitéppl_kurtosis : Aplatissement de la distribution de probabilité2. AttentionEntropyMetrics (Entropie de l'attention)
Calculées à partir de inner_ppl_matrix (poids d'attention à chaque étape) :
attn_entropy_mean/std/max : Moyenne, écart-type et maximum de l'entropie de la distribution d'attentionattn_entropy_cv : Coefficient de variation de l'entropie de l'attention3. AttentionConcentrationMetrics (Concentration de l'attention)
attn_top5/10/20_ratio_mean/std : Part d'attention capturée par les tokens Top-K %attn_gini_mean/std : Coefficient de Gini de la distribution d'attention (mesure d'inégalité)4. DocumentAttentionDensityMetrics (Densité d'attention par document)
doc_attn_dens_std/range/max/min : Écart-type, étendue, max et min de la densité d'attention entre documentsdoc_attn_dens_entropy : Entropie de la distribution de densité d'attention des documentsdoc_attn_dens_temporal_var_mean : Variance temporelle moyenne de la densité d'attention des documents5. SampleConsistencyMetrics (Cohérence multi-échantillons)
sample_attn_consistency/std : Similarité cosinus inter-échantillons de l'attention au niveau tokensample_doc_consistency : Similarité cosinus inter-échantillons de l'attention au niveau documentsample_doc_js_divergence : Divergence JS inter-échantillons de l'attention au niveau document6. AttentionDynamicsMetrics (Dynamique de l'attention)
attn_doc_switch_mean/max : Nombre de basculements du document dominantattn_entropy_change_mean/std : Changement d'entropie de l'attention par étape7. TokenLevelAttentionMetrics (Fluctuation de l'attention au niveau token)
tla_std_mean/std/max/median/p90/p99/high_ratio/cv : Statistiques de l'écart-type de l'attention par token au fil des étapes de générationtla_ent_mean/std/max/median/p90/p99/high_ratio/cv : Statistiques de l'entropie de l'attention par token au fil des étapes de génération8. AnswerProbabilityMetrics (Statistiques approfondies de probabilité de réponse)
aprob_p10/p25/p50/p75/p90/iqr : Quantiles de probabilitéaprob_high_ratio_05/08 : Ratio de tokens à haute probabilitéaprob_low_ratio_01/001 : Ratio de tokens à faible probabilitéaprob_log_mean/std/min : Statistiques de log-probabilitéaprob_ppl_mean/std/max : Perplexité au niveau de la séquenceaprob_geometric_mean : Moyenne géométrique des probabilitésaprob_distribution_entropy : Entropie informationnelle de l'histogramme de probabilité9. ProbabilityDynamicsMetrics (Dynamique de probabilité)
pdyn_diff_mean/abs_diff_mean/abs_diff_std/abs_diff_max : Statistiques des différences de probabilitépdyn_max_drop/max_jump : Baisse/saut maximal en une seule étapepdyn_volatility_mean/std : Volatilitépdyn_trend_slope_mean/std : Pente de tendance linéairepdyn_autocorr_mean/std : Coefficient d'autocorrélationpdyn_spike_ratio_01/03 : Ratio de pics (points de mutation)10. CrossSampleProbabilityConsistencyMetrics (Cohérence de probabilité inter-échantillons)
cspc_mean_prob_std/cv/range : Cohérence des probabilités moyennes entre échantillonscspc_ppl_std/cv/range : Cohérence de la perplexité entre échantillonscspc_min_prob_std/range : Cohérence des probabilités minimalescspc_seq_cosine_mean/std : Similarité cosinus inter-échantillons des séquences de probabilitécspc_seq_pearson_mean : Corrélation de Pearson inter-échantillons des séquences de probabilitécspc_seq_mse_mean : MSE inter-échantillons des séquences de probabilitécspc_divergence_index : Indice de divergence inter-échantillonscompute_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
| Nom de fichier | Description |
|---|---|
single_metric_analysis.json |
fit_D-SCAN.ipynb)Workflow du notebook :
full_analysis_results.json de compute_feature.pyLa variable use_features du notebook permet de contrôler de manière flexible le sous-ensemble de caractéristiques utilisé par les classifieurs :
# 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_'))]
La performance du classifieur par catégorie est également affichée lors de l'exécution de compute_feature.py :
| Champ | Type | Description |
|---|
outer_ppl_probs | List[Tensor] | Probabilité de génération de tokens pour chaque échantillon |
inner_ppl_matrix | List[List[Tensor]] | Poids d'attention sur la séquence d'entrée à chaque étape de génération (moyennés par couche) |
doc_ranges | Dict[str, List[int]] | Plage de positions de tokens pour chaque document dans la séquence d'entrée |
generated_sequences | List[List[int]] | Séquences d'identifiants de tokens générés pour chaque échantillon |
| # | Catégorie | Nom de classe | # Caractéristiques | Idée principale |
|---|
| 1 | Statistiques de probabilité de génération | PerplexityMetrics | 8 | Les documents empoisonnés peuvent accroître l'incertitude du modèle lors de la génération, reflétée par des changements dans la distribution des probabilités |
| 2 | Entropie de l'attention | AttentionEntropyMetrics | 4 | Entropie élevée = attention dispersée = possibles informations conflictuelles ; entropie faible = attention ciblée |
| 3 | Concentration de l'attention | AttentionConcentrationMetrics | 8 | Mesure si l'attention est concentrée sur quelques tokens via le ratio Top-K et le coefficient de Gini |
| 4 | Densité d'attention par document | DocumentAttentionDensityMetrics | 6 | Somme de l'attention divisée par la longueur du document, éliminant le biais de longueur dans l'allocation de l'attention |
| 5 | Cohérence multi-échantillons | SampleConsistencyMetrics | 4 | En cas d'empoisonnement, les schémas d'attention entre échantillons peuvent être incohérents (similarité cosinus, divergence JS) |
| 6 | Dynamique de l'attention | AttentionDynamicsMetrics | 4 | Fréquence des basculements du document dominant et ampleur des changements d'entropie pendant la génération |
| 7 | Fluctuation de l'attention au niveau token | TokenLevelAttentionMetrics | 16 | Stabilité de l'attention à chaque position de token d'entrée au fil des étapes de génération (écart-type, entropie) |
| 8 | Statistiques approfondies de probabilité de réponse | AnswerProbabilityMetrics | 18 | Quantiles de probabilité, ratios de tokens à probabilité haute/faible, log-probabilité, perplexité, etc. |
| 9 | Dynamique de probabilité | ProbabilityDynamicsMetrics | 14 | Pente de tendance, autocorrélation, volatilité, ratio de pics dans la séquence de génération |
| 10 | Cohérence de probabilité inter-échantillons | CrossSampleProbabilityConsistencyMetrics | 13 | Similarité cosinus, corrélation de Pearson, MSE, indice de divergence entre échantillons |
| Argument | Défaut | Description |
|---|
--attack_dir | - | Répertoire des données d'attaque (contenant les fichiers data_*_reppl.pt) |
--clean_dir | - | Répertoire des données propres |
--output_dir | - | Répertoire de sortie |
--max_attack_samples | 3000 | Nombre maximal d'échantillons d'attaque |
--max_clean_samples | 3000 | Nombre maximal d'échantillons propres |
--min_correct_count | 0 | Nombre minimal de réponses correctes dans les données propres (pour filtrage) |
--min_attack_target_count | 0 | Nombre minimal de réponses cibles atteintes dans les données d'attaque |
--num_use_samples | None | Nombre d'échantillons par question pour le calcul des métriques (défaut : tous) |
--model_path | None | Chemin du modèle (pour charger le tokenizer afin de décoder les séquences générées) |
| AUC, p-value, d de Cohen, etc. pour chaque métrique |
full_analysis_results.json | Matrice de caractéristiques complète + étiquettes |
document_detailed_metrics.json | Métriques détaillées par document (résumé JSON) |
document_detailed_metrics_full.pkl | Métriques complètes au niveau document (y compris l'attention au niveau étape) |
| Groupe de caractéristiques | Préfixe / Mot-clé |
|---|
perplexity | ppl_* |
attention_entropy | *entropy* (excl. doc and 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_* |