TAP 论文复现 让大模型自己“教坏“自己:TAP 越狱攻击复现与原理详解
论文阅读 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)
- 复现代码(GitHub):https://github.com/Whiffe/TAP/tree/main
- 项目主页:https://whiffe.github.io/TAP/
- 🎬 在线动画演示:https://whiffe.github.io/TAP/tap_animation.html
大语言模型(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 个进下一轮 │ 控制树的宽度
└─────────────────────────────────────────────┘
↑ 重复,直到成功或迭代到上限
- ① 分支(Branch):攻击者基于历史对话,对当前每个提示生成
b=4个新变体(不同伪装策略)。树一下子长宽。 - ② 剪枝·剔偏题(Prune-1):评估器先看哪些变体"根本没在问原来那件事",直接砍掉——省得白白去查询目标。
- ③ 攻击+打分(Attack & Assess):活下来的提示逐个发给目标,拿到回答后由评估器打分。只要有一条被判越狱成功,整个搜索立即结束并返回这条提示。
- ④ 剪枝·留高分(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 的success、final_score、最关键的final_prompt(TAP 最终找到的那条对抗提示词)、final_response(目标的回答)、思考模式下还有final_thinking。
final_prompt 就是 TAP 自动"进化"出来的越狱话术,很值得拿来分析模型到底是被哪种套路攻破的。
八、小结
TAP 把越狱这件事,变成了一个自动化的树搜索问题:
- 攻击者负责"生成多样的套路"(分支),
- 评估器负责"判断谁有戏、谁跑偏"(剪枝 + 打分),
- 在树上一边生长、一边砍枝,高效逼近越狱。
它揭示了一个值得警惕的事实:只靠黑盒访问、全自动、不需要任何人工话术,就能高成功率地绕过当前主流大模型的安全对齐。这对防御方(安全对齐、护栏模型)也是很有价值的红队工具。
完整代码、文档和动画都在这里,欢迎复现和交流:
- 💻 GitHub:https://github.com/Whiffe/TAP/tree/main
- 🏠 项目主页:https://whiffe.github.io/TAP/
- 🎬 动画演示:https://whiffe.github.io/TAP/tap_animation.html
⚠️ 本项目仅用于安全研究与红队评测,请勿用于任何非法用途。
更多推荐



所有评论(0)