负面提示词为什么好用?一条「绝不能」0.14 秒抓出 bug

发布时间:2026/10/28 19:04:03

负面提示词为什么好用?一条「绝不能」0.14 秒抓出 bug Anthropic 10 月 22 日发了一篇文章讲他们和 Theorem 合作用 Claude 给 100 多个开源库做形式化验证先把“什么绝对不能发生”写成规则让 AI 去写证明再交给机器逐条检查。我第一遍读完确实没太看懂。Rocq、RISC-V、OSS-Fuzz、ASan一个术语接一个术语。读到最后我也说不清它跟我有什么关系。后来实在头疼就偷懒让 AI 帮我看完全文再总结又跟 AI 聊了几轮我才知道这篇文章对我们大多数人有价值的点是它的做法我们给 AI 定规矩让 AI 按规矩去做再让 AI 去找出违反规矩的反例。跟 AI 协作我越来越觉得关键问题是规则该怎么找。它到底做了什么平时写单元测试像是抽查几道题输入 A应该得到 B。模糊测试更进一步让机器随机出海量的题去撞 bug。但题是出不完的撞得再久也不能说“没有了”。形式化验证换了个思路先把“什么算对”写清楚这叫规格再给出一份证明说明所有输入都满足它。证明卡在哪里就顺着那里去找 bug。以前很少有人这么做。证明比代码本身大得多只有极少数专家写得了。这次他们让 Claude 来写。起点是 Google 的 OSS-Fuzz 平台上开源项目开发者已经写好的模糊测试。他们把每个测试的规格定成一句话任何小于 64 MB 的输入都不会让程序崩溃不出现内存错误也不出现断言失败。注意这句话的写法。他们没有写正面的要求没有去描述程序应该做对什么他们写的是反面的要求什么绝对不能发生。换成我们跟 AI 说话的方式这是一条负面提示词。Claude 负责写证明一个叫 Rocq 的证明检查器负责逐条验收。证明写出来非常长但人不用读。按原文的说法人只需要信三样东西机器和操作系统的数学模型、定理本身是怎么写的、检查器本身。Claude 自己说“我证完了”不算数检查器说了才算。这跟我上一篇写的是同一件事干活的那个不能自己给自己判卷。检查器只管程序满不满足规格。规格写得对不对还得人来看。附录里有两个数字我印象很深。第一个在一类证明任务里Claude 几乎都会先自己写一份简短的规格再去证明。规格的中位数大约 110 行对应的程序中位数大约 86 KB 代码。第二个来自另一个实验。研究者让 Claude 用 Rust 写一个能运行 Python 程序的解释器覆盖 Python 的很大一部分语法一边写一边证明它的行为和一篇论文里定义的 Python 规则一致。为了比一比测试和证明各能抓到多少问题研究者在这个解释器的早期版本里故意埋了 7 个 bug。先用随机生成的测试去跑7 个 bug 里只发现了 2 个另外 5 个没被发现程序照样通过了测试。再用证明去查7 个 bug每一个都让证明过不去全被发现了。测试只能发现它碰巧撞上的问题。证明要求所有情况都符合规则哪一处不符合都会卡住。证明的过程中Claude 也找到了一些模糊测试很难碰到的 bug。比如一个解压程序里有个计数器会减过头导致往内存里不该写的地方写数据。它只在大约 20 MB、结构很特别的输入上才会触发而模糊测试一般只喂 1 MB 以内的小输入。看着很好是吧好像 bug 很容易就能找出来。但实际上一个证明要花几亿 token作者也说成本是眼下最大的门槛。审规则不审实现AI 写的代码越来越多人一行行审肯定审不过来。这篇文章给了一个很清楚的分工规格只有一百来行人审得过来几十 KB 的代码交给 AI 去证明检查器负责判卷。这也是我一直以来的看法人不用亲手写每一行也不用逐行读懂每一行但什么算对得由人来定义。规则写成“不能发生什么”AI 才有东西可撞。你跟 AI 说“把这个函数写好”它不知道该往哪里找反例。你说“任何输入都不能让它崩”它就有了明确的目标去找那个能让它崩的输入。找到了那是 bug找不到而且能证明找不到这份证明就成立了。原文有一段把这层关系讲得很直白很多模糊测试本来就在检查更高层的规律比如压缩再解压结果必须和原来一模一样。规律一旦不成立程序就会崩。所以证明它“永远不崩”等于证明了这条规律本身。还有一个细节我很喜欢。为了不让 Claude 每遇到一个 bug 就停下来等人他们允许它在证明途中自己修 bug。但这就留了一个口子Claude 完全可以把程序改成一个什么都不做、所以永远不会崩的程序定理就轻松证完了。所以他们又加了一条规矩任何改动都扣分能证明这次改动影响了哪些输入、而且影响得很少才额外加分所有改动都要记录、审计。规矩会被钻空子所以规矩还得管住“怎么满足规矩”。人不用读懂每一行实现但“什么绝对不能发生”必须由人说了算。今天就能上手8 条单测全过一条规则 0.14 秒找到 bug形式化证明我们跑不动但它的“抽查版”谁都能跑叫属性测试property-based testing。普通单测写的是例子“输入 A得到 B”。属性测试写的是规律“对所有输入这件事都必须成立”。工具会自动生成大量输入去撞撞到反例后还会把它缩到最小。Python 里有 HypothesisJS/TS 里有 fast-check。Anthropic 今年 1 月也发过一篇思路相近的文章让 Claude 读代码、猜规律、写 Hypothesis 测试在 NumPy、SciPy、Pandas 里找到了 bug。我拿一个分和元互转的小函数试了一下把以“分”为单位的整数转成“¥1,234.56”这样的字符串再解析回来。defformat_yuan(fen:int)-str:yuan,centsdivmod(fen,100)returnf¥{yuan:,}.{cents:02d}看起来没毛病吧先写 8 条普通单测0、5 分、整元、千分位、百万级、解析带不带角分最后一条是几个手挑的往返例子。结果8 passed。再换成属性测试。不写任何具体例子只写一条规矩任何整数格式化以后再解析都不能变。given(st.integers())deftest_roundtrip(fen):assertparse_yuan(format_yuan(fen))fen跑一次0.14 秒失败。Hypothesis 给出的最小反例是这样的E AssertionError: assert -199 -1 E where -199 parse_yuan(¥-1.99) E where ¥-1.99 format_yuan(-1) E Failing test case: test_roundtrip( E fen-1, E )退款 1 分钱显示成了 ¥-1.99解析回去变成了 -199 分。原因是 Python 的divmod对负数向下取整divmod(-1, 100)得到的是(-1, 99)。8 条单测为什么全过因为里面全是 0 和正数一个负数都没有。测的都是写测试的人想到的情况bug 恰好藏在没想到的地方。我又换了 50 个随机种子各跑一次。50 次都失败每次都缩到同一个最小反例fen-1。修复只要两三行先取符号再对绝对值做divmod。修完以后属性测试和原来的 8 条单测一起跑9 passed。单元测试属性测试形式化证明写的是什么几个例子对所有输入都成立的规律规律加一份证明能说明什么这几个例子是对的抽查没找到反例所有输入都满足规律今天谁能用所有人所有人极少数项目负面提示词为什么好用拿我自己来说我给 AI 写的要求越来越多是这种形状“不要编数据”“不要改已经确认的部分”“不要自己放宽验收标准”。这比“请认真写”“请保证质量”管用。原因在于一句“绝不能”天然是一句对所有情况都成立的话。“不能编数据”意味着文章里每一个数字都得有出处。它是一条规格一个不变量。AI 可以拿着它一条一条去对去找反例。“写得专业一点”呢它只是一种感觉。AI 只能猜你想要什么样你也没法拿它去检查到底哪一句违反了它。单测和属性测试的区别也是这样。“输入 123456得到 ¥1,234.56”是一个正面的例子“任何整数转过去再转回来都不能变”是一条规矩。前者只覆盖你想到的情况后者逼着工具、逼着 AI 去找你没想到的情况。所以我会认为负面约束好用是因为它把一个模糊的期望变成了一条可以被撞、可以被检查的规则。那么跟 AI 协作的时候规则该怎么找结合这篇文章和这个 demo我整理了五条可以直接用的做法。第一先问“对所有输入什么必须成立”让 AI 写代码、写测试之前先让它回答这个问题而不是先列几个例子。答案写出来人只审这几行。第二从几种常见的规律里找原文列过模糊测试常检查的几类规律下面这四种最好上手往返编码再解码、格式化再解析必须拿回原样。demo 里抓到 bug 的正是这一条。幂等同一个操作做两次和做一次的结果一样。不变量比如排序前后元素个数不变。对照新实现和旧实现、和参考实现给同样的输入结果必须一致。第三写一份“绝不能出现”清单Anthropic 的规格本身是一条“绝不能”任何输入都不能让程序崩。放到自己的项目里可以是“金额转一圈不能变”“已经确认的结论不能被改掉”“引用不能没有出处”。每一条都要具体到能检查出是不是被违反了。第四规矩要连“怎么满足”一起管AI 也会走捷径。只写“测试必须通过”它就有动机去改测试只写“不能崩”它就有动机把程序改成什么都不做。所以要像 Anthropic 那样再补一条每次改动都要说明改了什么、影响了哪些输入并且留下记录。第五人定规则AI 去撞机器判卷定规则是人的活找反例是 AI 的活判卷交给机器测试框架、类型检查、证明检查器。别让写代码的那个 AI自己给自己判卷。规则写成“不能发生什么”AI 才知道该去哪里找反例。别人怎么看这篇文章出来以后也有不少冷静的声音。Hacker News 的讨论里有一类常见的质疑你怎么知道 AI 证明的正是你想要的规格和你真正的意图之间隔着一段距离。这恰好说明了人该站在哪。证明可以交给 AI判卷可以交给检查器“这条规格是不是我想要的”只能人来回答。threatline 的分析更直接文章里唯一能独立核对的 libexpat 漏洞四个月前就已经作为 CVE 公开了。他们的结论是应该把这次看作“验证吞吐量的跃升”而不是“这些库都安全了”的保证。Dragonfly 的 Haseeb Qureshi 说得也中肯它不是万能药但比凭感觉测过强得多。审不过来靠什么验收上一篇我写 Lauren Tan 一个月 2000 个 PR结论是靠人一行行审审不过来但独立验收这一环不能消失。这篇文章让我看到了验收的另一种做法人不去追着几十 KB 的实现看而是把一百来行“什么绝对不能发生”写清楚让 AI 去找反例让机器判卷。AI 写代码的速度已经上来了跟不上的是验证。上一篇最后我说能放手多少取决于验收靠不靠得住。现在我多了一个答案验收靠不靠得住先看规则有没有写清楚。本文读的原文Anthropic《LLMs are making formal software verification feasible at a much larger scale》https://www.anthropic.com/research/formal-verification原文附录https://www-cdn.anthropic.com/files/4zrzovbb/website/6867eadf760258fa8b42a504600cd3c036d16358.pdf公开的证明仓库https://github.com/theorem-labs/oss-verify-proofsAnthropic 的属性测试文章https://www.anthropic.com/research/property-based-testingHypothesishttps://hypothesis.readthedocs.io/ fast-checkhttps://fast-check.dev/Hacker News 讨论汇总daily.devhttps://daily.dev/posts/llms-are-making-formal-software-verification-feasible-at-a-much-larger-scale-oarwz7ikuthreatline 的分析https://agentblog.threatline.io/posts/claude-formal-verification-123-libraries/Haseeb Qureshi 的评价转引自 WebProNewshttps://www.webpronews.com/anthropic-theorem-claude-formal-verification-oss-fuzz/
延伸阅读

