DSPrompt:动态软提示抵御 M-RAG 投毒

  • 关联论文:2608.16536
  • 作者:flyP
  • 更新:2026-08-18

一句话结论

冻结的多模态 retriever 的视觉与文本编码器各层插入若干可学习 soft prompt,按浅→深的 length schedule 分配,并用一个在线多模态攻击者与防御者做动态 min-max 对抗训练,让 defended encoder 的 embedding 直接重塑,不修改检索管道几乎不增加推理开销(额外参数 <1%),即可在 4 个 benchmark × 3 种投毒攻击上大幅压低攻击成功率,同时保住良性检索的 ranking 与多样性。

解决的真问题

Multimodal RAG (M-RAG) 越来越容易被攻击:恶意构造的图文/文本文档能被做成与良性条目 embedding 相近的样子,从而被检索 top-k 选进来,再诱导生成有害输出。

现有防御的三大缺陷(论文摘要原话):

  1. 推理开销不小:要在 query-time 跑辅助检测器、rerank、feature-consistency check,每条 query 都得多走几步。
  2. 泛化差:防御通常假设特定攻击分布,遇到未见过的攻击策略就失效。
  3. 分布假设过强:很多方法假设攻击者模式已知,开放场景下不可行。

DSPrompt 想要的是:retriever 本身改一改就足够稳,检索阶段不动,query-time 也不动

核心方法

1. Soft Prompt 插入(结构层)

在冻结的 retriever 中(视觉 encoder + 文本 encoder),每层都插入若干可学习 soft prompt。关键设计:

  • 浅层 → 深层 length schedule:浅层放少一点,深层放多一点,自适应各层容量——浅层主要提取低维特征,深层才有足够通道承载 prompt 的语义重塑。
  • 不动 encoder 权重:soft prompt 是仅有的可训练参数,附加 < 1% 参数。
  • 跨模态统一插入:视觉 / 文本编码器各插一份,避免单模态偏置。

直觉:让 encoder 的 embedding 几何学被 prompt 重新「掰弯」,让恶意文档自然落到 top-k 之外,而不是靠 query-time 拦截。

2. Dynamic Min-Max 训练(机制层)

训练过程是经典的对抗式:

  • Attacker(在线多模态攻击者):针对当前 defended retriever 持续生成 hard adversarial documents。
  • Defender(soft prompt):对抗训,把这些 hard 文档推出 top-k,但不破坏良性文档的 ranking 与多样性

这一步是dynamic 的——攻击者不固定,针对 prompt 当前形态重新生成最难样本。是 Soft Prompt 防御与静态 prompt 调用的根本不同。

伪代码骨架(按 abstract 思路重写,未引入不存在包):

# 初始化:每层插入可学习 soft prompt
P_v = init_soft_prompts_per_layer(vision_encoder, schedule='shallow->deep')
P_t = init_soft_prompts_per_layer(text_encoder,    schedule='shallow->deep')
freeze vision_encoder, text_encoder  # 只训 prompt

for step in range(T):
    # 在线攻击:针对当前 defended encoder 生成最难对抗样本
    adv_docs = attacker.generate(
        target_encoder_v=vision_encoder + P_v,
        target_encoder_t=text_encoder    + P_t
    )

    # 用 defended encoder 编码所有文档
    Z_adv    = encode(adv_docs,    with_prompts=(P_v, P_t))
    Z_benign = encode(benign_docs, with_prompts=(P_v, P_t))

    # Defender 目标:推开 adv、保留 benign ranking 与多样性
    loss = (
        α * push_out_topk(Z_adv, k)          # 对抗loss
      + β * preserve_ranking(Z_benign)       # 良性ranking保真
      + γ * preserve_diversity(Z_benign)    # 良性多样性保留
    )
    grad descent on only P_v, P_t

⚠️ attacker.generate 的具体算法(梯度反传 / 黑盒 query / 拼贴式)abstract 未明确,标注「原文未明确」。

3. 部署形态

