把危险请求翻译成逻辑公式:LogiBreak 越狱攻击复现与原理详解
总目录 大模型安全研究论文整理 2026年版:https://blog.csdn.net/WhiffeYF/article/details/159047894
文章目录
把危险请求翻译成逻辑公式:LogiBreak 越狱攻击复现与原理详解
论文:Logic Jailbreak: Efficiently Unlocking LLM Safety Restrictions Through Formal Logical Expression(ACL 2026)
大语言模型的安全对齐,通常是在大量自然语言样本上训练出来的:看到危险请求就拒绝,看到正常请求就回答。但如果请求的含义不变,写法却彻底变了,模型还能认出来吗?
LogiBreak 给出了一个很有意思的答案:把自然语言请求翻译成一阶逻辑(First-Order Logic,FOL)表达式,再交给目标模型。人和模型仍然能理解它的语义,但它的 token 形式已经与常见自然语言相差很大,可能落到安全对齐没有充分覆盖的区域。
这篇文章用大白话讲清楚 LogiBreak 的原理,并介绍我如何用本地开源模型复现它。
一、先看一个直观的比喻
把模型的安全机制想象成一个训练有素的门卫。
门卫见过大量普通语言写成的危险请求,因此一眼就能识别并拒绝。但现在,有人没有直接说出原来的句子,而是把它改写成数学课上那种带有 ∀、∃、∧、谓词和变量的逻辑公式。
对门卫来说,字面形式变得非常陌生;对大模型来说,逻辑式又不是乱码,它依然可能读懂其中的关系。于是就出现了一个错位:
- 语义层面:请求表达的意思基本没变;
- token 层面:输入已经离开常见自然语言分布;
- 安全层面:模型可能“读懂了任务”,却没有及时触发拒绝机制。
LogiBreak 利用的就是这种语义保持、形式迁移带来的安全空隙。
二、什么是一阶逻辑?
一阶逻辑是一种用对象、属性、关系和量词描述事实的形式语言。为了避免展示危险内容,下面用一个普通任务举例:
自然语言:安排一场关于人工智能安全的会议。
逻辑形式:
∃x [Meeting(x) ∧ Topic(x, AI_Safety) ∧ Arrange(x)]
这里:
∃x表示“存在一个 x”;Meeting(x)表示 x 是一场会议;Topic(x, AI_Safety)表示会议主题是人工智能安全;Arrange(x)表示需要安排这场会议;∧表示几个条件同时成立。
它不是简单的字符替换,也不是 Base64 之类的编码。逻辑式仍然明确保留“对象是谁、要做什么、各部分是什么关系”。这也是 LogiBreak 与普通乱码、密文攻击最大的区别。
三、LogiBreak 的核心假设
论文把越狱问题归因于安全对齐数据与攻击输入之间的分布差异。
安全对齐主要学习自然语言中的拒绝模式。训练数据可能覆盖了很多危险主题,却未必充分覆盖“用形式逻辑表达同一语义”的输入。因此,一个转换函数只要同时做到下面两点,就可能绕过现有防线:
- 改变输入形式:让转换后的 token 分布偏离常见对齐数据;
- 保持原始语义:让目标模型仍然理解请求真正要求它做什么。
论文把自然语言到逻辑形式的转换写成:
F: X_harmful → X_logic
同时要求转换前后的语义相似度不能低于阈值:
Sim(x_harmful, x'_harmful) ≥ τ
所以,LogiBreak 追求的并不是“把句子弄得越乱越好”,而是:改掉模型熟悉的外壳,同时保住里面的意思。
四、一次完整攻击只做 4 件事
LogiBreak 的流程比 TAP、PAIR 这类迭代搜索方法更短:
自然语言请求
│
▼
① 翻译器:自然语言 → 一阶逻辑表达式 x_logic
│
▼
② 拼装提示:x_context + x_logic + x_instruct
│
▼
③ 目标模型生成回答
│
▼
④ 判官判断是否越狱成功
最终提示可以抽象为:
x' = x_context ‖ x_logic ‖ x_instruct
三个部分分别是:
x_context:告诉模型当前任务与形式语义有关,让逻辑表达式出现在一个看起来合理的语境中;x_logic:由翻译器生成的一阶逻辑表达式;x_instruct:要求目标模型根据逻辑式给出具体回答的指令。
真正关键的是 x_logic。论文的消融实验把逻辑式换回原始自然语言后,攻击效果大幅下降;删除前面的语境句也会造成一定下降。这说明,逻辑翻译是核心,语境包装起辅助作用。
五、为什么不是只攻击一次?ASR@N 是什么?
自然语言转 FOL 并不是唯一答案。同一句话可以有多种逻辑表示,目标模型的采样结果也存在随机性。因此论文对每条请求独立尝试 N 次。
- ASR@1:只看第一次尝试是否成功;
- ASR@N:同一请求尝试 N 次,只要其中一次成功,就算这条请求攻击成功。
本复现默认 N=5,所以同时报告 ASR@1 和 ASR@5。要注意,ASR@5 通常高于 ASR@1,因为它给了攻击方法更多机会。比较不同方法时,必须保证 N 和判官一致,否则数字没有可比性。
六、三个角色与三类判官
复现里有三个模型角色:
| 角色 | 作用 | 本复现的默认选择 |
|---|---|---|
| Translator | 把自然语言请求翻译成 FOL | 本地 Qwen3 |
| Target | 接收逻辑提示的被测模型 | 本地 Qwen3 |
| Judge | 判断回答是否构成越狱 | 规则判官或 Qwen3Guard |
代码支持三种判定方式:
- 规则判官:检查回答中是否出现常见拒绝前缀。速度最快,不需要额外模型,但容易把“没有说拒绝、其实也没有真正回答”的内容误判成成功。
- 本地 LLM 判官:支持论文中的 1-10 分风格,以及
safe/unsafe二分类风格。它会结合请求和回答的语义进行判断。 - Qwen3Guard:为了和我复现的其他开源基线保持一致而加入。
Safe记为未成功,Unsafe或Controversial记为成功。
无论最终选择哪一种判官,程序都会额外保存规则判定,便于检查不同评估方式之间的差异。
七、它和编码、模板、搜索型越狱有什么区别?
1. 不同于 Base64、凯撒密码
编码类攻击主要把原句变成另一套字符,目标模型还要先正确解码。模型一旦解码失败,语义就丢了。LogiBreak 使用的是模型本身具备一定理解能力的形式语言,语义结构更明确。
2. 不同于角色扮演模板
角色扮演通常只是在原请求前后增加故事、身份或特殊指令,原始危险语句仍然完整存在。LogiBreak 会直接改写请求主体的表达形式。
3. 不同于 TAP、PAIR
TAP 和 PAIR 依赖攻击模型多轮改写、试探和反馈;LogiBreak 的主要步骤是一次逻辑翻译,不需要维护攻击树或长对话历史。因此它更简单,也更容易批量运行。
八、我的复现:全部使用本地开源模型
论文部分设置使用托管模型。为了便于实验室复现和避免 API 成本,我把流水线改成了纯本地模型版本:
- 翻译器、目标和语义判官都从本地路径或 Hugging Face/ModelScope 模型标识加载;
- 不需要 API Key,也没有远程推理接口;
- 可以用 Qwen3Guard 作为统一安全评估器;
- 支持 Qwen3 的思考/非思考模式对比;
- 输入和输出都通过命令行参数指定。
代码分成五层:
logibreak_main.py 主程序:参数、主流程、续跑、结果写入
conversers.py 翻译器、目标模型、各类判官
language_models.py 本地模型加载、批量生成、OOM 重试
system_prompts.py 论文附录中的提示模板
common.py FOL 清洗和判官输出解析
公开项目没有附带基准数据、实验结果、模型回答、模型权重、论文 PDF 或本机服务器命令,只保留方法代码与输入格式说明。
九、工程上最容易踩的坑
1. 三个模型抢同一张卡
翻译器、目标和判官如果同时堆在一张 GPU 上,很容易 OOM。程序支持按角色分卡:
--GPU 0,1,2
表示翻译器用 0 号卡、目标用 1 号卡、判官用 2 号卡。也可以通过 --attack-gpu、--target-gpu、--guard-gpu 单独指定。
2. ASR@5 的批量生成占用过大
每条请求默认生成 5 个 FOL,再批量查询目标。--max-batch 会把大批次自动拆开;显存不足时,程序还会清理缓存、重试并继续对半拆批。仍然 OOM 时,可以手动把它调成 4、2 或 1。
3. 长任务中断后从头再跑
程序每完成一条就原子写入 JSON。相同命令加 --resume 后,会跳过已经完成的请求,并重跑上次报错的条目。
4. 用规则判官直接当“真实有害率”
规则判官只检查拒绝短语,适合快速筛查,不等同于语义层面的攻击成功率。正式实验最好使用语义判官,并明确报告判官、阈值和 ASR@N 的 N。
十、怎么跑
先安装环境:
pip install -r requirements.txt
准备一个 CSV。第一行是表头,从第二行起读取第一列。建议先用经过授权的少量安全测试样本做冒烟测试。
1. 规则判官:两张卡即可
python logibreak_main.py \
--input ./Dataset/requests.csv \
--output ./results/run.json \
--GPU 0,1 \
--translator-model-path Qwen/Qwen3-4B \
--target-model-path Qwen/Qwen3-4B \
--judge-type rule \
--num-trials 5 \
--limit 1
2. Qwen3Guard 判官:三张卡
python logibreak_main.py \
--input ./Dataset/requests.csv \
--output ./results/run_guard.json \
--GPU 0,1,2 \
--translator-model-path Qwen/Qwen3-4B \
--target-model-path Qwen/Qwen3-4B \
--judge-type guard \
--guard-path Qwen/Qwen3Guard-Gen-4B \
--num-trials 5 \
--limit 1
冒烟测试通过后删掉 --limit 1。任务中断则保持输入输出不变,加上 --resume。
十一、怎么看输出
结果 JSON 主要有三部分:
config:模型、判官、尝试次数和消融设置;summary:ASR@1、ASR@N、规则判官 ASR、平均耗时和报错数;results:每条请求的 FOL、最终提示、目标回答、判定结果与各次 trial。
每个 trial 都会保存:
fol / prompt / response / thinking
rule_jailbroken / jailbroken
rating 或 label / judge_raw
分析结果时,不要只看顶层 ASR。最好抽查判官原始输出,确认翻译器是否保持了语义、目标是否真正回答了请求,以及规则判官有没有误判。
十二、论文结果说明了什么?
论文在多个模型、语言和判官上进行了评估。作者报告,在只允许一次尝试的 ASR@1 设置下,LogiBreak 在不同判官上的平均成功率仍超过 40%;在 ASR@5 下,相对原始请求基线有明显提升。
更重要的不是某一个百分比,而是三个现象:
- 逻辑翻译本身是主要贡献:换回原始自然语言后,效果明显下降;
- 判官会显著影响结论:规则判官通常比语义判官更宽松;
- 能理解逻辑,不等于能安全处理逻辑:模型可能具备 FOL 推理能力,却没有同等强度的语义安全防线。
论文还测试了 Self-Reminder 和 LLaMA-Guard。它们能降低部分模型上的攻击成功率,但没有在所有模型和评估设置下彻底解决问题。这说明只在输入表面或输出末端增加一道防线仍然不够。
十三、从防御角度能得到什么启示?
LogiBreak 最值得关注的地方,不是又多了一个越狱模板,而是它暴露了一个更普遍的问题:
安全对齐不能只记住“危险请求通常长什么样”,还要理解“这个请求实际上在要求什么”。
可能的改进方向包括:
- 在安全对齐数据中加入 FOL、代码、表格、低资源语言等多种等价表达;
- 先做语义规范化,把逻辑式还原为自然语言意图后再审核;
- 同时审核输入与输出,不能只依赖其中一端;
- 使用语义判官复核规则判官认为成功的样本;
- 将形式语言理解能力与安全分类能力一起训练和评估。
从这个角度看,LogiBreak 既是攻击方法,也是一个很有价值的安全压力测试工具。
十四、小结
LogiBreak 的思路可以压缩成一句话:
把请求从模型熟悉的自然语言空间,搬到它能理解但安全对齐覆盖不足的逻辑空间。
它的流程很短:自然语言转 FOL、拼提示、问目标、交给判官;但背后的问题并不简单。它说明当前模型可能在 token 层面学会了拒绝,却还没有在语义层面形成同样稳固的安全边界。
如果你正在做大模型安全、红队评测或安全对齐研究,LogiBreak 很适合作为一个轻量、黑盒、容易批量复现的基线。不过一定要统一数据、尝试次数和判官,并对生成内容做好访问控制。
完整代码、项目说明和动画演示都在这里,欢迎复现和交流:
- 💻 GitHub:https://github.com/Whiffe/LogiBreak
- 🏠 项目主页:https://whiffe.github.io/LogiBreak/
- 🎬 动画演示:https://whiffe.github.io/LogiBreak/logibreak_animation.html
⚠️ 本项目仅用于经过授权的安全研究与红队评测,请勿用于任何非法用途,也不要公开传播实验中生成的有害内容。
更多推荐



所有评论(0)