如何通过构建动态Few-Shot提示词来增强模型对注入攻击的鲁棒性

一杯咖啡日记 初级 2026/5/11 82 浏览 10 点赞 约 2 分钟

直接把静态的 Few-Shot 例子塞进 Prompt 里,在面对精心设计的 Prompt Injection(提示词注入)时几乎没用,因为攻击者可以通过“忽略之前所有指令”这种指令覆盖,轻松让模型陷入陷阱。

如何通过构建动态Few-Shot提示词来增强模型对注入攻击的鲁棒性

我最近在实测 DeepSeek-V3 和 Claude 3.5 Sonnet 时发现,一个有效的防御方案是构建动态 Few-Shot 检索机制。简单来说,不要在 System Prompt 里写死几个例子,而是建立一个包含“正常输入-标准输出”以及“恶意注入-拦截响应”的样本库。当用户输入进来时,先通过向量检索(RAG)拉取最相关的 3-5 个正反例,动态拼接到提示词中。

实测表现对比:

Claude 3.5 Sonnet:
它的指令遵循能力极强,但对“角色扮演”类的注入比较敏感。如果用静态 Few-Shot,它很容易被诱导跳出预设角色。但切换到动态 Few-Shot 后,如果检索到了类似的注入攻击样本,它能迅速识别出当前输入在试图“越权”,鲁棒性提升明显。

DeepSeek-V3:
逻辑推理能力很顶,但在处理复杂注入时偶尔会产生幻觉。动态 Few-Shot 对它来说更像是一种“实时校准”,通过给它看几个真实的拦截案例,它在判定“这是否是一个攻击行为”时,准确率比纯 Zero-Shot 高出约 20%。

具体的实现逻辑参考:

# 伪代码:动态构建防御性Prompt
def get_robust_prompt(user_input):
    # 从向量数据库检索最相似的正常样本和攻击样本
    normal_examples = vector_db.search(user_input, type="normal", top_k=2)
    attack_examples = vector_db.search(user_input, type="injection", top_k=2)
    
    # 动态组装
    prompt = f"你是一个鲁棒的助手。以下是处理类似请求的参考:\n"
    for ex in normal_examples + attack_examples:
        prompt += f"用户: {ex.input}\n助手: {ex.output}\n---\n"
    
    prompt += f"当前用户输入: {user_input}\n助手:"
    return prompt

优缺点分析:

动态 Few-Shot 方案:
优点: 极大地增加了攻击者的预测成本,因为模型每次看到的上下文都在变;能够通过增加样本库快速迭代防御策略,不需要重新微调模型。
缺点: 增加了首字延迟(TTFT),因为多了一步向量检索;且如果检索回来的样本本身被污染,可能会产生负面引导。

对比结论:
如果你的场景是对安全性要求极高的企业级 Agent,别指望一段完美的 System Prompt 就能挡住所有注入。动态 Few-Shot 配合一个轻量级的分类模型(先判定是否为攻击 → 检索反例 → 喂给大模型)是目前成本最低且最有效的工程化手段。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式