论文阅读 NeurIPS 2024 Tree of attacks: Jailbreaking black-box llms automatically

总目录 大模型安全研究论文整理 2026年版:https://blog.csdn.net/WhiffeYF/article/details/159047894

让大模型自己"教坏"自己:TAP 越狱攻击复现与原理详解

论文:Tree of Attacks: Jailbreaking Black-Box LLMs Automatically(NeurIPS 2024)

大语言模型(LLM)经过安全对齐后,本应拒绝"如何制造危险品"“怎么写诈骗邮件"这类请求。但只要把问题"换个说法”——套上角色扮演、编个故事、换几个敏感词——模型常常就被绕过去了。这种绕过安全限制、诱导模型输出有害内容的行为,就叫越狱(Jailbreak)

本文要讲的 TAP(Tree of Attacks with Pruning,带剪枝的攻击树),是 NeurIPS 2024 上一个非常优雅的自动越狱方法:它不需要人工设计话术,全程让 AI 自动去试探另一个 AI,而且只需要黑盒访问(只要能调用模型、不需要知道它的参数)。下面我用大白话把原理讲清楚,再说说我是怎么复现的。


一、先看一个直观的比喻

想象你要从一个尽职的门卫(目标模型)嘴里套出机密。你不亲自上,而是雇了一群说客(攻击者模型)轮番去试,旁边还坐着一个裁判(评估器)盯着谁最有戏。

  • 说客们各显神通:有的扮成作家说"我在写小说",有的编造紧急情况,有的把敏感词换成暗号……
  • 裁判给门卫的每次回应打分(0 分=油盐不进,10 分=守不住了)。
  • 谁的套路分高,就让谁顺着这个方向继续深挖;明显跑偏的、没戏的,直接淘汰,不浪费时间。

一轮一轮下来,套路越来越刁钻,直到门卫松口——越狱成功。这就是 TAP 的核心思想:用一棵"攻击树"不断生长 + 剪枝,逼近成功

👉 配合这个 在线动画 看,分支、剪枝、打分的过程一目了然。


二、TAP 的三个角色

TAP 由三个模型分工协作:

角色 干什么 本复现用的模型
攻击者 Attacker 把原始恶意问题改写成各种伪装版本 Qwen3-8B(开源)
目标 Target 被攻击的对象,看它会不会被骗 Qwen3-8B(开源,实验对象)
评估器 Evaluator 判定目标的回答是否"越狱成功" Qwen3Guard(安全审核模型)

注意:攻击者要"听话"——你让它生成越狱提示,它不能自己先拒绝;评估器要会客观打分。论文原版用 Vicuna 作攻击者、GPT-4 作评估器,我的复现全部换成了开源模型,评估器用 Qwen3Guard。


三、一轮迭代做的 4 件事(核心算法)

TAP 维护一棵树,每个节点是一条"攻击提示"。每一轮(最多迭代 depth 轮)做下面四步:

                 ┌─────────────────────────────────────────────┐
   原始恶意目标 → │  ① 分支    攻击者把每个提示扩成 b 个变体       │ 树长出更多枝叶
                 │  ② 剪枝-1  评估器砍掉"问偏题"的变体           │
                 │  ③ 攻击+   把活下来的发给目标拿回答,         │ 一旦判越狱 → 立即返回
                 │     打分    评估器打分(1-10)                │
                 │  ④ 剪枝-2  只留分数最高的 w 个进下一轮         │ 控制树的宽度
                 └─────────────────────────────────────────────┘
                          ↑ 重复,直到成功或迭代到上限
  1. ① 分支(Branch):攻击者基于历史对话,对当前每个提示生成 b=4 个新变体(不同伪装策略)。树一下子长宽。
  2. ② 剪枝·剔偏题(Prune-1):评估器先看哪些变体"根本没在问原来那件事",直接砍掉——省得白白去查询目标。
  3. ③ 攻击+打分(Attack & Assess):活下来的提示逐个发给目标,拿到回答后由评估器打分。只要有一条被判越狱成功,整个搜索立即结束并返回这条提示。
  4. ④ 剪枝·留高分(Prune-2):如果枝叶超过 w=10 个,只保留分数最高的 10 个,其余删掉,进入下一轮继续打磨。

论文默认参数:分支因子 b=4、宽度 w=10、深度 d=10


四、为什么 TAP 比前作 PAIR 强?

TAP 是在 PAIR 方法基础上改进的。两者最大的区别在于:

  • PAIR:只有"一条链"——单线程地反复改写同一个提示,不分支、不剪枝。
  • TAP:变成"一棵树"——
    • 分支让它同时探索多种套路 → 成功率更高
    • 剪枝砍掉偏题和低分分支 → 查询次数更少、更省

