
RAG 的最大软肋不是检索不准,而是太容易相信检索到的内容
设想这样一个场景:公司内部的知识库助手,负责回答报销政策问题。有员工问"超额采购怎么走报销",助手流畅地回答了一个绕过财务审批的流程,还引用了政策页面。页面是真的,目录位置正确,语气也和周围文档一致——只是两周前,某个拥有普通编辑权限的人往里加了一段话。没有任何告警触发,因为这段话读起来太像正常政策了。
这就是 RAG 投毒攻击的可怕之处:它根本不需要碰模型,只需要往语料库里写内容。
RAG 检索的核心指标是相关性——recall@k、MRR 衡量的都是"取回的段落和问题相关吗"。但"这段话值得相信吗"是另一回事,标准管线里没有任何仪器测量可信度。实践中两者被模糊处理了:排名靠前、切题、行文流畅的段落,就被默认为是对的。投毒攻击恰恰利用这个推理漏洞——毒段落被精心设计成满足检索器的"相关性审美",而它的虚假存在于检索器从不测量的维度。
顺便区分几个容易混淆的概念:
区分它们有实际意义:实验表明,禁掉模型"服从检索文本中指令"的倾向后,注入攻击失效了,但投毒攻击几乎不受影响——因为投毒依赖的是模型相信它读到的东西,而不是服从。
PoisonedRAG 的研究把攻击成功形式化为两个条件:毒段落被检索到 + 检索到之后能带偏答案。攻击者不需要模型权限,不需要知道 prompt,只要有语料库的写权限——共享网盘、Wiki、工单系统、用户投稿、第三方连接器,全是入口。
检索方式上,稀疏检索(BM25)靠关键词重合打分,稠密检索(向量)靠语义相似度。梯度引导的攻击可以专门调制文本,让它落在查询的向量邻域里。混合检索(BM25+向量)确实抬高了门槛——攻击者得同时骗过两个通道。Semantic Chameleon 的实验数据:纯向量检索下 38% 的攻击能把毒文档送进 top5;混合检索下全部失败;但攻击者一旦针对双通道联合优化,成功率又回升到 20%~44%。
近一年的防御研究大致分两派:
看文本表面:过滤复述查询的、带命令语气的、字符统计异常的段落。RAGSec 的实验给这派泼了冷水——面对读过防御方案的自适应攻击者(写陈述句不写疑问句、写断言不写指令、自称可信来源),过滤器的真正率掉到不足 2%。更糟的是"鲁棒聚合"反而帮了攻击者:攻击者只需放两三篇互相印证的毒文档,就能拿到防御机制奖励的"一致性分"。把过滤器调紧到能抓自适应攻击时,正常查询的准确率从 61% 崩到 6%。
看对模型的影响:留一法(逐个移除检索文档重新生成,看答案是否偏移)、注意力权重分析。这类方法效果更好但成本更高(每篇检索文档多一次生成调用),且面对"多篇毒文档互相印证"同样乏力——移除任何一篇,剩下的还在。
RAGSec 实验里唯一把自适应攻击成功率压到 1% 的措施,是入库时验证签名(HMAC)。思路借自软件供应链安全:区分"声称的属性"和"可证明的属性"。来源名称、信任分数都是上传者随口声称的,攻击者想声称哪个都行;而密码学签名必须真的持有密钥才能产生。
但要清醒地认识来源证明的边界:
没有银弹,按数据流向分层:
1. 可信入库:验证绑定作者身份的签名;外部/未签名内容进低信任索引;元数据携带签名者与版本
2. 授权过滤:按提问者权限过滤候选集,让越权检索在生成前就被阻止
3. 混合检索:作为相关性默认方案,顺带抬高梯度攻击成本
4. 内容检测:可疑内容分析+来源感知重排,定位为告警与取证手段
5. 影响检测:高风险查询用留一法,接受额外的生成成本
6. 指令隔离:分隔符、结构化 prompt 区分检索文本与可信指令(这只防注入)
7. 审计日志:记录每个答案用了哪些文档、版本、签名者——出事时能追溯、能撤回
检索管线永远无法判定一句话的真假——它核查事实的唯一手段就是查语料库,而语料库正是攻击者改过的地方。它能做的是记住每句话背后站着谁、以什么权限进来的。签名不能让假话变真,但当某条声明被证伪时,系统能附上名字、时间和修订记录,并撤回该签名者贡献的一切。对检索知识的信任,最终可能落在这样一个朴素的能力上:事后能说清"系统复述了谁的话,他们是凭什么是谁放进来的"。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。