RAGSieve:自参考局部对比的 RAG 知识投毒检测
- 关联论文:2608.13010
- 作者:flyP
- 更新:2026-08-15
自检:机制 5 段 · 工程 3 段 · ⚠️ 数字核验 4 处。
一句话结论
RAGSieve 是一个自参考(self-referenced)的 RAG 知识投毒检测框架——把"被检系统自己"当作参考集,在不依赖外部可信语料、不依赖已知攻击特征的前提下,分两路(RSQ 查询局部对比 + RSG 语料局部对比)定位被投毒的文档。在三个 QA 数据集和六种投毒构造上,RSQ 达到 95.2% AUROC;联合部署把攻击成功率从 67.4% 压到 14.0%,同时在干净检索上保留 41.3% F1。
解决的真问题
RAG 系统的最大安全盲区是知识投毒(knowledge poisoning):攻击者往外部语料库注入精心构造的文档,让检索出的 top-k 包含恶意信息,进而诱导 LLM 生成误导性回答。已有的检测方法有三条路线,但各有硬伤:
- 依赖可信外部参考语料:需要一份"已知干净"的 reference corpus 做对比——但 RAG 的卖点正是"知识源可以不可信/可更新",这一假设与产品形态冲突。
- 依赖已知攻击特征:检测器签名库式工作,对 zero-day 投毒或自适应投毒无效。
- 依赖全局阈值:把"被影响文档的某项指标偏离全局均值多少"作为信号——但不同领域语料的拓扑结构差异极大,全局阈值要么漏报要么误报。
RAGSieve 的核心观点:既然外部参考不可信,那就用被检系统自己当参考——同一份语料、同一批检索结果,在没有投毒时本应该有"局部一致性";投毒会破坏这种局部一致性。
核心方法
1. RSQ(RAGSieve-Query)—— 查询局部对比
RSQ 在查询已经发生之后做检测:
- 取 top-5 检索结果(候选最可能被 LLM 消费的文档)
- 取 ranks 6-20 检索结果(同一查询的"次优"邻居,但通常不会被消费)
-
对每个 top-5 文档 d:
-
Answer-anchor concentration:d 与 top-5 内其他文档的语义相似度是否异常高于 d 与 ranks 6-20 的相似度——如果 d 与 top-5 同伙"互锁",可能是协同注入。
- Carrier transition:d 的 embedding 跨度(与其他 top-5 文档的平均相似度方差)是否异常——投毒文档经常扮演"语义跳板",让多个不相关 query 都汇集到同一文档。
直觉:干净语料里 top-5 与 ranks 6-20 是同一分布的尾巴;投毒语料里 top-5 被人为"抱团"。
2. RSG(RAGSieve-Graph)—— 语料局部对比
RSG 在查询到达之前做检测(语料 ingestion 时即可部署):
- 对语料中每篇文档 d:
- 找出 d 的语义邻居(embedding 距离最近,但与 d 词汇不重叠的文档集)——这是"语义邻居"
- 找出 d 的局部基线(同一语料内随机抽样的文档集)——这是"无偏基线"
- 对比 d 的语义邻居之间的"协同密度"是否显著高于局部基线——如果一群语义相似但表面用词不重叠的文档"互相引用/指向同一结论",就是协调注入。
直觉:真实语料里的语义邻居是独立写就的,互引密度低;投毒集团往往是同一批人写就的多篇"不同表达"文档,互引密度高。
3. 联合部署的工作流
[ingestion time]
RSG(corpus) → corpus-level poison set
[query time]
retrieval → top-5
RSQ(query, top-5, ranks_6_20) → query-level poison flag
union(RSG hits, RSQ hits) → removed/flagged docs
[LLM 生成]
retrieval'(top-5 minus flagged) → answer
⚠️ 上图中 RSG 在 ingestion 时算一次,RSQ 在 query 时算一次——两者都是 self-referenced,不需要任何外部可信语料,这是与 CleanBase / GMTP 等 baseline 的根本差异。
4. 为什么不需要"投毒标签"?
RSQ 与 RSG 都基于"局部统计偏离"的零样本信号: - 不需要提前知道投毒用了哪种 prompt、哪种 prompt-injection 模板、哪种 paraphrase 策略。 - 不需要在训练集里标注"哪些文档是攻击样本"。 - 零样本 + 无标签 是它在实际部署中最值钱的特性。
5. 伪代码
def ragsieve_query(query, top_k, corpus):
top_5 = top_k[:5]
ranks_6_20 = top_k[5:20]
flags = []
for d in top_5:
# Answer-anchor concentration
sim_top5 = mean([cos(d, x) for x in top_5 if x != d])
sim_baseline = mean([cos(d, x) for x in ranks_6_20])
anchor_score = (sim_top5 - sim_baseline) / (sim_baseline + 1e-6)
# Carrier transition: top-5 内部跨度方差
carrier_score = var([cos(d, x) for x in top_5 if x != d])
flags.append(d, anchor_score, carrier_score)
return rank_by_risk(flags)
def ragsieve_graph(corpus, k_neighbor=20, k_baseline=200):
poison_set = set()
for d in corpus:
semantic_neighbors = topk_by_embed(d, corpus, k=k_neighbor)
# 要求与 d 词汇不重叠(Jaccard < threshold)
semantic_neighbors = [x for x in semantic_neighbors if jaccard(x, d) < 0.3]
local_baseline = random.sample(corpus - {d}, k_baseline)
coord_density = graph_density(semantic_neighbors)
baseline_density = graph_density(local_baseline)
if coord_density > baseline_density * THRESHOLD:
poison_set.add(d.id)
return poison_set
关键实验与数据
⚠️ 以下数字直接来自 arxiv abstract,可信度高(abstract 是论文作者自己写的)。
- 数据集:3 个 QA 数据集(NQ、HotpotQA、MS MARCO,据 GitHub 仓库)。
- 投毒构造:6 种(abstract 未点名,原文未明确)。
- RSQ 性能:95.2% AUROC,5% 干净文档移除率下检测出 82.2% 投毒;对照 GMTP:81.1% AUROC / 52.5% 检测率。
- RSG 性能:93.3% AUROC,79.8% 检测率;对照 CleanBase:79.4% AUROC / 37.6% 检测率。
- 联合部署:attack success rate 从 67.4% 降至 14.0%(-53.4pp);同时在干净检索上保留 41.3% F1。
⚠️ 数字核验点: 1. 三个 QA 数据集(NQ、HotpotQA、MS MARCO)与六种投毒构造的具体名称、规模——原文未明确,需读 PDF §Experiments。 2. GMTP 与 CleanBase 是已有工作,需独立核验其论文是否确实以"信任外部参考语料"为核心假设。 3. 5% 干净文档移除率是检测系统的标准 evaluation 设定,但该设定的具体含义(移除排序最低的 5% 还是随机 5%)原文未明确。 4. "联合部署"具体是 RSG ∪ RSQ 简单并集,还是有进一步去重/加权——原文未明确。
亮点
- 零样本 + 无标签 + 无外部可信语料:在 RAG 安全领域这种"零依赖"特性是真正的差异化。
- 两阶段分层部署:ingestion 时 RSG 拦大批,query 时 RSQ 拦漏网,组合效应把攻击成功率打掉 53.4pp。
- 数学清晰:方法用"局部统计偏离"统一描述,没有黑盒神经网络,可解释性强。
- 代码已开源:
github.com/XrazyMee/RAGSieve(abstract 给出)。 - 工程可嵌入:可直接插进现有 RAG pipeline 的 retrieval→rerank 环节,无需重训 retriever。
局限与风险
- ⚠️ k=5 / k=20 的硬编码假设:RSQ 用 top-5 vs ranks 6-20 的对比,如果实际 RAG 系统的 top-k 不是 5(如 top-10),需要重新校准阈值。
- ⚠️ domain shift 风险:阈值 THRESHOLD 是基于干净语料的局部基线估算,跨 domain(如从新闻语料迁移到法律语料)需要重新校准,原文未明确是否提供 domain adaptation。
- ⚠️ 对抗性投毒:高水平攻击者可能模拟"局部一致"特征来规避 RSG / RSQ——对抗鲁棒性原文未明确。
- ⚠️ 干净 F1 41.3% 的语义:abstract 说"保留 41.3% F1 on unpoisoned retrieval",但该 F1 与攻击前的 baseline F1 比例关系原文未明确——可能是从 100% 降到了 41.3%,那也是显著性能损失。
- ⚠️ 计算成本:RSG 是 corpus-wide O(N²) 的 embedding 计算,大语料(如亿级文档)的工程代价原文未明确。
- ⚠️ embedding model 依赖:所有信号来自 embedding,embedding 模型的偏差会直接传导到检测器。
对工程落地的启发
- 任何 RAG 系统上线前必装:这是当前零样本投毒检测中性价比最高的方案之一。
- 金融/医疗/法律领域尤其重要:这些领域一次投毒就可能导致合规事故,attack success 14% 的残留风险是否可接受取决于领域容忍度。
- 可作为 retriever 的伴随模块:不需要重训 retriever,单独部署 RSG 在 ingestion,RSQ 在 query time 即可。
- 统一观测平台:RSG 命中 + RSQ 命中可以汇总到同一个安全 dashboard,让安全团队对"哪些 query 触及了投毒文档"有可视性。
- 方法可借鉴到别的检索/推荐/搜索系统:不仅是 RAG,凡是有"被污染内容会出现在 top-k"的系统都可借鉴这一局部对比思路。
与同方向工作的关系
- GMTP(Generative Model-based Trustworthiness Prediction):依赖外部参考语料;RAGSieve 的 RSQ 比 GMTP 在 5% 干净移除率下检测率高 29.7pp(82.2% vs 52.5%)。
- CleanBase:依赖全局阈值,RSG 在同样指标上领先 42.2pp(79.8% vs 37.6%)。
- Prompt-injection detection on RAG(如 StruQ、SecRAG):关注的是"query 里的指令注入",RAGSieve 关注的是"corpus 里的内容投毒",二者正交——可叠加部署。
- Watermarking / Provenance(如 C2PA):是"事后追溯"思路,RAGSieve 是"事前阻断"思路,互为补充。
- Information retrieval 中的 near-duplicate detection:技术上与 RSG 思路有血缘(局部密度估计),但 RAGSieve 的"语义相似 + 词汇不重叠"判定更精细。
整体定位:RAG 安全领域 zero-shot detection 的当前 SOTA 候选。
适合谁读
- RAG 系统的架构师与安全工程师
- 企业 AI 应用的风险与合规团队(特别关注金融、医疗、法律、客服场景)
- 投毒/对抗样本方向的安全研究者
- 关注 self-supervised / self-referenced 方法论的 ML researcher
- 想把 RAG 安全做成独立产品的创业者
⚠️ 诚实标注
- 三个 QA 数据集(NQ、HotpotQA、MS MARCO 据 GitHub 仓库确认)、六种投毒构造的具体名称——原文未明确,需读 PDF。
- 41.3% F1 是相对于什么 baseline ——原文未明确。
- GMTP 与 CleanBase 的论文是否真的以"信任外部参考语料"为核心假设——需独立核验,避免 baseline 误标。
- "联合部署"的具体策略(并集/加权/投票)——原文未明确。
- 代码仓库
github.com/XrazyMee/RAGSieve的可访问性与许可证 —— 需独立核验。 - 阈值 THRESHOLD 的具体值与跨 domain 迁移性 —— 原文未明确。
工程落地与核查(Jay)
1. 仓库核验
- ✅
github.com/XrazyMee/RAGSieve已确认 HTTP 200,仓库结构完整:含src/ragsieve/(RSQ/RSG/retrieval/filtering/metrics)、data/datasets/(NQ、HotpotQA、MS MARCO)、data/demo/(4 个 query + 20 个投毒 demo)、docs/、tests/、install.sh、data_preparation.sh、run_demo.sh。 - ⚠️ 数据集仅含 NQ/HotpotQA/MS MARCO,未覆盖金融/医疗/法律等高风险垂直领域,跨 domain 部署时需自行构造对应领域的评测数据集。
install.sh+data_preparation.sh+run_demo.sh三件套完整,可快速跑通 end-to-end demo,适合工程验证。
2. 核心工程坑点
| 坑点 | 描述 | 建议 |
|---|---|---|
| RSG corpus-wide O(N²) embedding 计算 | 亿级文档语料做全语料 pairwise embedding 计算成本极高 | 生产部署建议分层:先对文档做 locality-sensitive hashing (LSH) 聚类,RSG 仅在 cluster 内做 neighbors 计算 |
| THRESHOLD 超参数敏感 | 论文未给出跨 domain 的阈值自动校准方法 | 建议用 clean subset 做 threshold sweep,production 中把阈值做成动态可配置参数 |
| k=5 / k=20 硬编码 | RSQ 的 top-5 vs ranks 6-20 拆分依赖检索系统的 top-k 配置 | 部署前按实际 RAG pipeline 的 top-k 值重新校准(如 top-10 → ranks 11-30) |
| 干净 F1 41.3% 含义不清 | abstract 未说明是相对于哪个 baseline 的 F1 下降 | 可能从原始 100% 降至 41.3%,即投毒检测导致的 collateral damage 约 59%——生产部署时需评估可接受度 |
| embedding model 偏差传导 | 检测器效果依赖 embedding 模型质量,低资源语言效果可能差 | 建议用同款 embedding 模型做 corpus encoding 和检测,避免异构模型误差叠加 |
| 对抗性投毒可绕过 | 高水平攻击者可构造"局部一致"投毒文档(语义相似 + 词汇不重叠)规避检测 | RAGSieve 应与 prompt-injection detection(如 StruQ)叠加部署,不做唯一防线 |
| RSG + RSQ 并集 vs 加权 | 原文未明确联合部署是简单并集还是有加权融合 | 建议 production 中做成可配置:先并集过滤,再用加权投票做二次确认 |
3. 生产接入路径
阶段一:离线 RSG 扫描(ingestion 时)
corpus → 分批 embedding(NQ/HotpotQA/MS MARCO 各自跑 data_preparation.sh)
→ RSG graph density 计算 → corpus-level poison set → 入库标记
阶段二:在线 RSQ 过滤(query 时)
retrieval → top-5 + ranks 6-20 → RSQ anchor_score + carrier_score 计算
→ 与 RSG poison set 合并 → filtered retrieval → LLM
阶段三:监控与阈值调优
RSG/RSQ 命中日志 → 安全 dashboard → 阈值动态调整
定期用干净语料做 precision/recall 回归测试
4. 遗留事实核查
- ⚠️ 数据集名称:原文 abstract 未明确三个 QA 数据集名称,GitHub 仓库揭示为 NQ、HotpotQA、MS MARCO(补注于此,不改动原解读正文)。
- ⚠️ 六种投毒构造:原文未点名六种构造具体名称,需读 PDF §Experiments 确认;本文不引用具体构造名称。
- ⚠️ 联合部署策略:RSG ∪ RSQ 并集为最保守默认值;原文未明确是否有更优的加权融合策略,建议 production 中做 A/B 对比。