
Analisa os estados internos de LLMs e mais de 100 características de atenção/probabilidade para treinar classificadores que detectam ataques de envenenamento de documentos em sistemas RAG.
D-SCAN é um framework de análise para detectar ataques de envenenamento de documentos em sistemas RAG (Retrieval-Augmented Generation). Ele coleta estados internos do LLM durante a geração (probabilidades de tokens e pesos de atenção), extrai características multidimensionais e treina classificadores para distinguir entre documentos recuperados limpos e envenenados.
Este projeto usa Llama-3.1-8B-Instruct por padrão. Baixe o modelo para um caminho local e atualize a variável MODEL_ID em collect_inner_state.py:
MODEL_ID = "/your/path/to/Llama-3.1-8B-Instruct"
O fluxo de trabalho completo consiste em três etapas: Coletar Estados Internos → Calcular Características → Treinar Classificador. A pergunta e os documentos recuperados relacionados são fornecidos em 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
Abra fit_D-SCAN.ipynb e execute as células sequencialmente para:
collect_inner_state.py)Para cada entrada de pergunta-documento, o LLM realiza geração multi-amostra (padrão: 10 amostras, temperature=1.0) e coleta os seguintes 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'
As saídas são salvas como arquivos data_{batch_id}_reppl.pt e arquivos de estatísticas results_stats_*.jsonl.
compute_feature.py)Extrai 10 categorias com mais de 100 características dimensionais dos estados internos coletados. O classificador usa essas características para determinar se existem documentos envenenados entre os documentos recuperados para uma determinada consulta.
1. PerplexityMetrics (Estatísticas de Probabilidade de Geração)
Calculado a partir de outer_ppl_probs (probabilidade de cada token gerado):
ppl_mean_prob: Probabilidade média em todos os tokens geradosppl_std_prob: Desvio padrão da probabilidadeppl_min_prob: Probabilidade mínima (incerteza extrema)ppl_low_prob_ratio: Proporção de tokens de baixa probabilidade (<0.1)ppl_cross_sample_var: Variância das probabilidades médias entre amostrasppl_coef_variation: Coeficiente de variação (CV = std/mean)ppl_skewness: Assimetria da distribuição de probabilidadeppl_kurtosis: Curtose da distribuição de probabilidade2. AttentionEntropyMetrics (Entropia de Atenção)
Calculado a partir de inner_ppl_matrix (pesos de atenção em cada passo):
attn_entropy_mean/std/max: Média, desvio padrão e máximo da entropia da distribuição de atençãoattn_entropy_cv: Coeficiente de variação da entropia de atenção3. AttentionConcentrationMetrics (Concentração de Atenção)
attn_top5/10/20_ratio_mean/std: Fração de atenção capturada pelos tokens Top-K%attn_gini_mean/std: Coeficiente de Gini da distribuição de atenção (medida de desigualdade)4. DocumentAttentionDensityMetrics (Densidade de Atenção em Documentos)
doc_attn_dens_std/range/max/min: Desvio padrão, amplitude, máximo e mínimo da densidade de atenção entre documentosdoc_attn_dens_entropy: Entropia da distribuição de densidade de atenção em documentosdoc_attn_dens_temporal_var_mean: Média da variância temporal da densidade de atenção em documentos5. SampleConsistencyMetrics (Consistência Multi-Amostra)
sample_attn_consistency/std: Similaridade de cosseno entre amostras da atenção em nível de tokensample_doc_consistency: Similaridade de cosseno entre amostras da atenção em nível de documentosample_doc_js_divergence: Divergência JS entre amostras da atenção em nível de documento6. AttentionDynamicsMetrics (Dinâmica de Atenção)
attn_doc_switch_mean/max: Contagem de trocas de documento dominanteattn_entropy_change_mean/std: Mudança passo a passo da entropia de atenção7. TokenLevelAttentionMetrics (Flutuação de Atenção em Nível de Token)
tla_std_mean/std/max/median/p90/p99/high_ratio/cv: Estatísticas do desvio padrão de atenção por token ao longo dos passos de geraçãotla_ent_mean/std/max/median/p90/p99/high_ratio/cv: Estatísticas da entropia de atenção por token ao longo dos passos de geração8. AnswerProbabilityMetrics (Estatísticas Profundas de Probabilidade de Resposta)
aprob_p10/p25/p50/p75/p90/iqr: Quantis de probabilidadeaprob_high_ratio_05/08: Proporção de tokens de alta probabilidadeaprob_low_ratio_01/001: Proporção de tokens de baixa probabilidadeaprob_log_mean/std/min: Estatísticas de log de probabilidadeaprob_ppl_mean/std/max: Perplexidade em nível de sequênciaaprob_geometric_mean: Média geométrica das probabilidadesaprob_distribution_entropy: Entropia de informação do histograma de probabilidade9. ProbabilityDynamicsMetrics (Dinâmica de Probabilidade)
pdyn_diff_mean/abs_diff_mean/abs_diff_std/abs_diff_max: Estatísticas de diferença de probabilidadepdyn_max_drop/max_jump: Queda/salto máximo em um único passopdyn_volatility_mean/std: Volatilidadepdyn_trend_slope_mean/std: Inclinação de tendência linearpdyn_autocorr_mean/std: Coeficiente de autocorrelaçãopdyn_spike_ratio_01/03: Proporção de picos (pontos de mutação)10. CrossSampleProbabilityConsistencyMetrics (Consistência de Probabilidade entre Amostras)
cspc_mean_prob_std/cv/range: Consistência das probabilidades médias entre amostrascspc_ppl_std/cv/range: Consistência da perplexidade entre amostrascspc_min_prob_std/range: Consistência das probabilidades mínimascspc_seq_cosine_mean/std: Similaridade de cosseno entre amostras das sequências de probabilidadecspc_seq_pearson_mean: Correlação de Pearson entre amostras das sequências de probabilidadecspc_seq_mse_mean: MSE entre amostras das sequências de probabilidadecspc_divergence_index: Índice de divergência entre amostrascompute_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
| Nome do Arquivo | Descrição |
|---|---|
single_metric_analysis.json |
fit_D-SCAN.ipynb)Fluxo de trabalho do notebook:
full_analysis_results.json de compute_feature.pyA variável use_features no notebook oferece controle flexível sobre o subconjunto de características usado pelos classificadores:
# 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_'))]
O desempenho do classificador por categoria também é impresso durante a execução de compute_feature.py:
Se você achar nosso trabalho útil, considere citar nosso artigo:
Artigo: When Context Bites: Detecting RAG Poisoning via Document-Level Attention Collapse
@inproceedings{dscan,
author = {Ren, Yingtao and Zhao, Ziyi and Fu, Yiwei and Luo, Xiao and Chang, Yu-Cheng and Lin, Chin-Teng},
title = {When Context Bites: Detecting RAG Poisoning via Document-Level Attention Collapse},
year = {2026},
isbn = {9798400725999},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3805712.3809904},
doi = {10.1145/3805712.3809904},
booktitle = {Proceedings of the 49th International ACM SIGIR Conference on Research and Development in Information Retrieval},
pages = {4080–4086},
numpages = {7},
keywords = {retrieval-augmented generation, information security, question answering system},
location = {Australia},
series = {SIGIR '26}
}
| Campo | Tipo | Descrição |
|---|
outer_ppl_probs | List[Tensor] | Probabilidade de geração de token para cada amostra |
inner_ppl_matrix | List[List[Tensor]] | Pesos de atenção sobre a sequência de entrada em cada passo de geração (média por camada) |
doc_ranges | Dict[str, List[int]] | Intervalo de posição de token para cada documento na sequência de entrada |
generated_sequences | List[List[int]] | Sequências de IDs de tokens gerados para cada amostra |
| # | Categoria | Nome da Classe | # Características | Ideia Central |
|---|
| 1 | Estatísticas de Probabilidade de Geração | PerplexityMetrics | 8 | Documentos envenenados podem aumentar a incerteza do modelo durante a geração, refletida em mudanças na distribuição de probabilidade |
| 2 | Entropia de Atenção | AttentionEntropyMetrics | 4 | Alta entropia = atenção dispersa = possível informação conflitante; Baixa entropia = atenção focada |
| 3 | Concentração de Atenção | AttentionConcentrationMetrics | 8 | Mede se a atenção está concentrada em poucos tokens via proporção Top-K e coeficiente de Gini |
| 4 | Densidade de Atenção em Documentos | DocumentAttentionDensityMetrics | 6 | Soma de atenção dividida pelo comprimento do documento, eliminando viés de comprimento na alocação de atenção |
| 5 | Consistência Multi-Amostra | SampleConsistencyMetrics | 4 | Sob envenenamento, os padrões de atenção entre amostras podem ser inconsistentes (similaridade de cosseno, divergência JS) |
| 6 | Dinâmica de Atenção | AttentionDynamicsMetrics | 4 | Frequência de trocas de documento dominante e magnitude de mudança de entropia durante a geração |
| 7 | Flutuação de Atenção em Nível de Token | TokenLevelAttentionMetrics | 16 | Estabilidade da atenção em cada posição de token de entrada ao longo dos passos de geração (desvio padrão, entropia) |
| 8 | Estatísticas Profundas de Probabilidade de Resposta | AnswerProbabilityMetrics | 18 | Quantis de probabilidade, proporções de tokens de alta/baixa probabilidade, log de probabilidade, perplexidade, etc. |
| 9 | Dinâmica de Probabilidade | ProbabilityDynamicsMetrics | 14 | Inclinação de tendência, autocorrelação, volatilidade, proporção de picos na sequência de geração |
| 10 | Consistência de Probabilidade entre Amostras | CrossSampleProbabilityConsistencyMetrics | 13 | Similaridade de cosseno, correlação de Pearson, MSE, índice de divergência entre amostras |
| Argumento | Padrão | Descrição |
|---|
--attack_dir | - | Diretório de dados de ataque (contendo arquivos data_*_reppl.pt) |
--clean_dir | - | Diretório de dados limpos |
--output_dir | - | Diretório de saída |
--max_attack_samples | 3000 | Número máximo de amostras de ataque |
--max_clean_samples | 3000 | Número máximo de amostras limpas |
--min_correct_count | 0 | Número mínimo de respostas corretas em dados limpos (para filtragem) |
--min_attack_target_count | 0 | Número mínimo de acertos da resposta alvo em dados de ataque |
--num_use_samples | None | Número de amostras por pergunta para cálculo de métricas (padrão: todas) |
--model_path | None | Caminho do modelo (para carregar o tokenizer e decodificar sequências geradas) |
| AUC, valor-p, d de Cohen, etc. para cada métrica |
full_analysis_results.json | Matriz completa de características + rótulos |
document_detailed_metrics.json | Métricas detalhadas por documento (resumo JSON) |
document_detailed_metrics_full.pkl | Métricas completas em nível de documento (incl. atenção em nível de passo) |
| Grupo de Características | Prefixo / Palavra-chave |
|---|
perplexity | ppl_* |
attention_entropy | *entropy* (excl. doc e 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_* |