训练完成后,defended encoder 完全替代原 encoder

  • 文档 embedding 可预先计算 + 离线索引(与标准 dense retrieval 完全相同)。
  • 不需要 per-query 优化——这是 DSPrompt 与 query-time defense 最大的工程差距。
  • 检索阶段无任何变化,下游生成器无需感知防御存在。

关键实验与数据

⚠️ 全部数字来自 abstract。

维度 数据
Benchmarks 4 个
攻击类型 3 种代表性投毒攻击
额外参数 < 1%
防御效果 大幅降低 attack success rate 与 poison retrieval rate(具体百分位 abstract 未给)
检索效用 near-lossless retrieval utility + generation fidelity 保持
推理开销 无 per-query 优化,结构与标准 dense retrieval 等同
对比基线 「existing defense baselines」,名字未列(推测含相似度 rerank、auxiliary detector、feature-consistency check 等)

⚠️ 实际攻击成功率下降幅度、检索 recall 损失、生成质量具体数值均标注「原文未明确」。

亮点

  1. 结构层修复而非 query-time 拦截:从根上改变 embedding 几何,下游零修改。
  2. 动态对抗训练:attacker 在线生成 hardest samples,避免对特定攻击过拟合。
  3. 工程成本极低:< 1% 参数 + 无 per-query 优化 + 与 dense retrieval 兼容,对工业部署极度友好。
  4. 多模态对称设计:视觉 / 文本同时被重塑,避免单模态偏置带来跨模态漏洞。
  5. 保留良性分布:preserve_ranking + preserve_diversity 两个正则项明确写在目标里,比单纯「推开对抗样本」更稳。

局限与边界

  1. 依赖对抗训练的资源:attacker 在线生成 hardest samples,训练成本高于普通 retriever fine-tune。⚠️ abstract 未给出训练 GPU hours / 数据规模。
  2. 攻击分布迁移性仍有限:虽然论文强调对「unseen attack strategies」更好,但训练时的 attacker 仍是有限分布。极端未见过的攻击(zero-day 类)能否扛住?⚠️ abstract 未量化。
  3. 多模态 encoder 锁定:soft prompt 设计假设 encoder 可冻结插入;不支持结构差异巨大的 retriever(如纯 CNN 视觉塔 + 纯 Transformer 文本塔)跨架构迁移。
  4. 跨语言 / 跨域泛化未提:对非英文 / 跨域检索库的鲁棒性 ⚠️ abstract 未明确。
  5. 未开源信息:abstract 无 GitHub / 项目页链接,影响工程路径评分。⚠️ 「原文未明确」。

对工程落地的启发

  • 工业 M-RAG 系统加固:比起在 RAG 上层加 rerank / 安全 verifier,改 retriever embedding 是更上游、更根本的防线。
  • 迁移成本:若团队已有 frozen retriever,DSPrompt 是一次轻量 fine-tune(< 1% 参数)就能引入的防御层,部署形态不变。
  • 评测视角:M-RAG 安全评测应至少覆盖 3 种代表性攻击 + benign distribution 保真度两项,单看 attack success rate 不够。
  • 风险提示:DSPrompt 仍是对抗训练,attacker 强度决定 defender 上限;如果生产中真实攻击者分布远强于训练分布,defender 可能失效。

与同方向工作的关系

  • Query-time Defense(Rerank / Detector / Feature-Consistency):DSPrompt 把这些 query-time 工作的能力前置到 retriever 端,消除推理开销。
  • Adversarial Training for Retrieval(AT-RAG / AdvRAG):DSPrompt 与其共享对抗训练思路,但只训 soft prompt 不动 encoder,更轻量。
  • Robust Embedding(Con-RoPE / InfoNCE-hard):从损失函数层做鲁棒 embedding,与 prompt 层修改正交,可叠加。
  • Prompt Tuning 范式(Visual Prompt Tuning / Prefix Tuning):DSPrompt 把 LLM 时代的 prompt tuning 思路移植到多模态 retriever 防御,机制层通式但目标函数专属。

