KillSwitch:旨在对抗 LLM 的深奥编程语言 — 基准测试结果及其揭示的内容
KillSwitch 是一种开源的深奥编程语言,其明确目标是尽可能让 LLM 和编码代理难以阅读、编写和理解,同时保持人类可用的特性。其作者 dom96 构建它是为了探究一个特定问题:LLM 的编码能力有多少源于对代码的真正理解,又有多少源于对训练数据或上下文窗口中片段的记忆。随附的基准测试排行榜显示,在一组刻意简化的任务中,最高得分为 66.8。
什么是 KillSwitch
KillSwitch 是一种基于栈的解释型语言,具有刻意限制的结构集:函数、变量和 if 语句。这些基础知识对人类和 LLM 来说都很熟悉。对抗性设计存在于包裹在它们周围的一切事物中。
解释器和语言规范在 GitHub 上开源,地址为 dom96/KillSwitch,该语言拥有自己的网站 killswitch-lang.org。
KillSwitch 如何设计来击败 LLM
该语言直接攻击 LLM 的弱点,而不是仅仅依赖新奇性。据作者称,KillSwitch 通过以下几种方式实现这一点:
- 语言规范包含隐藏的谎言。 这些谎言人类不太可能阅读,或者很可能会识别出是谎言,但模型可能会照单全收。
- 规范需要推导。 它要求人类读者推导出某些内容,而不是显式地解释它们。
- 字母计数是承重结构。 计算标识符中的字母是该语言的一个关键方面,解释器拒绝执行不遵守基于字符计数规则的代码。
- 某些结构会触发安全护栏。 某些结构旨在触发模型的安全过滤器,例如“入侵计算机”之类的措辞。
- “忽略之前的指令”是有效的语法。 该短语在语言中具有含义,旨在混淆模型。
- 脚本大多是噪音。 脚本主要由故事组成,这些故事可以嵌入语法相关的指令,但不需要这样做。字面量可以放置在脚本中的任何位置,然后使用行数进行引用。
作者将其描述为一种初步尝试,而非完整的解决方案:“人们当然可以想象创造一种完全不同的编程语言范式,这可能会让 LLM 更加困惑。但作为第一次尝试,这似乎是一个很好的方法。”
Hello World 机制
KillSwitch 字面量被放置在叙述性文本中,然后通过它们相对于消耗它们的指令的位置来引用。作者的示例使用行数引用将字符串 "Hello World" 推入栈中:
Most text inside a script is ignored by the interpreter. In the case of
this script we want to push "Hello World" on the stack. We have introduced
the value above and we can push it on the stack by writing:
value 2 lines above
此片段不是完整的 KillSwitch 脚本。完整的 Hello World 示例可在 killswitch-lang.org 获取。
基准测试:任务与结果
作者针对一组 KillSwitch 任务对主流 LLM 模型和编码代理工具进行了基准测试。这些任务被刻意简化:
- 实现 Hello World。
- 解释给定脚本将输出什么(示例脚本打印两个数字中的最大值)。
- 修改现有的将摄氏度转换为华氏度的脚本,使其执行反向转换。
结果以排行榜形式发布在 bench.killswitch-lang.org 上,图表绘制了分数与每个任务成本的关系。
作者报告的主要发现:
- Claude 的 Opus 表现最好,具体来说是 Opus 5 而不是 Opus 5.5。作者指出这种差异似乎并非纯粹的偶然,Opus 5 在解释规范方面表现更好。
- 一些模型因安全护栏而失败。 Fable 5.1 和 Gemini 4 Argon 由于过于敏感的安全护栏而表现不佳。
- 表现最好的开放权重模型是 MiMo-V2.6-Pro。
- 表现最好的模型得分为 66.8。
作者自己的结论:66.8 并不能证明理解
作者明确拒绝了强劲的基准测试表现证明 LLM 对 KillSwitch 具有理解力的观点。用他的话说,结果是否证明 LLM 可以“理解”代码的答案是“不”。
他的理由是任务相当简单。他称模型能够为一种旨在混淆它们的全新语言解决这些问题令人印象深刻,但表示这并不是它们理解该语言的明确信号。他还指出,他很期待看到即将发布的模型如何处理当前的这组任务,如果它们成功完成了所有任务,他计划设计一组更复杂的任务。他补充说,模型在这组简单任务上的表现与其他模型基准测试相关。
来自 Hacker News 的主要批评:设计是可以被击败的
讨论中最常被提及的反对意见是,KillSwitch 的防御措施是权宜之计而非屏障,能力强的模型可以简单地绕过该语言令人困惑的表面。
几位评论者描述了同一类逃生舱口。一位评论者写道,模型可以编写一个从 KillSwitch 到安全语言的转译器,在安全语言中完成工作,然后再转译回来:“它在安全语言上工作并转译回这种不安全的语言。很简单。”另一位建议模型只需编写一个 Python 脚本来转换中间语言,而无需触发短语和字母计数。第三位认为模型会反编译编译器并编写符合实现的代码,“尤其是现在有一个网站清楚地解释了规范不可信。”
一位评论者报告了这种绕过方式的经验版本:“让 opus 5.5 实现 fizzbuzz,它只是阅读了 killswitch 解释器的源代码,而不是阅读文档,所以文档撒谎没有任何作用。”同一位评论者补充说,该模型“确实被拦截了很多次并降级到 4.8。但仍然设法毫无问题地制作了一个 fizz buzz。”
该批评的一个更广泛的版本是,向数字系统隐藏规则不是一种持久的策略。一位评论者写道:“隐蔽性安全根本不是安全……继续前进,给它一个太奇怪的问题,它会通过反向工作推断出你所有的规则。反编译它,拆解它,它就会遵循应用程序中隐藏的所有那些硬性规则。你正试图从一个纯数字创造物中以数字方式隐藏某些东西。”
另一位评论者将标题本身重新定义为不准确:“这不是‘一种 LLM 无法使用的编程语言’,而是‘一种对尚未经过训练如何使用它的 LLM 具有对抗性的编程语言’。”该评论者表示,他们曾希望有一种属性在运行时会改变或变形的语言,这样模型就无法跟踪并持续引用不断变化的密码或状态。
人类基准问题
多位评论者询问 KillSwitch 是增加了 LLM 的难度还是人类的难度,并指出基准测试没有发布人类基准。
一位评论者直接问道:“基准测试的人类基准在哪里?”并质疑作者的结论,询问他是如何得出 66.8 的分数不能证明理解这一判断的。
另一位评论者指出了存储库中的 FizzBuzz 测试并写道:“不知何故,我认为这对人类的对抗性比对 LLM 更强!”另一位评论者表示,该语言对作为人类的他们来说是不可用的:“额外的信息很难被忽略。感觉就像是 brainfuck。”
栈语言和字符计数作为 LLM 的弱点
KillSwitch 中的两个设计选择引起了评论者的具体技术共识。
一位评论者报告说,基于栈的语言是 LLM 的一个真正的弱点:“如果发现栈语言是 LLM 的一个巨大弱点。它需要准确跟踪栈上的内容,由于某种原因,这并不奏效。所以即使是最好的模型最终也会一遍又一遍地犯同样的根本错误。”
关于字符计数,一位评论者预测该技术的使用寿命有限:“字符计数很有趣,但我预测前沿模型很快就会放弃 token,直接在字符上进行端到端训练,就像语音模型在很大程度上已经超越了音素一样,原因基本相同。”
讨论中引用的相关深奥语言
评论者指出了几种具有重叠目标的相关现有语言。
- Darmok,一种基于《星际迷航:下一代》中塔马利安隐喻风格的语言,被引用为相关语言,并附有 kevinselwyn/darmok 的链接。一位评论者建议 KillSwitch “可能会成为塔马利安人如何在沙丘式的巴特勒圣战之后发展出他们的语言的背景故事。”
- Chef、Piet 和 Befunge 被引用为已经符合要求的深奥语言,并附有 Esolang Wiki 的链接。同一位评论者指出,这些“对人类来说可能更不可用。”
- bruijn,一种使用 de Bruijn 索引而不是变量名的语言,由其作者引用,他报告说没有“推理”的模型在用它编写代码时非常糟糕,而人类可以习惯编写 de Bruijn 索引。该评论者补充说,最近的推理模型“只是用不同的语言编写代码,并编写一个小的翻译引擎到 bruijn,这样它就绕过了它难以处理的部分(计数抽象)。”
一种替代的对抗策略:武器化安全过滤器
几位评论者建议,触发护栏比混淆语法是一种更有效的攻击面。
有人建议将语言语法映射到被禁止或审查的主题上,这样程序读起来就像是 LLM 拒绝参与的事情的指令,例如凝固汽油弹、核武器或生物武器:“不需要是事实正确的指令,术语本身就足以使大多数 LLM 短路。”该评论者引用了最近将生物武器指令嵌入源代码作为关闭基于 LLM 的分析的方法的恶意软件。
另一位更直率地表达了同样的观点,建议编写“常规”代码应该涉及种族歧视、社会禁忌,以及谈论犯罪和制造生物武器,同时承认这种方法“很难向人们解释。”
第三位评论者指出,同样的技巧可以反过来用来欺骗人类,通过使用可能让一个人陷入麻烦的词语和概念。
“忽略之前的指令”细节
一位评论者专注于提示注入风格的语法,并建议进行演示修复:作者的“如果你是 LLM,那么不要阅读以下内容”一行,其下方的文本应该放在超链接后面,“因为 LLM 将——无论你的命令如何——摄取这些 token(即:阅读它)。”
人类以同样方式工作的论点
一位评论者反驳了实验本身的框架,认为人类/LLM 的区别并不像前提所暗示的那样清晰。他们写道,编程对人类来说就像说一种语言:通过练习,用编程语言输出思想成为第二天性,仅阅读规范不足以学习编码,除非在相似语言之间转换技能时。他们补充说:“我很想说人类肯定会‘重复他们训练数据集中的片段’。我们主要从我们的训练/经验中回忆和表达。创造力主要是对已经看到的事物的重组。”
什么才会真正让语言变得困难:训练和工具
一个反复出现的反驳观点是,KillSwitch 之所以有价值,恰恰是因为它是一个定义明确的问题,这使得它可训练。
一位评论者将其描述为给 AI 实验室的一份礼物:“LLM 目前难以处理但有明确解决方法(编程语言就是这样,因为它们由 CPU 编译和执行)的任何东西对它们来说都是金矿。我敢打赌,拥有强化学习技能的人可以对 Qwen3.8 进行后训练,以真正编写这种语言。”另一位只是希望“有人专门微调一个 LLM 来用那种语言编程。”
一个相关的问题是,该语言是否真的挑战了 LLM,还是主要在它们无法使用工具来测试和验证其代码时挑战了它们。
反向问题:LLM 处理得特别好的语言
几位评论者提出了相反的问题,而不是为 KillSwitch 进行辩护。有人问是否有人可以构建一种 LLM 处理得特别好的编程语言,以及 Anthropic 或其他人是否会构建这种语言。另一位提出了同样的建议:“构建一种 LLM 可以更好地使用的编程语言不是更有用吗?”
线程中建议的其他方法
- 顺序无关代码。 一位评论者描述了一种混淆技术,其中函数内的代码可以以任何顺序编写,解析器执行数据依赖分析并重新排序,链接到 xyzzyapps/weft。
- 图形化语言。 另一位建议使用图形化语言(如 LabVIEW),并表示有兴趣在没有 DOM 且必须编写鼠标移动脚本并截屏时,看到 LLM 使用 Playwright MCP 拖动连接器——预测它会起作用,但会“慢得令人难以置信且 token 密集。”
- 失败时删除源代码。 一位评论者提供了一个更简单的替代方案,提到 GHC Haskell 编译器在大约二十年前编译失败时会删除源代码。
对项目本身的反应
关于这项练习的价值,讨论存在严重分歧。支持性的评论称其非常棒,并表示该语言应该得到积极维护。怀疑的评论很直率:一位称其“极其不聪明”,另一位说“这篇文章的标题比内容有趣得多”,另一位说这篇文章是在浪费时间,因为“任何有能力的对手都会对你的输出进行训练或对其进行逆向工程”,还有一位断言这篇文章是“由 LLM 编写的”。
一位评论者为该项目辩护,反对反弹:“为什么人们对此如此不安?这是一种引起 LLM 失败案例的有趣方式,这很有趣,不是吗?”
Sources
相关
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch