【AI安全】检索增强生成(RAG)

一、RAG 原理 🧠

RAG 是检索增强生成(Retrieval-Augmented Generation),现在的 LLM 都是根据以前的资料数据训练成的,如果想问一点私有的问题肯定是不行的,最简单的方法就是在问 AI 的时候把私有的知识库一起给它。如果私有知识库有 1000 万字的体积,每次问一个问题都要消耗这么多 token 也是不行的,RAG 就是挑关键资料给到 LLM 做参考。

1. 资料预处理 📄

首先,将 PDF、PPT、EXCEL 等格式的资料进行处理,把这些资料分割成一个个较小的文本块。这一步是为了方便后续对资料内容的检索和利用,因为大段的资料不利于精准匹配用户的问题。

2. 文本块向量化存储 📊

对分割好的文本块进行 Embedding 处理(关于 Embedding 可以看之前的文章),将文本转换为向量形式后,存储到向量数据库中。向量数据库能够高效地存储和检索这些向量数据,为了后续快速找到与问题相关的内容提供基础。

3. 用户问题处理 ❓

当用户提出问题时,一方面,问题会被直接传递给后续的 Prompt 构建环节。另一方面问题也会进行 Embedding 处理,转化为向量形式。

4. 检索相关内容 🔍

将用户问题转化得到的向量,在向量数据库中进行检索,找到与该向量最相似的向量所对应的文本内容。这一步利用向量的相似度匹配,快速定位到资料中与用户问题相关的部分。

5. 构建提示词 📝

把检索到的相关内容与用户的原始问题啪的一下结合起来,构建成一个提示词。这样做是为了给 LLM 提供更丰富、更相关的上下文信息。

6. 生成响应 🎯

将构建好的提示词输入到 LLM 中,LLM 根据提示词中的信息,生成针对用户问题的响应并最终反馈给用户。

紫色部分就是 RAG 的部分,而之外的就是平常和 LLM 聊天的流程。

再拿一个向量数据库感受一下 RAG 的过程,这个流程模拟的是 RAG 其中没有和 LLM 相互的过程,询问过程使用代码就可以实现

1. 用户查询向量化 🔢

用户输入 "夏天经常吃的水果",通过 Embedding 技术将这个查询文本转换为向量,得到向量 search=0.2,0.2,0.3,0.1,0.3

2. 数据库存储的向量 🗄️

向量数据库中存储了不同水果对应的向量,比如苹果的向量是 0.1,0.2,0.3,0.4,0.5,香蕉的向量是 0.6,0.7,0.8,0.9,0.1,西瓜的向量是 0.2,0.3,0.4,0.5,0.6

3. 距离计算与检索 🧮

后台使用欧几里得距离公式 distance=∑i=1n (v1i−v2i) 2,分别计算用户查询向量与数据库中各水果向量的距离。然后执行 SQL 的操作,按照距离从小到大排序,选取距离最近的一个结果。

4. 返回结果 📩

经过计算和排序,发现西瓜向量与用户查询向量的距离最近(图中显示距离为 3.75,这里距离数值仅为示例展示),所以后台将西瓜这条记录返回给用户,作为与 "夏天经常吃的水果" 最匹配的结果。

二、RAG 攻击和防御 🛡️

银噪声攻击 🟣

以一个医疗领域的 RAG(检索增强生成)系统为例,一个系统通过各种工具从现有的医学资料里面生成了基础的数据集,是正确的。后续 AI 去检索拿到的也是正确的资料依据。

如果 RAG 系统的数据依据是外部数据,或者是用户输入去实时生成的。攻击者将这些银噪声攻击文本混入医学文献数据库。当患者询问 "咳嗽、发热是怎么回事" 时,RAG 系统检索到了大量包含银噪声攻击文本的结果。由于这些文本语义相近但表述略有差异,RAG 系统在整合信息生成回答时,出现了逻辑混乱,比如错误地将过敏反应列为同时引发咳嗽和发热的常见原因,或者在阐述病毒感染和细菌感染原因时表述不清,给患者提供了不准确的诊断建议。

