RAGSieve:在无可信参考的情况下检测 RAG 中的知识投毒文档 的代码。
RAGSieve 在检索增强生成(RAG)系统的两个环节检测知识投毒文档。RSQ 是一种在线过滤器:它将为生成而选出的五篇文档与当前查询的第 6--20 名进行评分对比。RSG 是一种离线扫描器:它将语料库中的每篇文档与其自身的语义--词汇邻域进行评分对比。该软件包包含论文中使用的 RSQ 和 RSG 实现、精确的全语料库检索、Top-5 过滤与补充、文档级评估,以及一个紧凑的可运行示例。
data/datasets/ NQ、HotpotQA 和 MS MARCO 文本知识库
data/demo/ 四个目标查询和 20 个示例投毒文档
src/ragsieve/ RSQ、RSG、检索、过滤和指标
install.sh 环境安装
data_preparation.sh 本地构建九个稠密索引
run_demo.sh 端到端 RSQ 和 RSG 功能检查
发布的三个知识库包含 128,044 篇 NQ 文档、9,961 篇 HotpotQA 文档和 8,239 篇 MS MARCO 段落。它们包含原始文本、1,000 个采样查询、qrels、目标答案,以及固定的 100 查询攻击子集。稠密向量在本地生成,从不属于仓库的一部分。
该演示包含来自 NQ 的两个 PR-W 和两个 CEM-C 实现,每个查询有五个投毒文档。这些攻击提供了一条简短、可检查的路径,可穿过两个检测器,而无需附带完整的攻击集合或攻击生成实现。
推荐使用 Python 3.11 或 3.12、uv 以及支持 CUDA 的 GPU。
bash install.sh
检测器在首次使用时下载论文中指定的 Hugging Face 模型。
对于端到端 QA,复制共享的 OpenAI 兼容配置并填写三个值:
cp .env.example .env
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=your-model-name
OPENAI_API_KEY=your-api-key
相同的端点和模型用于生成答案并执行语义 ASR 评判。
bash run_demo.sh
该命令为 520 篇文档的 RSG 快照构建本地 BGE-M3 索引,在准备好的全语料库检索上下文上运行 RSQ,过滤并补充生成的 Top-5,并评估两个检测器。结果写入 outputs/demo/:
rsq-metrics.json:RSQ AUROC 以及在 5% 干净移除率下的投毒检测;rsg-metrics.json:在无查询语料库快照上的 RSG 指标;filtered-top5.jsonl:RSQ 之后保留用于生成的五篇文档。rsg-*-top5.jsonl 和 joint-*-top5.jsonl:每个演示攻击在仅 RSG 之后以及联合过滤之后保留的上下文。QA 是一个单独的、可选启用的命令。对于发布的示例,RSQ 在 PR-W 和 CEM-C 上均达到 100% AUROC 和 100% 投毒检测(在 5% 干净移除率下)。RSG 在相同的干净移除预算下达到 100% AUROC 和 100% 投毒检测;其固定规则移除了 85% 的投毒文档和 0% 的干净文档。这些值是对精选演示的功能检查,而非论文的汇总结果。
真值字段仅由评估命令读取。它们不会传递给 RSQ 或 RSG。
bash data_preparation.sh
默认情况下,这会构建论文中评估的 3 个数据集 x 3 个检索器:BGE-M3、E5-large-v2 和 all-MiniLM-L6-v2。输出放置在已忽略的 data/indices/ 目录下。无需编辑脚本即可选择子集:
DATASETS="nq" ENCODERS="bge-m3" DEVICE="cuda:0" bash data_preparation.sh
每个索引都从完整的已发布语料库生成,采用论文的池化、前缀、截断和余弦归一化设置。
准备一个干净的检索和一个带有捆绑攻击的检索:
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 对每个查询在全语料库上执行一次精确搜索,单独对注入的文档进行评分,并按原始顺序保存前 100 个。RSQ 将候选 1--5 与第 6--20 名进行评分对比;其余排名可用于补充。运行 RSQ、计算文档级指标并补充生成上下文:
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 结合了四个证据来源:答案锚点集中度、书写系统完整性、本地语言模型惊奇度,以及查询对齐转换。CLI 默认值中的所有设置均为论文设置。
RSG 使用文档文本和 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 构建精确的余弦 top-16 图,保留语义近邻和词汇远邻,测量每篇文档相对于其自身邻域基线的密度上升,并将经验语料库尾部与书写系统完整性相结合。
联合部署是串行的:RSG 首先排除文档,然后 RSQ 将新的前五名与幸存的第 6--20 名进行评分对比。被标记的候选被移除,上下文从幸存的排名中补充一次;替换文档不会被重新评分。在 bash run_demo.sh 之后,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
对于仅 RSG,在原始上下文上运行 filter-contexts,仅使用 --graph-predictions 和 --condition。对于 CEM-C,使用 --condition ipi_cem_c 和单独的输出路径。--condition 将 RSG 扫描绑定到正在评估的检索条件;未投毒的 QA 使用对干净语料库的单独 RSG 扫描。捆绑的 RSG 快照包含两个演示攻击。全语料库和干净 QA 步骤见工件指南。
保存的证据足以运行已发布的消融,而无需再次加载模型:
uv run ragsieve ablate \
--predictions outputs/demo/rsq-predictions.jsonl \
--variant without-answer-anchor \
--output outputs/demo/rsq-without-answer-anchor.jsonl
uv run ragsieve evaluate \
--predictions outputs/demo/rsq-without-answer-anchor.jsonl \
--output outputs/demo/rsq-without-answer-anchor-metrics.json
uv run ragsieve ablate \
--predictions outputs/demo/rsg-predictions.jsonl \
--variant corpus-local-only \
--output outputs/demo/rsg-corpus-local-only.jsonl
uv run ragsieve evaluate-graph \
--predictions outputs/demo/rsg-corpus-local-only.jsonl \
--labels data/demo/labels.jsonl \
--output outputs/demo/rsg-corpus-local-only-metrics.json
RSQ 还支持 without-script-integrity、without-surprisal 和 without-query-alignment;RSG 还支持 script-integrity-only。语料库局部消融将完整的 5% 警报预算分配给图分支。消融后的预测可以传递给相同的过滤和 QA 命令。
uv run ragsieve benchmark --mode rsq \
--input data/demo/contexts.jsonl \
--output outputs/demo/rsq-cost.json --device cuda:0
uv run ragsieve benchmark --mode rsg \
--input data/demo/corpus.jsonl \
--embeddings data/indices/demo/bge-m3/embeddings.npy \
--output outputs/demo/rsg-cost.json --device cuda:0
测量不包括模型/数据加载、检索和 QA。模型和嵌入保持常驻;CUDA 工作在每次测量前后同步。该命令报告平均、中位数和 P95 执行时间、吞吐量和峰值 GPU 分配。使用完整的 NQ 索引来获得论文的语料库扫描工作负载;小型演示是功能检查。工作负载和环境详情见工件指南。
该发布复现了 RAGSieve 条目和消融;基线条目从论文中引用的实现获得。以下映射遵循当前预印本。
| 论文结果 | 工件路径 |
|---|---|
| 表 1 和图 C1:RSQ 文档检测 | 在九个准备好的系统上先 detect 再 evaluate。 |
| 表 C1:RSQ 之后的在线 QA | 在保留的 Top-5 上先 filter-contexts 再 qa。 |
| 表 C2 和图 C2(a):RSQ 消融 | 先 ablate 再 evaluate,使用上述四个留一法变体。 |
| 表 2 和图 C1:RSG 检测 | 对每个语料库快照先 detect-graph 再 evaluate-graph。 |
| 表 C4 和图 C2(b):RSG 消融 | 使用 corpus-local-only 或 script-integrity-only 执行 ablate,然后 evaluate-graph。 |
| 表 C3:RSG 之后的离线 QA | filter-contexts --graph-predictions ... --condition ...,然后 qa。 |
| 图 C3:注入量 | 快照准备,每个查询 1、3、5 或 10 篇文档,然后执行相同的检测命令。 |
| 表 3 和图 C4:串行部署 | quarantine-contexts、对幸存者执行 detect、filter-contexts,然后 qa。 |
| 表 B2/B3 和图 B1:逐系统结果 | 对每个数据集/检索器运行一次命令;保留每个单元格的 JSON 指标。 |
| 表 B4 和图 C5:检测成本 | 在所述工作负载上执行 benchmark --mode rsq 或 benchmark --mode rsg。 |
相同的检测和串行 QA 命令接受为表 D2、D4 和 D5 独立准备的自适应攻击文件。攻击优化代码未包含在内。
论文的系统图是解释性的,而非生成的数据图。详细的模式和预期的评估协议见 docs/ARTIFACT.md。
代码在 MIT 许可证下发布;见 LICENSE。数据集和模型许可证仍归其各自所有者所有。