首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >RAG 的最大软肋不是检索不准,而是太容易相信检索到的内容

RAG 的最大软肋不是检索不准,而是太容易相信检索到的内容

原创
作者头像
HELLO程序员
发布于 2026-10-31 20:18:13
发布于 2026-10-31 20:18:13
770
举报

RAG 的最大软肋不是检索不准,而是太容易相信检索到的内容

设想这样一个场景:公司内部的知识库助手,负责回答报销政策问题。有员工问"超额采购怎么走报销",助手流畅地回答了一个绕过财务审批的流程,还引用了政策页面。页面是真的,目录位置正确,语气也和周围文档一致——只是两周前,某个拥有普通编辑权限的人往里加了一段话。没有任何告警触发,因为这段话读起来太像正常政策了。

这就是 RAG 投毒攻击的可怕之处:它根本不需要碰模型,只需要往语料库里写内容。

相关性 ≠ 可信度

RAG 检索的核心指标是相关性——recall@k、MRR 衡量的都是"取回的段落和问题相关吗"。但"这段话值得相信吗"是另一回事,标准管线里没有任何仪器测量可信度。实践中两者被模糊处理了:排名靠前、切题、行文流畅的段落,就被默认为是对的。投毒攻击恰恰利用这个推理漏洞——毒段落被精心设计成满足检索器的"相关性审美",而它的虚假存在于检索器从不测量的维度。

顺便区分几个容易混淆的概念:

  • 文档投毒:往语料库放假内容,让检索把它当证据——模型被"说服"
  • 间接提示注入:在可检索内容里藏指令——模型被"命令"
  • 越权检索:用户拿到不该看的文档——这是权限问题,哪怕语料每句都是真话

区分它们有实际意义:实验表明,禁掉模型"服从检索文本中指令"的倾向后,注入攻击失效了,但投毒攻击几乎不受影响——因为投毒依赖的是模型相信它读到的东西,而不是服从。

攻击门槛低到离谱

PoisonedRAG 的研究把攻击成功形式化为两个条件:毒段落被检索到 + 检索到之后能带偏答案。攻击者不需要模型权限,不需要知道 prompt,只要有语料库的写权限——共享网盘、Wiki、工单系统、用户投稿、第三方连接器,全是入口。

检索方式上,稀疏检索(BM25)靠关键词重合打分,稠密检索(向量)靠语义相似度。梯度引导的攻击可以专门调制文本,让它落在查询的向量邻域里。混合检索(BM25+向量)确实抬高了门槛——攻击者得同时骗过两个通道。Semantic Chameleon 的实验数据:纯向量检索下 38% 的攻击能把毒文档送进 top5;混合检索下全部失败;但攻击者一旦针对双通道联合优化,成功率又回升到 20%~44%。

检测类防御的天花板

近一年的防御研究大致分两派:

看文本表面:过滤复述查询的、带命令语气的、字符统计异常的段落。RAGSec 的实验给这派泼了冷水——面对读过防御方案的自适应攻击者(写陈述句不写疑问句、写断言不写指令、自称可信来源),过滤器的真正率掉到不足 2%。更糟的是"鲁棒聚合"反而帮了攻击者:攻击者只需放两三篇互相印证的毒文档,就能拿到防御机制奖励的"一致性分"。把过滤器调紧到能抓自适应攻击时,正常查询的准确率从 61% 崩到 6%。

看对模型的影响:留一法(逐个移除检索文档重新生成,看答案是否偏移)、注意力权重分析。这类方法效果更好但成本更高(每篇检索文档多一次生成调用),且面对"多篇毒文档互相印证"同样乏力——移除任何一篇,剩下的还在。

真正有效的方向:来源证明(Provenance)

RAGSec 实验里唯一把自适应攻击成功率压到 1% 的措施,是入库时验证签名(HMAC)。思路借自软件供应链安全:区分"声称的属性"和"可证明的属性"。来源名称、信任分数都是上传者随口声称的,攻击者想声称哪个都行;而密码学签名必须真的持有密钥才能产生。

但要清醒地认识来源证明的边界:

  • 它能证明"这些字节由持有某密钥的人提交、之后未被篡改"
  • 它不能证明内容正确、签名者没被骗、签名者有权这么说
  • HMAC 是对称方案,生产环境应换非对称签名
  • 如果攻击来自有合法权限的内部人(就像开头报销政策的例子),签名检查照常通过——这时需要的就不只是"真实性"而是"授权":每个作者的签名身份、每类文档的修改权限、高影响页面的评审与版本记录、检索时能展示签名者

分层防御设计

没有银弹,按数据流向分层:

1. 可信入库:验证绑定作者身份的签名;外部/未签名内容进低信任索引;元数据携带签名者与版本

2. 授权过滤:按提问者权限过滤候选集,让越权检索在生成前就被阻止

3. 混合检索:作为相关性默认方案,顺带抬高梯度攻击成本

4. 内容检测:可疑内容分析+来源感知重排,定位为告警与取证手段

5. 影响检测:高风险查询用留一法,接受额外的生成成本

6. 指令隔离:分隔符、结构化 prompt 区分检索文本与可信指令(这只防注入)

7. 审计日志:记录每个答案用了哪些文档、版本、签名者——出事时能追溯、能撤回

结语

检索管线永远无法判定一句话的真假——它核查事实的唯一手段就是查语料库,而语料库正是攻击者改过的地方。它能做的是记住每句话背后站着谁、以什么权限进来的。签名不能让假话变真,但当某条声明被证伪时,系统能附上名字、时间和修订记录,并撤回该签名者贡献的一切。对检索知识的信任,最终可能落在这样一个朴素的能力上:事后能说清"系统复述了谁的话,他们是凭什么是谁放进来的"。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 相关性 ≠ 可信度
  • 攻击门槛低到离谱
  • 检测类防御的天花板
  • 真正有效的方向:来源证明(Provenance)
  • 分层防御设计
  • 结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档