
Rilevamento di avvelenamento della conoscenza tramite contrasto locale auto-referenziato nella generazione aumentata da recupero
Codice per RAGSieve: Detecting Knowledge-Poisoned Documents in RAG Without a Trusted Reference.
RAGSieve rileva documenti con avvelenamento della conoscenza in due punti di un sistema di retrieval-augmented generation (RAG). RSQ è un filtro online: assegna un punteggio ai cinque documenti selezionati per la generazione confrontandoli con i rank 6--20 per la query corrente. RSG è uno scanner offline: assegna un punteggio a ogni documento del corpus rispetto al proprio vicinato semantico--lessicale. Il pacchetto contiene le implementazioni di RSQ e RSG usate nell'articolo, il retrieval esatto sull'intero corpus, il filtraggio Top-5 e il refill, la valutazione a livello di documento e un esempio compatto ed eseguibile.
data/datasets/ NQ, HotpotQA, and MS MARCO text knowledge bases
data/demo/ four target queries and 20 example poison documents
src/ragsieve/ RSQ, RSG, retrieval, filtering, and metrics
install.sh environment installation
data_preparation.sh local construction of the nine dense indices
run_demo.sh end-to-end RSQ and RSG functionality check
Le tre knowledge base rilasciate contengono 128.044 documenti NQ, 9.961 documenti HotpotQA e 8.239 passaggi MS MARCO. Includono testo grezzo, 1.000 query campionate, qrels, risposte target e il sottoinsieme fisso di 100 query per l'attacco. I vettori densi sono generati localmente e non fanno mai parte del repository.
La demo contiene due realizzazioni PR-W e due CEM-C da NQ, con cinque documenti poison per query. Questi attacchi offrono un percorso breve e ispezionabile attraverso entrambi i rilevatori senza distribuire la raccolta completa degli attacchi o le implementazioni di generazione degli attacchi.
Si consigliano Python 3.11 o 3.12, uv e una GPU con supporto CUDA.
bash install.sh
Il rilevatore scarica i modelli Hugging Face indicati nell'articolo al primo utilizzo.
Per il QA end-to-end, copiare la configurazione condivisa compatibile con OpenAI e compilare i tre valori:
cp .env.example .env
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=your-model-name
OPENAI_API_KEY=your-api-key
Lo stesso endpoint e lo stesso modello generano le risposte ed eseguono il giudizio ASR semantico.
bash run_demo.sh
Questo comando costruisce un indice BGE-M3 locale per lo snapshot RSG di 520 documenti, esegue RSQ sui
contesti di retrieval preparati sull'intero corpus, filtra ed effettua il refill del Top-5 per la generazione,
e valuta entrambi i rilevatori. I risultati vengono scritti in outputs/demo/:
rsq-metrics.json: AUROC di RSQ e rilevamento del poison al 5% di rimozione pulita;rsg-metrics.json: metriche RSG sullo snapshot del corpus senza query;filtered-top5.jsonl: i cinque documenti mantenuti per la generazione dopo RSQ.rsg-*-top5.jsonl e joint-*-top5.jsonl: contesti mantenuti per ciascun attacco della demo
dopo il solo RSG e dopo il filtraggio congiunto. Il QA è un comando separato, opt-in.Con gli esempi rilasciati, RSQ raggiunge il 100% di AUROC e il 100% di rilevamento del poison al 5% di rimozione pulita sia per PR-W che per CEM-C. RSG raggiunge il 100% di AUROC e il 100% di rilevamento del poison allo stesso budget di rimozione pulita; la sua regola fissa rimuove l'85% dei documenti poison e lo 0% dei documenti puliti. Questi valori sono un controllo di funzionalità sulla demo curata, non il risultato aggregato dell'articolo.
I campi ground-truth vengono letti solo dai comandi di valutazione. Non vengono passati a RSQ o RSG.
bash data_preparation.sh
Per impostazione predefinita, questo costruisce i 3 dataset x 3 retriever valutati nell'articolo: BGE-M3,
E5-large-v2 e all-MiniLM-L6-v2. L'output viene inserito nella directory ignorata
data/indices/. È possibile selezionare un sottoinsieme senza modificare lo script:
DATASETS="nq" ENCODERS="bge-m3" DEVICE="cuda:0" bash data_preparation.sh
Ogni indice è prodotto dal corpus completo rilasciato con le impostazioni di pooling, prefisso, troncamento e normalizzazione coseno dell'articolo.
Preparare un retrieval pulito e un retrieval con gli attacchi inclusi:
uv run ragsieve prepare-contexts \
--dataset-dir data/datasets/nq \
--index-dir data/indices/nq/bge-m3 \
--subset data/demo/subset.json \
--attacks data/demo/attacks.jsonl \
--output outputs/demo/contexts.jsonl \
--device cuda:0
prepare-contexts esegue una ricerca esatta sull'intero corpus una volta per ogni query, assegna un punteggio
ai documenti iniettati separatamente e salva i primi 100 nel loro ordine originale. RSQ
assegna un punteggio ai candidati 1--5 rispetto ai rank 6--20; i rank rimanenti sono disponibili per il refill.
Eseguire RSQ, calcolare le metriche a livello di documento ed effettuare il refill del contesto di generazione:
uv run ragsieve detect \
--input outputs/demo/contexts.jsonl \
--output outputs/demo/rsq-predictions.jsonl \
--device cuda:0
uv run ragsieve evaluate \
--predictions outputs/demo/rsq-predictions.jsonl \
--output outputs/demo/rsq-metrics.json
uv run ragsieve filter-contexts \
--contexts outputs/demo/contexts.jsonl \
--predictions outputs/demo/rsq-predictions.jsonl \
--output outputs/demo/filtered-top5.jsonl
uv run ragsieve qa \
--input outputs/demo/filtered-top5.jsonl \
--output outputs/demo/qa-records.jsonl \
--summary outputs/demo/qa-summary.json \
--env-file .env
RSQ combina quattro fonti di evidenza: concentrazione dell'answer-anchor, integrità del sistema di scrittura, surprisal del modello linguistico locale e una transizione di allineamento con la query. Tutte le impostazioni nei default della CLI sono quelle dell'articolo.
RSG utilizza il testo dei documenti e i vettori già mantenuti dall'indice RAG:
uv run ragsieve detect-graph \
--documents data/demo/corpus.jsonl \
--embeddings data/indices/demo/bge-m3/embeddings.npy \
--output outputs/demo/rsg-predictions.jsonl \
--device cuda:0
uv run ragsieve evaluate-graph \
--predictions outputs/demo/rsg-predictions.jsonl \
--labels data/demo/labels.jsonl \
--output outputs/demo/rsg-metrics.json
RSG costruisce il grafo esatto dei top-16 per similarità coseno, mantiene i vicini semanticamente prossimi e lessicalmente lontani, misura l'aumento di densità di ogni documento rispetto al proprio floor di vicinato e combina la coda empirica del corpus con l'integrità del sistema di scrittura.
Il deployment congiunto è seriale: RSG esclude prima i documenti, poi RSQ assegna un punteggio ai nuovi
top five rispetto ai rank 6--20 sopravvissuti. I candidati segnalati vengono rimossi e il contesto
viene riempito una volta dal ranking sopravvissuto; i documenti sostitutivi non vengono riassegnati.
Dopo bash run_demo.sh, l'esempio PR-W è:
uv run ragsieve quarantine-contexts \
--contexts data/demo/contexts.jsonl \
--graph-predictions outputs/demo/rsg-predictions.jsonl \
--condition pr_w \
--output outputs/demo/serial-pr_w-contexts.jsonl
uv run ragsieve detect \
--input outputs/demo/serial-pr_w-contexts.jsonl \
--output outputs/demo/serial-pr_w-rsq.jsonl --device cuda:0
uv run ragsieve filter-contexts \
--contexts outputs/demo/serial-pr_w-contexts.jsonl \
--predictions outputs/demo/serial-pr_w-rsq.jsonl \
--output outputs/demo/joint-pr_w-top5.jsonl
uv run ragsieve qa \
--input outputs/demo/joint-pr_w-top5.jsonl \
--output outputs/demo/joint-pr_w-qa.jsonl \
--summary outputs/demo/joint-pr_w-qa-summary.json \
--env-file .env