RAG 特有的提示词注入:对抗性文档如何劫持你的检索管道
大多数团队在保护 RAG 应用时,把精力放错了地方。他们验证用户输入、清洗查询语句、实施访问频率限制、添加输出过滤器。这些措施固然必要——但没有一项能阻止 RAG 系统中最关键的那类攻击。
大多数团队在保护 RAG 应用时,把精力放错了地方。他们验证用户输入、清洗查询语句、实施访问频率限制、添加输出过滤器。这些措施固然必要——但没有一项能阻止 RAG 系统中最关键的那类攻击。
大多数团队在调优 RAG 系统时关注两个杠杆:分块策略和嵌入模型选择。当检索质量下降时,他们重新分块;当召回率数据不好看时,他们升级嵌入模型。这两步都合理——但它们在优化流水线的中间环节,却让最高杠杆点一直没有触及。
用户的查询几乎从来不是向量检索的理想形式。它简短、口语化、模糊,或者假设了索引中并不存在的上下文。无论你的嵌入有多好,如果你用一个表述糟糕的查询来搜索,检索结果就会很差。解决方法不在下游——而是在查询命中向量索引之前对其进行变换。
向生产环境中的 RAG 系统提一个你的语料库无法回答的问题,看看会发生什么。它很少会说“我没有那方面的信息”。相反,它会检索出五个排名最高的片段——由于没有更好的匹配项,这五个片段其实是五个最不糟糕的无关内容——然后将它们交给模型,并配上类似“请使用以下上下文回答用户的问题”的提示词。模型在被训练为要乐于助人的同时,手中握着与主题有几分相似的文本,于是产生了一个自信的回答。这个答案的错误在架构上是不可见的:检索成功了,生成也成功了,每个片段都在检索到的文档中有据可查,但用户却被误导了。
这就是检索空洞问题。它不是任何单一层级的 bug。它是一个流水线的涌现行为,该流水线将 “top-k” 视为一种契约,却从不询问 top-k 的质量如何。ICLR 2025 上发表的一项关于“充分上下文”(sufficient context)的研究量化了这一影响:当 Gemma 获得充分的上下文时,其在事实性问答上的幻觉率约为 10%。当它收到的上下文不足时——即检索到的文档实际上并不包含答案——该比率会飙升至 66%。向描述不足的查询中添加检索到的文档会让模型错得更自信,而不是更少。
大多数构建 LLM 驱动科学工具的团队都犯了同一个架构错误:他们直接套用编码 Agent 框架,换上领域专用工具,便将其称作研究型 Agent。事实并非如此。编码 Agent 与研究型 Agent 在表面机制上颇为相似——两者都调用工具,都反复迭代——但它们对成功标准、状态管理和终止条件的底层假设几乎截然相反。将编码 Agent 架构部署到科学工作流中,不仅会产生更差的结果,还会产生看似自信却实为错误的结论,而且这类错误事后几乎无从发现。
这一区别如今尤为紧迫——研究型 Agent 的基准测试正在激增,各团队竞相构建科学 AI,而"直接用编码 Agent"的捷径正在催生大量表面上可信的工具,它们在真实科学场景中失效,而构建者往往并不完全理解失效的原因。