大模型推理的可验证证据:从数学手稿到形式化验证
最近发生了一件挺有意思的事一家头部人工智能实验室一次性公布了 722 份数学推理手稿。乍一听像在秀肌肉细看内容才发现这批东西根本不是“我们解出来了多少题”的成绩单而是把模型解题时脑子里那点不确定的盘算全摊开给人看。每份手稿里都有猜测、跳步、绕路甚至还有看上去很自信但完全错误的拐弯。这件事让我重新想明白一个判断AI 接着往下走真正难过的那道门槛不是模型尺寸不是参数量不是数据规模而是可验证的证据——也就是让机器输出的每一步推理都能被另一个独立的检查过程确认“这里没造假、没偷懒、没想当然”。如果你也一直在关注大模型做数学题、写证明、搞科研自动化的进展那你多半已经发现一个尴尬局面模型给出的答案可以漂亮得让人起鸡皮疙瘩但只要你想追问“你怎么知道这一步是对的”它十有八九会开始含糊。原因在于今天大多数模型的推理本质上是“预测下一句话”不是“推导下一个结论”。它擅长模仿人类证明的腔调和节奏却不擅长安抚“这一步凭什么成立”的质疑。而这 722 份手稿恰好把这种差别放到了显微镜下。我想借这批手稿把“可验证的证据”这件事掰开揉碎讲清楚它为什么是 AI 的下一道门槛形式化验证在这道门槛里扮演什么角色以及普通开发者或研究者面对一份 AI 生成的“证明”时该用什么姿势去审它、查它、复现它。这篇文章不会给你端一碗鸡汤说 AI 要取代数学家了恰恰相反我觉得更靠谱的图景是AI 负责天马行空地制造证明草稿人类或另一套机器检查器负责一字一句地验收证据。1. 722 份手稿的潜台词公开“半成品”比公布成绩单更诚实1.1 手稿公开意味着什么先还原一下这批手稿出现的背景。过去几年各家实验室在数学基准上的刷新方式基本已经模式化了拉一个包含多少道题的数据集让模型在封闭测试集上跑准确率然后发一张“我们超过了人类平均水平”的曲线图。可这套玩法有一个致命漏洞——测试集里的题目大多有标准答案模型完全可以在训练阶段就把答案背下来就算题目是全新的只要答案是唯一且可校验的数值模型靠猜也能蒙对一部分。这次公开手稿的机构做了一件不那么“公关”的事他们不满足于报告“正确率”而是把模型在解题过程中的完整推理草稿固化下来逐步追溯到每一步结论的前置依据。换句话说他们想回答的不是“模型能不能答对”而是“模型给出这条推理链时有没有足够的证据支撑”。602 份也好722 份也好数字本身不重要重要的是这批手稿把“结果”和“推理”两件事分离了。结果好看不代表推理可信推理可信哪怕结果错了也仍然有科研价值。别小看“分离”这两个字。在现阶段的 AI 数学系统中结果和推理经常是两张皮模型可以输出倒推出来的漂亮证明但如果你要求它从公理出发一步步走过去它可能完全走不通。公开手稿等于主动坦白“我们的模型有时候也走不通但这正是真实的推理过程。”这种姿态比晒一个单点分数能传达更多信息。1.2 为什么“正确答案”会骗人最容易让外行产生误解的地方在于模型写了 8 步推理结论也正确是不是就说明它会做数学题了真不是。我见过很多例子模型在中途引入了一个它自己从没证明过的隐含断言然后基于这个断言继续推。后续的步骤哪怕全部符合形式逻辑整条证明还是无效的因为关键的地基是凭空造的。这里有一个特别经典的案例模式要证明一个数列收敛模型先假设了“每个有上界的单调数列都收敛”然后一路顺畅推下去。结论是对的中间那个假设也确实是个定理。但问题是如果题目所在的公理体系里还没有证明过这个定理或者模型只是“默认”它成立那么整个证明就变成了空中楼阁。人类审稿人会追着问这个引理你证过了吗如果证过引理本身也需要完整证据如果没证过这就是把结论塞进前提。公开手稿的价值就在于它会老老实实标出哪些步骤是模型“认为显然”的哪些步骤是模型自己生成但没被验证过的。读者有机会看到一条证据链上的所有锈点而不是只看抛光后的外壳。1.3 这批手稿对应的是什么类型的任务从任务类型看这批手稿覆盖的并不是单纯的“计算题”而是更偏向于“证明题”和“推导题”给定命题构造证明路径。相比数值计算这种任务更能暴露模型的推理能力上限因为证明题的解法空间是开放的模型可以用无数种方式绕到终点也可能用无数种方式半路掉坑里。这也带出一个关键点如果你希望 AI 在数学、科学发现、甚至代码正确性验证中真正成为可信的协作者那你需要的不是它给出漂亮回答的能力而是它给出一个可以逐层回溯的证据链的能力。手稿就是证据链的原始形态。批量公开手稿等于把“证据”这一维度抬到了桌面上。2. 从“答案正确”到“证据可靠”能力断层图2.1 当前大模型做数学题的真实水平评估想要明白“证据可靠”为什么是鸿沟得先知道现在大模型做数学题的真实水平在哪一档。如果只做小学应用题、竞赛选择题那确实已经很强了尤其是遇到数据分布内见过的题型时它能给出非常像样的解答。可一旦进入算法没见过的开放证明问题模型的表现就会出现明显衰减。具体衰减体现在三处。第一模型很容易把“听起来合理”当成“逻辑正确”。你让它证明某个分式不等式它可能会熟练地套用某个不等式名字但套错了适用范围。第二模型的推理链稳定性很差同样的题目换个数字它可能就从能证明变成完全跑偏。这说明它记住的不是推理结构而是题面模式的概率联想。第三模型无法自然地区分“已知定理”和“待证命题”经常在证明中途不打招呼就直接征用要证的结论。所以说用“正确率”衡量 AI 数学能力就像用“答对几道菜名”衡量一个厨师的做菜水平。真正的数学能力永远离不开证据的完整性和可追溯性。2.2 “证据”为什么比“答案”难一个量级先把话说直白些一个答案只需要一个符号串是“对的”一份证据则要求所有中间步骤都“站得住”。答案正确是单点事件证据可靠是链式结构。链条的强度取决于最薄弱的那个环节。举个例子。你让大模型回答“7 的 100 次方除以 5 的余数是多少”它能答对“1”。但你让它写清“为什么余数是 1”它就得先说明模运算的性质、7 的循环节、指数与模的关系……这每一步都需要独立支撑。为了压缩信息模型可能在某个地方写“显然有 7^4 ≡ 1 mod 5”如果这条“显然”成立那行但你怎么知道模型真的验证过这就要求从“预测下一个 token”变成“跟踪每一个前提的状态”。后者不是靠更大的模型、更多的语料就能自然涌现的它需要明确的机制来记录和检查每一步的依赖关系。所以我说证据可靠比答案正确难一个量级是所有关注这个领域的人都应该有的基本共识。2.3 可验证证据为什么是下一道门槛过去一年里关于大模型能力的讨论总爱用“涌现”这个词。但这批手稿给我们提了个醒涌现能带来“语感”带来不了“保真”。而数学、科学、法律、医疗这类高风险场景恰恰最需要保真。你不可能接受一份 AI 写的药物研发报告里面的每一步实验数据都无法溯源。所以AI 的下一道门槛并不是变得更聪明、更会联想而是变得“可问责”——它给出的任何一条论断都必须能被另一套独立机制检验。一旦这个门槛跨过去AI 在数学和科学里的角色就会从“灵感生成器”升级为“可信推理代理”。这也是 722 份手稿事件值得所有人关注的根本原因它在正式宣告证据问题已经取代纯能力问题成为下一阶段的主战场。3. 可验证证据的技术底座形式化验证到底在查什么3.1 形式化证明的基本原理要谈“可验证的证据”绕不开形式化验证。它的核心思路其实特别朴素把数学命题和证明过程翻译成一种极其严格的、没有歧义的符号语言然后让计算机按照固定的推理规则逐步检查。这里有个生活化的类比普通证明像是一段用自然语言写的合同草案甲乙双方都能读但总有解释空间形式化证明像是一份用编程语言写的合同机器逐字逐句核对只要有一处变量未定义、一个条件不满足就立即报错。形式化系统里的所有断言都必须非常精确地写清楚包括“存在某个自然数”和“对于所有自然数”这类量词差异一个都不能含糊。一个典型的命题可以长成下面这样——用接近主流证明检查工具风格的伪代码表示theorem odd_plus_odd_even (a b : Nat) : (Odd a) - (Odd b) - (Even (a b)) : ...这个声明本身就在交代证据的基本骨架对于任意自然数 a、b如果 a 是奇数、b 是奇数那么它们的和是偶数。证明部分则需要把 a 和 b 分别表示成 2k1 和 2m1代入并整理成 2(k m 1) 的形式。每一步都落在明确的规则上。3.2 机器检查与人工审查的分工一旦证明过程被形式化计算机就能扮演一个铁面无私的审查者。你给它一个声明给它一组前提它不会“理解”你的意图它只是依据推理规则做替换和重写。一阶逻辑的推导规则、类型论的构造规则、归纳法的调用条件……机器逐项核对全部通过才在屏幕上打一个勾。人工审查和机器检查最大的区别在于人会“脑补”上下文机器不会。你在草稿纸上写“显然可知”人类读者可能会容忍你把“显然可知”丢给机器它会把头一歪请给出所有中间展开步骤一步不许跳。这种不留情面的检查正好治模型的“造句式证明病”——因为模型最擅长输出的就是那种读起来顺畅、实际上漏掉关键步骤的漂亮空话。当然机器检查也不是银弹。它要求人类先把命题翻译成严格的形式语言这个翻译过程本身可能引入错误。你说你证明了某个命题但如果翻译的时候就译错了机器检查的只是“译错后的版本”那整个验证就变成了自说自话。所以准确的说法是形式化验证证明的是“翻译后的命题在该规则系统内有效”而不是“自然语言原题被证明了”。这两个层次的区别是所有新手容易踩的第一个坑。3.3 形式化表达为什么本身是一堵墙理想很丰满现实是形式化一个已经写成自然语言的数学证明往往比重新发明这个证明还费劲。这堵墙有三个来源。第一自然语言有省略形式语言零容忍。人类写“不妨设两边同除以 x”读者会自动补上 x 非零这个前提机器不会你必须显式声明。第二自然语言的数学习惯和形式化系统的表达范式并不总一致。有些数学家习以为常的“连续统假设式的省略”在形式化系统里需要绕很大一圈。第三形式化系统的生态还在发展中库里的预证明定理数量有限很多看起来平凡的事实也得从头构建。但这堵墙反过来看其实是价值所在正因为跨过去很费劲能跨过去的东西才特别经得起检验。当一份手稿最终变成机器可验证的形式化证明时它就不再只是一堆看起来像样的文字而是一串可以被反复执行的检查指令。4. 复现一次 AI 证明验证从手稿到机器裁决的完整链路4.1 准备验证环境的基本思路说了那么多抽象原理咱们来点实操。假设你手头有一份 AI 生成的“证明”内容是一句一句的自然语言推理链你想检查它到底站不站得住。比较严谨的做法是走一趟“人工翻译 机器验证”的流程。首先你得有一个能执行严格推理检查的环境。现在市面上主流的开源证明助手各有各的偏科——有的擅长类型论推导有的擅长经典逻辑重写。具体选哪个可以根据你平时打交道的问题类型决定但关键不在于工具名字而在于你要时刻记得形式化验证是用来暴露问题的不是用来装饰结论的。所以环境选择上我建议遵循三条朴素原则社区活跃度够高、语法文档够多、你至少能读懂错误信息。别为了炫技选一个冷门工具等你想问人时连个讨论组都找不到。4.2 把 AI 输出翻译成验证脚本的步骤假设要验证的命题是“两个奇数之和是偶数”AI 给出的自然语言证明是“设第一个奇数为 2a1第二个奇数为 2b1将其相加得 2a2b2即 2(ab1)故为偶数。”这份手稿读起来没问题但仔细审就有讲究。你要做的第一件事是把这道题的“前提类型”写清楚a 和 b 是什么是任意整数、自然数还是实数奇数在系统里的定义是什么是否存在某个数 c 使得数等于 2c1第二件事是检查相加那一步的合法性加法有没有交换律和结合律提取公因子 2 的操作有没有对应规则第三件事是要显式写出“偶数”的定义存在整数 d 使得数等于 2d。然后把这三件事全部拼进可验证脚本里。写出来大致长这样theorem odd_add_odd_is_even (a b : Nat) (ha : Odd a) (hb : Odd b) : Even (a b) : let a : 2 * Nat.succ ? ...这里标问号的地方就是 AI 手稿里大概率的跳坑点它不会自己告诉你 a 到底怎么写成 2k1 的你需要替它把 k 的形式构造出来。这个“你说显然、我帮你补完”的过程就是验证 AI 手稿的日常工作。4.3 验证结果的三类常见反馈跑完验证你通常会遇到三类反馈它们分别指向手稿中的不同病灶。第一种验证顺利通过。恭喜说明这份手稿至少在这套形式系统里是合法的。第二种验证器报错错误指向“缺步骤”——比如你引用了某个引理但没有给出引理的证明或声明。这类错误最容易出现在 AI 推导过程里因为它特别爱引用“显然成立”的熟面孔定理而实际上当前上下文中根本没人证明过它。第三种验证器报错错误指向“类型不匹配”或“目标无法归一化”——这意味着这个推导本身思路就有问题不是补一步就能救回来的。遇到第一类反馈时别急着高兴因为形式化通过只能说明逻辑链闭合命题在实际数学意义上是否有趣、定理是否好用那是另一个层面的事。遇到第二类反馈就去把缺的引理补上补完再看。遇到第三类反馈建议别硬补先回头审视证明思路的主干是不是走错了方向。4.4 从一条证明到自动搜索证明的进阶思路单条证明的验证打通之后自然会产生一个野心能不能让 AI 一边生成证明草稿一边自动跑验证器把不通过的版本扔掉只保留通过的版本这个想法在理论上是成立的验证器做裁判模型做候选生成器两者组合成一个“生成—检验”闭环。我实践下来最有用的做法是给模型配置一个带反馈循环的环境模型输出一个证明片段验证器退回错误信息模型根据错误信息修正策略再试一次。这种方法比单纯让模型闭卷输出“完整证明”的成功率高得多。原因很简单模型虽然不擅长保证正确性但擅长根据报错信息做局部修补相当于把它最厉害的“语感”用来解阅读理解题。不过这里要提醒一句自动搜索会消耗大量计算资源而且容易让模型在搜索空间里原地打转。所以工程上要设置明确的迭代上限同时维护一个“已尝试但失败”的路径缓存避免模型反复掉进同一个坑。5. 手稿中最常见的“伪证据”模式与排查方法5.1 步骤跳跃型大跳步掩盖了未证明的关键引理在 722 份手稿里最频繁出现的伪证据模式是“步骤跳跃”。模型经常写“由 A 可得 B”中间实际上跳过了一个关键引理。这种跳跃在自然语言里极具欺骗性因为读者自己如果熟悉相关领域会下意识地替它补全那个引理于是“由 A 可得 B”读起来毫无问题。要排查这类问题就得把每一步的依赖链追平A 到 B 之间到底差了几个中间命题这些中间命题在题目条件里能推导出来吗如果能需要几步如果推不出来那就不是“跳跃”而是“断桥”。我习惯用的办法是把每个“由……可得……”的句子单独摘出来当成一个独立的子命题先不管上下文只看这一步本身是否构成一个合法的推理。这一步过滤掉了手稿里三分之一以上的空洞断言。5.2 循环论证型把结论悄悄塞进前提第二种伪证据更狡猾循环论证。表面上的结构是 A → B → C → A但因为绕的圈子足够大读者很难一眼看出来。模型会在某一步引入一个“显然成立”的辅助命题而这个辅助命题实际上等价于最终要证的结论。比如要证明某个集合不是可数的模型在中间某处说“显然这个集合与实数集等势”。如果“实数集不可数”本身就是目标那么这个“显然”就是循环论证要么你还没证明它要么你只是在换个说法重复目标。排查循环论证的办法是做一个“命题依赖图”把每个出现的断言视作一个节点把推导关系视作一条边然后检查最终结论的节点有没有出现在它自己的前置依赖链条里。如果出现了证明立即作废。5.3 定义走私型把要证的命题焊进定义第三种模式比较隐蔽新手很容易被绕进去。模型可能把一个还没证明的性质直接定义进某个术语里比如题目要证明某个函数连续模型一开始就说“我们考察这个连续函数 f……”然后顺理成章地把连续性当成已知条件用。这种“定义走私”的可怕之处在于它让所有后续推理都变得局部正确但那只是因为初始定义里已经包藏了答案。排查时我会逐字检查所有“设……为……”的句子这个定义是否引入了额外假设该假设是不是和结论差不多等价如果你发现自己什么都没干就拿到了结论那大概率是被定义走私了。5.4 假设幻觉型凭空添加题目没有的条件还有一种模式可以叫“条件加戏”。模型在推不下去的时候经常会沉默地增加一个题目完全没提到的强条件。比如原题只说 x 是正数模型写着写着就开始讨论 x 1 的情况然后给出一堆在 x 1 下成立的结论结尾还礼貌地总结一句“证毕”。这种错误在手工证明里也会发生但模型发生的频率更高因为它追求“语义通顺”宁可加戏也不愿意停笔承认自己卡住了。排查这类模式的唯一办法是严格维护一个“当前可用前提清单”。每次看完模型的一步推理都问一句这一步用到的条件全部在清单里吗如果不在它就是走私进来的。我在实践里会把清单贴在编辑器上方每读一步就对照一次。听起来笨但对付 AI 手稿的加戏这套笨办法无比有效。5.5 审稿排查清单把上面四种模式整理成一张可以直接用的问题清单这一步的论据是从题设、公理、还是前面已证命题中来的如果论据来自某个引理那个引理本身得到证明了吗把“由……可得……”换成完整的三段论链条是否能闭合是否出现了与目标结论等价的“辅助定义”证明中有没有用到当前前提清单之外的条件每一步的量词替换与变量约束是否符合逻辑规则把这些问题逐项过一遍之后大部分劣质证据都会暴露。剩下的那部分真正干净的手稿才值得你投入更多时间去精读和复用。6. 人机协作时代的证据审阅我自己的一套笨办法6.1 三遍审阅法面对一份 AI 生成的数学手稿我通常不会一上来就上验证器。先给手稿留一段“冷静期”然后执行三遍审阅法。第一遍快速通读只看主干思路要证什么、分了几步、每步大概想干什么。这一遍的目的不是找细节错误而是判断证明策略本身是否合理。如果策略方向就是错的后面细节再多也白搭可以直接淘汰省事。第二遍局部抽查挑模型最容易翻车的段落做深入验证。比如它写“由上述不等式可得”的地方我会把不等式原原本本抄出来试着自己推一遍。第三遍如果手稿通过了前两遍再花费力气做机器验证或人工逐行验证。要是前两遍就漏洞百出就不必在形式上浪费一天时间了。6.2 不同角色的实践重点如果你是正在用 AI 辅助数学研究的研究者我的建议是让 AI 负责生成“反例候选”和“可读草稿”但终极裁决一定握在自己手里。不要因为 AI 给出了一段极其漂亮的证明就放松警惕看手稿时保持论文审稿人的心态。如果你是工程师想用这套思路做代码自动推理或协议验证那重心稍微不同工程上更强调把命题拆小、让验证器可以自动检查而不是攻克的命题有多深。先把一个小模块的形式化证明打通确认整条工具链跑顺了再考虑处理更大规模的系统。不同角色没有谁更高级之说只看你在哪个环节最需要“可验证证据”的兜底。6.3 一份来自实操的最终提醒这几年来我陆续验证过不少 AI 生成的手稿最大的体会是证据链上的信任不是来自模型的自信而是来自检查的彻底性。模型输出“显然”两个字的时候它并不知道自己为什么觉得显然它只是在模仿人类熟练工的表达习惯。真正能留下的证据是那些可以被第三方独立重建、独立检验的步骤。所以我个人特别欣赏这次公开手稿的举动。不是因为那些手稿证明了 AI 有多强而是因为它们展示了 AI 在推理证据这件事上有多脆弱。知道自身能力边界才有可能设计出越过边界的方案。让模型生成候选证明让形式化验证器做验收让人类负责定义命题与审核大方向——这套三角工作流是我目前看得比较清楚的路线。至于 722 份还是有 700 份不过是这条长路上一个点位的刻度而已。