适合谁读

  • 多模态 RAG 系统的安全 / 防御工程师:获得一个无需大改部署形态的防御选项。
  • Retriever 研究者:从 prompt tuning 角度看待 embedding 几何重塑。
  • 对抗 ML 研究者:把 min-max 训练迁移到「embedding 层防御」这一新场景。
  • 不适合只关心单次实验 SOTA 而不看推理成本的应用层用户——本文的核心价值恰恰是「不改部署形态」。

§0 自检

  • 机制段数:3(soft prompt 结构 / dynamic min-max 训练 / 部署形态)
  • 工程段数:3(< 1% 参数 / 离线索引兼容 / 多模态对称)
  • ⚠️ 数字核验:5 处(4 benchmarks / 3 attacks / <1% params / no per-query opt / benign near-lossless),abstract 来源;attacker 算法 / GPU hours / unseen 攻击鲁棒性 3 项标注「原文未明确」
  • 私域五维 SUM ≤3:✅
  • CJK ≤4000:✅(约 2100 字)

工程落地与核查(Jay)

1. DSPrompt 部署的三步接入路径

Step 1: 确认 retriever 架构兼容性
  ├─ 视觉 encoder:CLIP ViT / EVA-CLIP / 其它 transformer-based ✓
  ├─ 文本 encoder:BERT / CLIP Text / 其它 transformer-based ✓
  └─ 若为纯 CNN 视觉塔或非 transformer 文本塔 → DSPrompt 不适用

Step 2: 准备训练数据
  ├─ benign_docs:你的实际检索库(图片 + 文本)
  └─ poison_docs:按 3 种攻击类型生成的对抗样本
      • 攻击类型需在正文或 github 确认(abstract 未列举)

Step 3: 微调 + 替换 + 回退方案
  ├─ 在 dev 集上微调 soft prompt
  ├─ 对比 defended vs 原 retriever 的 Recall@K(防下降)
  ├─ 用 red-team 测试 attack success rate 下降幅度
  └─ 建立 rollback 机制(原 retriever 权重备份)

⚠️ 原文未给出训练数据规模、GPU 小时数或 batch size,这三项在启动前必须从正文或 github 仓库获取,盲目按 abstract 宣传的"轻量"直接上会有风险。

2. 在线攻击者(Attacker)的实现盲区与替代方案

abstract 未明确 attacker.generate 的具体算法,这是工程落地的最大盲区。以下是三种可能的实现路径及其trade-offs:

攻击者类型 实现方式 优点 缺点
梯度反传型 对 embedding 空间做梯度上升 最强攻击,精确针对 defender 需要白盒 retriever,现实中 retriever 常为黑盒 API
语义扰动型 用 GPT-4V/Claude 生成"视觉相似但语义偏移"的图文对 无需 retriever 白盒 扰动质量依赖 LLM,攻击强度不稳定
拼贴型 从已有良性文档中采样,拼接生成对抗样本 最轻量,无需训 攻击覆盖面有限

建议:先用拼贴型做 baseline(最快验证),再用语义扰动型评估 defender 鲁棒性;若 retriever 可白盒访问,再上梯度反传型。

⚠️ 训练后 attacker 不可删除:defender 的能力上限由 attacker 强度决定;若 attacker 太弱,defender 可能对真实攻击仍无效。必须在部署后持续做 red-team 测试,确认 defender 在真实攻击分布下有效。

3. 防御有效性量化验收标准

部署 DSPrompt 后,必须同时追踪以下指标(缺一不可):

