正文
不知道谁需要听到这句话,但软件形式化验证(用数学方法检查软件是否正确)远未完成,即使现在我们有了LLMs,证明的繁琐工作也消失了。相反,拥有LLMs让我们可以把注意力集中到规格上;在这一环节,人类仍然参与其中,而过去人们往往对此相当马虎。所谓马虎,是指他们经常宣称“形式化验证过了!!11”,却连规格是什么都不提。仔细检查后,规格往往被发现遗漏了人们自然会期待的关键保证。
形式化验证确实很难。首先,你需要弄清楚究竟想检查什么行为:也就是规格。然后,你需要经历编写证明的繁琐过程,以证明你的程序确实满足该规格。
LLMs大幅加快了第二步。这是因为证明可以由编译器自动检查。如果编译器通过了,LLM就完成了它的工作;你可以相信这个结果,也就是你的程序满足该规格,而不必亲自阅读证明。(当然,前提是没有遇到编译器漏洞。)
但第一步仍然存在:规格是什么?编写规格仍然繁琐且容易出错。虽然LLMs能够提供帮助,但人类至少仍需在一定程度上参与,以评估规格是否符合程序员的意图和用户的预期。如果你对这一部分采取“凭感觉”的方式,漏洞就会重新出现。
此外,并非所有规格都一样。不要在检查规格之前就相信“形式化验证过了”。如果规格只说“程序不会崩溃”,那就远不如一份详细反映程序预期功能和目标功能的规格有用。
所以,人类并没有退出这个环节,我们只是上移了一个层级。证明的繁琐工作消失后,我们终于可以把注意力集中到规格上!