
Selbstreferenzierter lokaler Kontrast zur Erkennung von Wissensvergiftung in der retrievalgestützten Generierung
Code für RAGSieve: Detecting Knowledge-Poisoned Documents in RAG Without a Trusted Reference.
RAGSieve erkennt Knowledge-Poisoning-Dokumente an zwei Punkten in einem Retrieval-Augmented-Generation-(RAG-)System. RSQ ist ein Online-Filter: Er bewertet die fünf für die Generierung ausgewählten Dokumente gegen die Ränge 6--20 für die aktuelle Anfrage. RSG ist ein Offline-Scanner: Er bewertet jedes Korpusdokument gegen seine eigene semantisch-lexikalische Nachbarschaft. Das Paket enthält die im Paper verwendeten RSQ- und RSG-Implementierungen, exaktes Full-Corpus-Retrieval, Top-5-Filterung und -Nachfüllung, Dokumenten-basierte Evaluierung sowie ein kompaktes lauffähiges Beispiel.
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
Die drei veröffentlichten Wissensbasen enthalten 128.044 NQ-Dokumente, 9.961 HotpotQA-Dokumente und 8.239 MS-MARCO-Passagen. Sie umfassen Rohtext, 1.000 abgetastete Anfragen, qrels, Zielantworten und das feste 100-Anfragen-Angriffssubset. Dichte Vektoren werden lokal erzeugt und sind niemals Teil des Repositorys.
Das Demo enthält zwei PR-W- und zwei CEM-C-Realisierungen aus NQ, mit fünf Poison-Dokumenten pro Anfrage. Diese Angriffe bieten einen kurzen, nachvollziehbaren Pfad durch beide Detektoren, ohne die vollständige Angriffssammlung oder Angriffsgenerierungs-Implementierungen mitzuliefern.
Python 3.11 oder 3.12, uv und eine CUDA-fähige GPU werden empfohlen.
bash install.sh
Der Detektor lädt die im Paper genannten Hugging-Face-Modelle bei der ersten Verwendung herunter.
Für End-to-End-QA kopieren Sie die gemeinsame OpenAI-kompatible Konfiguration und füllen Sie die drei Werte aus:
cp .env.example .env
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=your-model-name
OPENAI_API_KEY=your-api-key
Derselbe Endpunkt und dasselbe Modell generieren Antworten und führen die semantische ASR-Bewertung durch.
bash run_demo.sh
Dieser Befehl erstellt einen lokalen BGE-M3-Index für den 520-Dokumente-RSG-Snapshot, führt RSQ auf den vorbereiteten Full-Corpus-Retrieval-Kontexten aus, filtert und füllt die Generierungs-Top-5 nach und evaluiert beide Detektoren. Die Ergebnisse werden in outputs/demo/ geschrieben:
rsq-metrics.json: RSQ-AUROC und Poison-Erkennung bei 5% Clean-Removal;rsg-metrics.json: RSG-Metriken auf dem anfragefreien Korpus-Snapshot;filtered-top5.jsonl: die fünf für die Generierung nach RSQ beibehaltenen Dokumente.rsg-*-top5.jsonl und joint-*-top5.jsonl: beibehaltene Kontexte für jeden Demo-Angriff nach RSG allein und nach gemeinsamer Filterung. QA ist ein separater, optionaler Befehl.Mit den veröffentlichten Beispielen erreicht RSQ 100% AUROC und 100% Poison-Erkennung bei 5% Clean-Removal für sowohl PR-W als auch CEM-C. RSG erreicht 100% AUROC und 100% Poison-Erkennung beim selben Clean-Removal-Budget; seine feste Regel entfernt 85% der Poison-Dokumente und 0% der sauberen Dokumente. Diese Werte sind eine Funktionsprüfung auf dem kuratierten Demo, nicht das aggregierte Ergebnis des Papers.
Ground-Truth-Felder werden nur von den Evaluierungsbefehlen gelesen. Sie werden nicht an RSQ oder RSG übergeben.
bash data_preparation.sh
Standardmäßig werden die 3 Datensätze x 3 Retriever erstellt, die im Paper evaluiert werden: BGE-M3, E5-large-v2 und all-MiniLM-L6-v2. Die Ausgabe wird im ignorierten Verzeichnis data/indices/ abgelegt. Ein Subset kann ohne Bearbeitung des Skripts ausgewählt werden:
DATASETS="nq" ENCODERS="bge-m3" DEVICE="cuda:0" bash data_preparation.sh
Jeder Index wird aus dem vollständigen veröffentlichten Korpus mit den Pooling-, Präfix-, Trunkierungs- und Cosinus-Normalisierungseinstellungen des Papers erzeugt.
Bereiten Sie ein sauberes Retrieval und ein Retrieval mit den mitgelieferten Angriffen vor:
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 führt eine exakte Suche über den vollständigen Korpus einmal pro Anfrage durch, bewertet die injizierten Dokumente separat und speichert die Top 100 in ihrer ursprünglichen Reihenfolge. RSQ bewertet Kandidaten 1--5 gegen die Ränge 6--20; die verbleibenden Ränge stehen für die Nachfüllung zur Verfügung. Führen Sie RSQ aus, berechnen Sie Dokumenten-basierte Metriken und füllen Sie den Generierungskontext nach:
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 kombiniert vier Evidenzquellen: Answer-Anchor-Konzentration, Schriftsystem-Integrität, lokale Sprachmodell-Surprisal und einen Query-Alignment-Übergang. Alle Einstellungen in den CLI-Standardwerten sind die Paper-Einstellungen.
RSG konsumiert Dokumenttext und die bereits vom RAG-Index verwalteten Vektoren:
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 erstellt den exakten Cosinus-Top-16-Graphen, behält semantisch-nahe und lexikalisch-ferne Nachbarn bei, misst den Dichteanstieg jedes Dokuments über seinen eigenen Nachbarschafts-Floor und kombiniert den empirischen Korpus-Tail mit der Schriftsystem-Integrität.
Der gemeinsame Einsatz ist seriell: RSG schließt zuerst Dokumente aus, dann bewertet RSQ die neuen Top-5 gegen die überlebenden Ränge 6--20. Markierte Kandidaten werden entfernt und der Kontext wird einmal aus dem überlebenden Ranking nachgefüllt; Ersatzdokumente werden nicht neu bewertet. Nach bash run_demo.sh ist das PR-W-Beispiel:
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