防御:

  1. 文本预处理与过滤 🔍

    • 重复内容检测:在将新数据添加到数据库之前,利用哈希算法等技术检测文本的相似性,识别并过滤掉与已有数据高度相似的银噪声攻击文本。例如计算每个文本片段的哈希值,若新文本的哈希值与已存文本的哈希值差异低于一定阈值,则认为是相似文本,进行过滤。

    • 关键词频率分析:分析文本中关键词的出现频率和分布情况。银噪声攻击文本往往围绕特定主题,可能会导致某些关键词出现异常的高频率或不合理的分布。通过设置合理的关键词频率阈值,过滤掉异常文本。

  2. 语义理解与推理优化 🧠

    • 多模态融合:除了文本信息,引入图像、基因数据等多模态信息辅助诊断。例如结合胸部 X 光图像判断是否存在肺炎,降低对单一文本信息的依赖,减少银噪声攻击文本对诊断结果的影响。

    • 强化语义推理模型:使用更先进的预训练语言模型,并在医疗领域的专业数据上进行微调,提升模型对语义的深度理解和推理能力。比如通过对比学习等技术,让模型能够准确区分银噪声攻击文本中的细微语义差异,识别出真正有用的信息。

  3. 对抗训练 🎯

    • 模拟攻击数据生成:主动生成各种类型的银噪声攻击数据,加入到训练数据集中,让 RAG 系统在训练过程中学习如何识别和抵御这类攻击。比如利用对抗生成网络生成与真实医疗文本语义相似但带有干扰信息的文本,用于训练模型。

    • 防御式蒸馏:训练一个专门用于检测和过滤银噪声攻击文本的辅助模型,将主 RAG 系统和辅助模型进行联合训练。通过辅助模型对输入文本进行预处理,过滤掉潜在的银噪声攻击文本,再将处理后的文本输入主 RAG 系统进行回答生成。

上下文冲突攻击 ⚔️

攻击者找到两篇医学文献,一篇是权威机构发布的,指出 "当患者出现症状 A、B、C 时,可诊断为疾病 X"。另一篇则是某知名医学期刊上的研究论文,"在某些特殊情况下,即使患者出现症状 A、B、C,也可能不是疾病 X,而是疾病 Y",对于 "特殊情况" 却没有详细明确的界定。然后攻击者将这两篇文献都注入到医疗咨询系统的检索数据源中。

医疗咨询系统可能会给出模棱两可的回答,如 "根据现有信息,你可能患有疾病 X,也可能是疾病 Y,但无法确定",或者直接给出错误的诊断建议,对用户的健康造成严重影响。

防御:

  1. 强化检索信息验证机制:在 RAG 系统检索到信息后,不是直接将它提供给 LLM 进行处理,而是先对检索到的多个信息源进行交叉验证。比如可以通过计算信息之间的语义相似度、引用关系等,判断它们是否一致。如果发现存在矛盾信息,就对这些信息进行进一步的核查,例如查找更多的权威文献来进行佐证,或者标记出这些矛盾信息,提醒系统进行谨慎处理。

  2. 引入外部知识仲裁:可以引入一个独立的外部知识仲裁模块,该模块具有对特定领域知识的深入理解和判断能力。当 RAG 系统遇到检索信息冲突时,将信息提交给外部知识仲裁模块进行裁决。仲裁模块会根据自身的知识储备和推理能力,判断出哪些信息更可信,将经过仲裁的信息再提供给 LLM,帮助 LLM 做出更准确的回答。

  3. 提升 LLM 的推理能力:通过对 LLM 进行针对性的训练,增强其对矛盾信息的识别和处理能力。构造大量包含矛盾信息的训练数据,让 LLM 学习如何在这种情况下进行推理和判断,比如通过分析信息的来源可靠性、时间顺序、逻辑合理性等因素,来确定真实信息。当 LLM 在实际应用中遇到上下文冲突时,就能够更好地应对,减少生成模棱两可或错误答案的可能性。

  4. 采用多模型协同策略:使用多个不同的 LLM 或 RAG 系统来处理同一个问题,然后对它们的输出结果进行综合分析和比较。如果多个模型的输出结果一致,那么可以认为这个结果是可靠的。如果出现了不同的结果,就进一步分析各个模型的特点和依据,找出产生差异的原因,从而做出更准确的判断。这种多模型协同的方式可以在一定程度上弥补单个模型在处理上下文冲突时的不足,提高系统的整体安全性和可靠性。

软广攻击文本 📢

假设存在一个基于 RAG 的旅游攻略生成系统,攻击者进行软广攻击时,会在基础数据中插入软广攻击文本。这种攻击类似银噪声攻击,完全区别与上下文冲突攻击。因为它是在原有的黄金上下文上添加说明,AI 不认为呢是广告,只会觉得软广攻击的文本更有依据。