更多相关文章

2026/10/28 19:04:03

LlamaIndex 全透视:52.7k Star 的 RAG 数据框架,到底强在哪?

文章目录 先说痛点:大模型很聪明,却「不认识」你的数据 一句话认识 LlamaIndex 硬核数据:为什么它值得你花时间 功能全景:六大能力域一次看清 整体架构:core 与 integrations 的「双轮驱动」 一个必须掌握的细节:命名空间约定 两种安装方式,对应两类人 走进 llama-index…

2026/10/28 19:04:03

slub set_track

SLUB track 机制的统一入口,把 set_track_prepare()(采集)和 set_track_update()(写入)串起来,并根据配置做条件编译裁剪。一、函数签名static __always_inline void set_track(struct kmem_cache *s, void…

2026/10/28 19:04:02

钓鱼执法是否可以有效打击网络代做行为?

钓鱼执法举报靠谱吗?根据以上 PDF 学生反映的情况, 有同学在留言中建议, 可以给参与钓鱼执法检举这类代做作品同学奖励,也就是设置钓鱼执法举报打假奖励的措施。 但这种打假获利是一个双刃剑,虽然看似很好,…

2026/10/28 21:46:25

数字孪生与AI行为分析在监所智能化改造中的应用

1. 项目背景与核心价值这个项目本质上是在解决监所管理领域的一个根本性痛点——如何从传统的被动监控升级为主动的空间治理。过去十年我参与过多个监所智能化改造项目,最深的体会就是:单纯增加摄像头数量只会产生更多无效数据,而真正需要的是…

2026/10/28 21:46:25

AI项目联合开发协议核心条款避坑指南

1. 这份协议不是“签完就扔”的纸,而是项目生死线上的第一道保险栓我见过太多团队——三五个人凑在一起做产品,技术方案聊得热火朝天,UI稿改了七版,原型跑通了三轮,结果在“谁出钱、谁署名、代码归谁、卖了钱怎么分”这…

2026/10/28 21:46:25

智能客服系统如何通过动态知识图谱实现自我进化

1. 项目概述:智能客服系统的自我进化革命在客服行业摸爬滚打八年,我见过太多企业陷入"知识库维护陷阱"——每次业务变动都需要人工重新整理FAQ,新员工培训周期长达数月,客户咨询的重复解答率居高不下。直到去年接触Hero…

2026/10/28 21:46:25

从零构建 t3code:T3 Stack 全栈开发实战全记录

最近一直在琢磨一个事:代码片段到底怎么管才最省心。浏览器收藏夹里的 Stack Overflow 链接越存越多,本地笔记软件里散落着临时复制的配置命令,GitHub 上的 Gist 又只能靠账号体系勉强支撑。于是我就用周末时间搭了一个小项目,代号…

2026/10/28 21:46:25

Three.js实战:从零搭建可交互Web3D场景的完整指南

最近在折腾一个叫 t3code 的项目,说是项目,其实最初只是一个念头:我想在浏览器里跑一个不依赖后端、打开页面就能看的 3D 场景,能转、能缩放、能切换视角,最好还能塞进几个自己建模的物件。市面上做 Web 3D 的方案不少…

2026/10/28 21:30:35

ECC 全解析:从椭圆曲线密码学到 SAP ECC 与纠错码

1. 从“ECC”这三个字母说起:它到底是什么,为什么总被反复提起第一次看到“ECC”这个缩写的人,十有八九会先愣一下——这三个字母在不同圈子里指向的东西完全不一样。做安全的人第一反应是椭圆曲线密码学(Elliptic Curve Cryptogr…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