总目录 大模型安全研究论文整理 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 的核心假设

论文把越狱问题归因于安全对齐数据与攻击输入之间的分布差异

安全对齐主要学习自然语言中的拒绝模式。训练数据可能覆盖了很多危险主题,却未必充分覆盖“用形式逻辑表达同一语义”的输入。因此,一个转换函数只要同时做到下面两点,就可能绕过现有防线:

  1. 改变输入形式:让转换后的 token 分布偏离常见对齐数据;
  2. 保持原始语义:让目标模型仍然理解请求真正要求它做什么。

论文把自然语言到逻辑形式的转换写成:

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

代码支持三种判定方式:

  1. 规则判官:检查回答中是否出现常见拒绝前缀。速度最快,不需要额外模型,但容易把“没有说拒绝、其实也没有真正回答”的内容误判成成功。
  2. 本地 LLM 判官:支持论文中的 1-10 分风格,以及 safe/unsafe 二分类风格。它会结合请求和回答的语义进行判断。
  3. Qwen3Guard:为了和我复现的其他开源基线保持一致而加入。Safe 记为未成功,UnsafeControversial 记为成功。

无论最终选择哪一种判官,程序都会额外保存规则判定,便于检查不同评估方式之间的差异。


七、它和编码、模板、搜索型越狱有什么区别?

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 下,相对原始请求基线有明显提升。

更重要的不是某一个百分比,而是三个现象:

  1. 逻辑翻译本身是主要贡献:换回原始自然语言后,效果明显下降;
  2. 判官会显著影响结论:规则判官通常比语义判官更宽松;
  3. 能理解逻辑,不等于能安全处理逻辑:模型可能具备 FOL 推理能力,却没有同等强度的语义安全防线。

论文还测试了 Self-Reminder 和 LLaMA-Guard。它们能降低部分模型上的攻击成功率,但没有在所有模型和评估设置下彻底解决问题。这说明只在输入表面或输出末端增加一道防线仍然不够。


十三、从防御角度能得到什么启示?

LogiBreak 最值得关注的地方,不是又多了一个越狱模板,而是它暴露了一个更普遍的问题:

安全对齐不能只记住“危险请求通常长什么样”,还要理解“这个请求实际上在要求什么”。

可能的改进方向包括:

  • 在安全对齐数据中加入 FOL、代码、表格、低资源语言等多种等价表达;
  • 先做语义规范化,把逻辑式还原为自然语言意图后再审核;
  • 同时审核输入与输出,不能只依赖其中一端;
  • 使用语义判官复核规则判官认为成功的样本;
  • 将形式语言理解能力与安全分类能力一起训练和评估。

从这个角度看,LogiBreak 既是攻击方法,也是一个很有价值的安全压力测试工具


十四、小结

LogiBreak 的思路可以压缩成一句话:

把请求从模型熟悉的自然语言空间,搬到它能理解但安全对齐覆盖不足的逻辑空间。

它的流程很短:自然语言转 FOL、拼提示、问目标、交给判官;但背后的问题并不简单。它说明当前模型可能在 token 层面学会了拒绝,却还没有在语义层面形成同样稳固的安全边界。

如果你正在做大模型安全、红队评测或安全对齐研究,LogiBreak 很适合作为一个轻量、黑盒、容易批量复现的基线。不过一定要统一数据、尝试次数和判官,并对生成内容做好访问控制。

完整代码、项目说明和动画演示都在这里,欢迎复现和交流:

⚠️ 本项目仅用于经过授权的安全研究与红队评测,请勿用于任何非法用途,也不要公开传播实验中生成的有害内容。

更多推荐