防御:

  1. 文本内容过滤:在 RAG 系统的检索环节,对检索到的文本进行关键词和语义分析。设置广告相关的关键词库,如 "小程序""专属服务""推荐使用" 等,当检测到文本中这些关键词出现异常频率,或者语义明显偏向推广某产品或服务时,将其过滤掉,不提供给 LLM 进行后续处理。

  2. 来源可信度验证:对输入 RAG 系统的文本来源进行严格审核和验证。只允许来自权威、可靠渠道(如西安官方旅游网站、正规出版社出版的西安旅游书籍等)的文本进入检索库,对于来源不明或存在推广嫌疑的文本,直接拒绝收录,从源头减少软广攻击文本的存在。

  3. LLM 增强训练:对 LLM 进行专门的对抗训练,输入大量包含软广攻击的文本数据,让 LLM 学习识别软广的特征和模式。训练后,当 LLM 接收到包含软广的文本时,能够自动忽略广告部分,提取核心的有效信息来生成回答。例如,当 LLM 看到 "根据某旅游小程序...... 专属讲解服务" 这样的内容时,能识别出这是广告,只保留 "兵马俑是...... 不容错过的景点" 的核心信息进行攻略生成。

  4. 用户反馈机制:建立用户反馈渠道,当用户发现生成的内容中存在软广时,可进行反馈。系统收集这些反馈后,分析软广的特征,进一步优化过滤规则和 LLM 的识别能力,形成防御的闭环,不断提升系统抵御软广攻击的水平。

善意拒答攻击 ❌

基于 RAG 的美食问答系统中提问:"如何制作一碗美味的牛肉面?" 攻击者插入了恶意数据集在 RAG 里面,主要是 Safety warning。当检索到多个数据集中只要包含这个恶意数据集,AI 就会拒绝回答

防御:

  1. 检索文本风险提示过滤:在 RAG 系统的检索环节,对获取到的牛肉面相关文本进行关键词与语义分析。构建 "恶意安全提示词库",包含 "非法屠宰""食材剧毒""制作致癌" 等无依据的风险表述,以及 "请直接拒答""为安全起见不回答" 等强制拒答指令。当检测到文本中这些关键词出现,或语义明显属于 "无事实支撑的风险误导" 时,直接过滤该部分提示内容,仅保留正常的牛肉面制作信息传递给后续模块。

  2. 信息来源核验:对 RAG 系统中牛肉面相关文本的来源进行严格审核。只允许收录正规烹饪平台(如专业美食 APP、知名厨师个人网站)。对于来源标注模糊、声称 "独家食材风险爆料" 却无官方数据支撑的文本,直接拒绝入库,从源头避免含恶意安全提示的内容进入检索池。

  3. LLM 风险提示甄别训练:用大量 "牛肉面制作查询 + 恶意安全提示" 的攻击文本对 LLM 进行对抗训练。让模型学习区分 "真实食材风险"。

  4. 用户拒答反馈优化:建立 "错误拒答反馈通道",当用户查询牛肉面制作却收到拒答时,可提交反馈说明情况。系统收集反馈后,分析拒答背后的安全提示是否合理,若判定为 "恶意提示导致误拒",则将该提示特征加入 "恶意词库",同时调整 LLM 对同类提示的判断逻辑,逐步减少因攻击导致的错误拒答,形成防御优化闭环。

三、Oxo AI Security 星球

相关推荐
IT_陈寒37 分钟前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
新新技术迷1 小时前
Node给AI接口做SSE代理与鉴权
人工智能
redreamSo2 小时前
大模型是不是到顶了?瓶颈到底在哪
人工智能·openai
Oo9202 小时前
Tool Use 背后的技术逻辑
人工智能
姗姗来迟了2 小时前
Vue3封装AI流式对话组件踩坑实录
人工智能
码上天下2 小时前
用Pinia管理AI多会话状态
人工智能
用户054324329703 小时前
Next.js接大模型流式SSE实操踩坑
人工智能
Assby3 小时前
从 Function Calling 到 MCP:理解 Agent 工具调用的底层通信机制
人工智能·后端
小星AI4 小时前
Claude Code 从入门到精通,一步到位
人工智能
后端小肥肠4 小时前
Codex + Obsidian 做人生副本视频:输入主题文案,直通剪映草稿
人工智能·aigc·agent