论文数据很能说明问题:在 GPT-4 上,TAP 达到 90% 成功率、平均只用 28.8 次查询,而 PAIR 只有 60%、还要 37.7 次。又准又省,这就是"分支 + 剪枝"的威力。


五、我的复现:开源模型 + Qwen3Guard

论文原版依赖 GPT-4 作评估器(要花钱、要联网)。我的复现目标是完全用开源模型本地跑通,方便实验室复现和做对比实验。几个关键点:

1. 评估器换成 Qwen3Guard

Qwen3Guard 是一个安全审核模型,对一段内容输出三类标签。我的判定规则:

  • Safe → 判为安全(未越狱,记 1 分)
  • Unsafe / Controversial → 判为有害(越狱成功,记 10 分)

只要目标的回答被判 Unsafe/Controversial,就算这条攻击成功了。这其实对应论文 Appendix C.4 里的"guard 类评估器"——只判有害与否、不判偏题,所以这种模式下会跳过第②步的偏题剪枝。

2. 代码分层设计

代码结构清晰、三层解耦:

tap_main.py        主程序:TAP 树搜索 + 数据读取 + 写结果
   │
conversers.py      三个角色:AttackLM / TargetLM / GuardEvaluator
   │
language_models.py 模型后端:本地 HuggingFace 加载 + 统一生成接口

上层算法完全不关心模型怎么跑,换模型只改一个路径参数。

3. 工程上踩过的坑 & 解法

复现里最现实的问题是显存。三个模型要同时常驻、还要批量生成,一不小心就 OOM。最终方案很简单可靠:

  • 一个模型独占一张卡(按 --GPU 顺序分配),模型之间绝不互相挤。
  • 批量自动分块--max-batch):攻击者一轮可能要批量跑 40 条,自动拆成小批,峰值显存可控。
  • 8B 在思考模式下(生成 32768 token,KV 缓存很大)单卡吃紧,所以支持给目标单独分 2 张卡:--target-gpu 2,5

另外还做了两个实用功能:跑一条存一条(原子写,中断不丢已完成结果)和 --resume 断点续跑


六、怎么跑

环境装好后(pip install -r requirements.txt),一条命令就能跑:

# 非思考模式
python tap_main.py \
    --input  ./Dataset/Adv.csv \
    --output ./results/adv_nothink.json \
    --GPU 1,2,4 \
    --attack-model-path /path/to/models/Qwen/Qwen3-8B \
    --target-model-path /path/to/models/Qwen/Qwen3-8B \
    --guard-path        /path/to/models/Qwen/Qwen3Guard-Gen-8B

想跑思考模式对比实验,只加一个开关、给目标多分一张卡:

python tap_main.py \
    --input  ./Dataset/Adv.csv \
    --output ./results/adv_think.json \
    --attack-gpu 1 --target-gpu 2,5 --guard-gpu 4 \
    --target-model-path /path/to/models/Qwen/Qwen3-8B \
    --guard-path        /path/to/models/Qwen/Qwen3Guard-Gen-4B \
    --enable-thinking

数据集从 CSV 第二行起、读第一列作为恶意目标;输入输出都用参数传。中断了就加 --resume 接着跑。


七、看结果

输出是一个边跑边写的 JSON,关注两块:

  • summary(汇总指标)
    • attack_success_rate:攻击成功率 ASR(核心指标)
    • mean_queries:平均查询目标次数(效率)
    • mean_iterations / mean_time_sec:平均迭代轮数 / 耗时
  • results(逐条):每条 goal 的 successfinal_score、最关键的 final_prompt(TAP 最终找到的那条对抗提示词)、final_response(目标的回答)、思考模式下还有 final_thinking

final_prompt 就是 TAP 自动"进化"出来的越狱话术,很值得拿来分析模型到底是被哪种套路攻破的。


八、小结

TAP 把越狱这件事,变成了一个自动化的树搜索问题

  • 攻击者负责"生成多样的套路"(分支),
  • 评估器负责"判断谁有戏、谁跑偏"(剪枝 + 打分),
  • 在树上一边生长、一边砍枝,高效逼近越狱。

它揭示了一个值得警惕的事实:只靠黑盒访问、全自动、不需要任何人工话术,就能高成功率地绕过当前主流大模型的安全对齐。这对防御方(安全对齐、护栏模型)也是很有价值的红队工具。

完整代码、文档和动画都在这里,欢迎复现和交流:

⚠️ 本项目仅用于安全研究与红队评测,请勿用于任何非法用途。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