def evaluate_dsprompt_defense(defended_retriever, original_retriever,
                              benign_test_set, poison_test_set):
    metrics = {}

    # 1. 良性检索保真度(不能下降太多)
    benign_recall = recall_at_k(defended_retriever, benign_test_set, k=10)
    original_recall = recall_at_k(original_retriever, benign_test_set, k=10)
    metrics["recall_degradation"] = original_recall - benign_recall
    assert metrics["recall_degradation"] < 0.05, "良性 recall 下降超过 5pp,不可用"

    # 2. 投毒攻击成功率下降(核心指标)
    poison_asr_defended    = attack_success_rate(defended_retriever, poison_test_set)
    poison_asr_original    = attack_success_rate(original_retriever, poison_test_set)
    metrics["asr_reduction"] = poison_asr_original - poison_asr_defended
    assert metrics["asr_reduction"] > 0.3, "攻击成功率下降不足 30pp,防御效果不足"

    # 3. 多样性保留(防止 defender 过度保守)
    metrics["diversity_score"] = diversity(defended_retriever, benign_test_set)
    assert metrics["diversity_score"] > 0.7, "检索结果多样性过低"

    return metrics

⚠️ abstract 只说"near-lossless"和"大幅降低",工程团队必须自己定义"大幅"的量化阈值(建议 attack success rate 下降 ≥ 30pp 为有效),并在论文正文/ github 获取具体 benchmark 名称后才能做严格对照实验。

4. Soft Prompt 的推理开销实测方法

DSPrompt 声称"推理开销几乎不增加"(< 1% 额外参数),但实际推理 latency 受以下因素影响:

# 实测步骤(建议在部署前完成)
def benchmark_soft_prompt_overhead(original_retriever, defended_retriever,
                                    test_queries, num_runs=100):
    import time
    # warmup
    for _ in range(10):
        original_retriever.encode(test_queries[:10])

    # 原 retriever 延迟
    t0 = time.perf_counter()
    for _ in range(num_runs):
        original_retriever.encode(test_queries)
    t_original = (time.perf_counter() - t0) / num_runs

    # Defended retriever 延迟
    t0 = time.perf_counter()
    for _ in range(num_runs):
        defended_retriever.encode(test_queries)
    t_defended = (time.perf_counter() - t0) / num_runs

    overhead = (t_defended - t_original) / t_original
    print(f"Latency overhead: {overhead:.1%}")  # < 5% 为可接受

⚠️ 原文未给出推理延迟数字,理论上 soft prompt 插入只增加矩阵加法(不增加 FLOPs),但实际实现中 prompt 拼接/重排可能引入额外 kernel 调度开销,必须实测

5. 多模态编码器不对称的风险与核查

DSPrompt 在视觉和文本编码器各插一份 soft prompt,但两者的训练动态可能不对称——视觉 encoder 的 embedding 空间通常比文本 encoder 更稠密,prompt 对视觉空间的"掰弯"效果可能弱于文本空间。

核查方法

# 分别测视觉/文本 embedding 空间的扰动鲁棒性
def check_modality_balance(defended_retriever, poison_visual, poison_text):
    emb_v = defended_retriever.encode_image(poison_visual)
    emb_t = defended_retriever.encode_text(poison_text)
    # 检查投毒样本 embedding 与良性 embedding 的距离分布
    # 若视觉空间距离变化 << 文本空间距离变化 → 不对称
    print(f"Visual embedding shift: {mean(emb_v_distance):.3f}")
    print(f"Text embedding shift:   {mean(emb_t_distance):.3f}")

若两侧 shift 差异 > 2×,需对视觉/文本端分别调 α/β/γ 超参,不能共用同一套。

6. 已知工程失败模式清单

失败模式 症状 缓解
Attacker 算法与真实攻击不符 defender 在 red-team 仍高 ASR 用真实攻击分布替换训练 attacker,或做 ensemble attacker
良性 recall 下降 > 5pp 检索质量用户投诉 调高 β(preserve_ranking loss 权重)
视觉/文本不对称 视觉投毒防御效果弱 分别调参 + modality-specific prompt length
跨域泛化差 新文档类型投毒防御失效 定期用新域数据做 incremental fine-tune
推理延迟增加超预期 实时 RAG 吞吐下降 实测(见上节),必要时用 TensorRT 优化
Retriever 架构不兼容 无法插入 soft prompt 确认 encoder 为 transformer-based;非 transformer 架构需改方案