
Analiza los estados internos de los LLM y más de 100 características de atención/probabilidad para entrenar clasificadores que detecten ataques de envenenamiento de documentos en sistemas RAG.
D-SCAN es un marco de análisis para detectar ataques de envenenamiento de documentos en sistemas RAG (Retrieval-Augmented Generation). Recopila los estados internos del LLM durante la generación (probabilidades de tokens y pesos de atención), extrae características multidimensionales y entrena clasificadores para distinguir entre documentos recuperados limpios y envenenados.
Este proyecto usa Llama-3.1-8B-Instruct por defecto. Descarga el modelo a una ruta local y actualiza la variable MODEL_ID en collect_inner_state.py:
MODEL_ID = "/your/path/to/Llama-3.1-8B-Instruct"
El flujo de trabajo completo consta de tres pasos: Recopilar estados internos → Calcular características → Entrenar el clasificador. Las preguntas y los documentos recuperados correspondientes se proporcionan en 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
Abre fit_D-SCAN.ipynb y ejecuta las celdas en orden para:
collect_inner_state.py)Para cada entrada de pregunta-documento, el LLM realiza una generación de múltiples muestras (por defecto: 10 muestras, temperature=1.0) y recopila los siguientes estados internos:
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'
Las salidas se guardan como archivos data_{batch_id}_reppl.pt y archivos de estadísticas results_stats_*.jsonl.
compute_feature.py)Extrae 10 categorías con más de 100 características dimensionales de los estados internos recopilados. El clasificador usa estas características para determinar si existen documentos envenenados entre los documentos recuperados para una consulta determinada.
1. PerplexityMetrics (Estadísticas de probabilidad de generación)
Calculadas a partir de outer_ppl_probs (probabilidad de cada token generado):
ppl_mean_prob: Probabilidad media de todos los tokens generadosppl_std_prob: Desviación estándar de la probabilidadppl_min_prob: Probabilidad mínima (incertidumbre extrema)ppl_low_prob_ratio: Proporción de tokens de baja probabilidad (<0.1)ppl_cross_sample_var: Varianza de las probabilidades medias entre muestrasppl_coef_variation: Coeficiente de variación (CV = std/mean)ppl_skewness: Asimetría de la distribución de probabilidadppl_kurtosis: Curtosis de la distribución de probabilidad2. AttentionEntropyMetrics (Entropía de atención)
Calculadas a partir de inner_ppl_matrix (pesos de atención en cada paso):
attn_entropy_mean/std/max: Media, desviación estándar y máximo de la entropía de la distribución de atenciónattn_entropy_cv: Coeficiente de variación de la entropía de atención3. AttentionConcentrationMetrics (Concentración de atención)
attn_top5/10/20_ratio_mean/std: Proporción de atención capturada por los tokens del Top-K%attn_gini_mean/std: Coeficiente de Gini de la distribución de atención (medida de desigualdad)4. DocumentAttentionDensityMetrics (Densidad de atención por documento)
doc_attn_dens_std/range/max/min: Desviación estándar, rango, máximo y mínimo de la densidad de atención entre documentosdoc_attn_dens_entropy: Entropía de la distribución de densidad de atención por documentodoc_attn_dens_temporal_var_mean: Varianza temporal media de la densidad de atención por documento5. SampleConsistencyMetrics (Consistencia entre muestras)
sample_attn_consistency/std: Similitud coseno entre muestras de la atención a nivel de tokensample_doc_consistency: Similitud coseno entre muestras de la atención a nivel de documentosample_doc_js_divergence: Divergencia JS entre muestras de la atención a nivel de documento6. AttentionDynamicsMetrics (Dinámica de atención)
attn_doc_switch_mean/max: Número de cambios de documento dominanteattn_entropy_change_mean/std: Cambio de entropía de atención paso a paso7. TokenLevelAttentionMetrics (Fluctuación de atención a nivel de token)
tla_std_mean/std/max/median/p90/p99/high_ratio/cv: Estadísticos de la desviación estándar de atención por token a lo largo de los pasos de generacióntla_ent_mean/std/max/median/p90/p99/high_ratio/cv: Estadísticos de la entropía de atención por token a lo largo de los pasos de generación8. AnswerProbabilityMetrics (Estadísticas profundas de probabilidad de respuesta)
aprob_p10/p25/p50/p75/p90/iqr: Cuantiles de probabilidadaprob_high_ratio_05/08: Proporción de tokens de alta probabilidadaprob_low_ratio_01/001: Proporción de tokens de baja probabilidadaprob_log_mean/std/min: Estadísticos de log-probabilidadaprob_ppl_mean/std/max: Perplejidad a nivel de secuenciaaprob_geometric_mean: Media geométrica de las probabilidadesaprob_distribution_entropy: Entropía de la información del histograma de probabilidad9. ProbabilityDynamicsMetrics (Dinámica de probabilidad)
pdyn_diff_mean/abs_diff_mean/abs_diff_std/abs_diff_max: Estadísticos de diferencias de probabilidadpdyn_max_drop/max_jump: Caída/salto máximo en un solo pasopdyn_volatility_mean/std: Volatilidadpdyn_trend_slope_mean/std: Pendiente de tendencia linealpdyn_autocorr_mean/std: Coeficiente de autocorrelaciónpdyn_spike_ratio_01/03: Proporción de picos (puntos de mutación)10. CrossSampleProbabilityConsistencyMetrics (Consistencia de probabilidad entre muestras)
cspc_mean_prob_std/cv/range: Consistencia de las probabilidades medias entre muestrascspc_ppl_std/cv/range: Consistencia de la perplejidad entre muestrascspc_min_prob_std/range: Consistencia de las probabilidades mínimascspc_seq_cosine_mean/std: Similitud coseno entre muestras de las secuencias de probabilidadcspc_seq_pearson_mean: Correlación de Pearson entre muestras de las secuencias de probabilidadcspc_seq_mse_mean: MSE entre muestras de las secuencias de probabilidadcspc_divergence_index: Índice de divergencia entre muestrascompute_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
| Nombre de archivo | Descripción |
|---|---|
single_metric_analysis.json |
fit_D-SCAN.ipynb)Flujo de trabajo del notebook:
full_analysis_results.json de compute_feature.pyLa variable use_features del notebook proporciona un control flexible sobre el subconjunto de características utilizado por los clasificadores:
# 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_'))]
El rendimiento del clasificador por categoría también se imprime durante la ejecución de compute_feature.py:
| Campo | Tipo | Descripción |
|---|
outer_ppl_probs | List[Tensor] | Probabilidad de generación de tokens para cada muestra |
inner_ppl_matrix | List[List[Tensor]] | Pesos de atención sobre la secuencia de entrada en cada paso de generación (promediados por capa) |
doc_ranges | Dict[str, List[int]] | Rango de posiciones de tokens para cada documento en la secuencia de entrada |
generated_sequences | List[List[int]] | Secuencias de IDs de tokens generados para cada muestra |
| # | Categoría | Nombre de clase | # Características | Idea central |
|---|
| 1 | Estadísticas de probabilidad de generación | PerplexityMetrics | 8 | Los documentos envenenados pueden aumentar la incertidumbre del modelo durante la generación, lo que se refleja en cambios en la distribución de probabilidad |
| 2 | Entropía de atención | AttentionEntropyMetrics | 4 | Entropía alta = atención dispersa = posible información conflictiva; entropía baja = atención concentrada |
| 3 | Concentración de atención | AttentionConcentrationMetrics | 8 | Mide si la atención se concentra en unos pocos tokens mediante el ratio Top-K y el coeficiente de Gini |
| 4 | Densidad de atención por documento | DocumentAttentionDensityMetrics | 6 | Suma de atención dividida por la longitud del documento, eliminando el sesgo de longitud en la distribución de atención |
| 5 | Consistencia entre muestras | SampleConsistencyMetrics | 4 | Bajo envenenamiento, los patrones de atención entre muestras pueden ser inconsistentes (similitud coseno, divergencia JS) |
| 6 | Dinámica de atención | AttentionDynamicsMetrics | 4 | Frecuencia de cambios de documento dominante y magnitud del cambio de entropía durante la generación |
| 7 | Fluctuación de atención a nivel de token | TokenLevelAttentionMetrics | 16 | Estabilidad de la atención en cada posición de token de entrada a lo largo de los pasos de generación (std, entropía) |
| 8 | Estadísticas profundas de probabilidad de respuesta | AnswerProbabilityMetrics | 18 | Cuantiles de probabilidad, ratios de tokens de alta/baja probabilidad, log-probabilidad, perplejidad, etc. |
| 9 | Dinámica de probabilidad | ProbabilityDynamicsMetrics | 14 | Pendiente de tendencia, autocorrelación, volatilidad, ratio de picos en la secuencia de generación |
| 10 | Consistencia de probabilidad entre muestras | CrossSampleProbabilityConsistencyMetrics | 13 | Similitud coseno, correlación de Pearson, MSE e índice de divergencia entre muestras |
| Argumento | Por defecto | Descripción |
|---|
--attack_dir | - | Directorio de datos de ataque (que contiene archivos data_*_reppl.pt) |
--clean_dir | - | Directorio de datos limpios |
--output_dir | - | Directorio de salida |
--max_attack_samples | 3000 | Número máximo de muestras de ataque |
--max_clean_samples | 3000 | Número máximo de muestras limpias |
--min_correct_count | 0 | Número mínimo de respuestas correctas en los datos limpios (para filtrado) |
--min_attack_target_count | 0 | Número mínimo de aciertos de la respuesta objetivo en los datos de ataque |
--num_use_samples | None | Número de muestras por pregunta para el cálculo de métricas (por defecto: todas) |
--model_path | None | Ruta del modelo (para cargar el tokenizador y decodificar las secuencias generadas) |
| AUC, valor p, d de Cohen, etc. para cada métrica |
full_analysis_results.json | Matriz de características completa + etiquetas |
document_detailed_metrics.json | Métricas detalladas por documento (resumen JSON) |
document_detailed_metrics_full.pkl | Métricas completas a nivel de documento (incluye atención paso a paso) |
| Grupo de características | Prefijo / Palabra clave |
|---|
perplexity | ppl_* |
attention_entropy | *entropy* (excl. doc y 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_* |