目 录CONTENT

文章目录

牛马观察日记014:「AI 证对了每句话,但已经跟原命题无关」

y总
2026-08-07 / 0 评论 / 0 点赞 / 2 阅读 / 12270 字

8 月 4 日早上 9 点 13 分,我还在刷牙,手机弹了条量子位的推送。

标题是:《数学家 24 小时驳回 OpenAI 攻破的猜想!"AI 证对了每句话,但已跟原猜想无关"》。

我嘴里含着泡沫点进去,看到的第一行是:

"OpenAI 宣称下一代 AI 模型解决了 10 个世界级难题,其中包括推翻了 **Connes 刚性猜想**。"

我把牙刷放下了。

不是因为震撼,是因为那条标题里的那句引号——"AI 证对了每句话,但已跟原猜想无关"——和我三天前 merge 的一个 PR 的状态,太像了。


1. 那个 37000 行的"完美证明"

先把事情说清楚。

Connes 刚性猜想是 1980 年前后由法国数学家 Alain Connes 提出来的,简单说就是:某些群在配上一套代数结构之后,群不一样,代数结构就一定不一样。前置条件是两个:群要满足 ICC 性质,并且满足 Kazhdan 性质 (T)。

要反驳这个猜想,必须构造两个长得不一样的群,让它们生成完全一样的代数结构,并且同时满足 ICC 和性质 (T)。

OpenAI 这次的做法是:构造两个不同构的群,让它们生成同样的代数,然后给出两个群都满足 ICC 和性质 (T) 的证明。

整套论证写成 37000 行 Lean 4 代码——Lean 是麻省理工的一个形式化证明内核,每一行都会被机器逐条验证。OpenAI 还附了一份说明文档,解释这两个群是怎么搭出来的。

37000 行。Lean 内核逐条验证通过。

公开出来的时候,应该是一片欢呼。

因为单看每一个局部,都是没问题的。 函数签名对齐、变量类型一致、群同构证明的每一步都能在 Lean 内核里 ✓ 通过——你单看任何一段,都像极了正确的样子。你甚至可以单独抽取其中 200 行,让一个训练有素的数学硕士去 verify,他可能读完点点头说"没问题"。

这正是这件事可怕的地方。


2. 24 小时,被一个数学家逐行追回

第二天,也就是 24 小时内,堪萨斯大学拓扑物理中心的 J. L. Nielsen 发了一篇回应。

她做的事看起来很笨:把那 37000 行 Lean 代码,从头追到尾。

公开发布的是一个整合成单文件的版本,早期分模块源码里那些有意义的命名全都被合并掉了,名字对不上名字。她列了一张对照表,把每个数学对象在新代码里的名字和行号一一标出来:

- 零上闭链群在第 13700 行

- 扭曲群在第 14069 行

- 两套代数同构的证明在第 36712 行

- 主定理在第 36954 行

然后她把证明 ICC 的整条推理链追了一遍。从第 31430 行起步,一层层往上传递,最后在第 31610 行合成结论。

她给出了两条互相独立的失败路径。

核心结论是:AI 构造的其中一个群,其实没有满足附加条件——既不是 ICC,也没有性质 (T)。

三种可能:

1. 代码里性质 (T) 没有忠实对应 Kazhdan 的原始定义;

2. 证明只对部分成立,却被算到了整个群上;

3. 代码里那个群根本不是说明文档里描述的样子。

不管哪种,结论都一样:AI 给出的 37000 行证明,每一步都是严格的——但它在证明一个跟原猜想无关的命题。

Lean 内核开心地点了 ✓。Nielsen 翻开第一页,就知道跑题了。

最讽刺的是:Nielsen 自己也跑 Lean 4。她不是靠直觉驳回的,她是用同样的工具把 AI 的 37000 行代码重新对了一遍,对到第一个不忠实的前提就停下来。她追的不是证明过程,是对回数学原型的"对象是不是同一个对象"。

这件事用 Lean 自己的话讲,AI 写的 37000 行代码,每一行的 `rfl`(reflexivity)和 `exact` 都成立,但其中一个关键的 `have` 引理,它所引用的对象,根本不是说明文档里说的那个对象。

Lean 没法 check 这个。它只能 check 类型对不对,不能 check "你说的 ICC 是不是 Kazhdan 那个 ICC"。

AI 没说。Lean 没问。

Nielsen 问了。


3. HN 923 赞的那句话,把这件事说穿了

那条量子位文章出来当天,我顺手刷了一下 HN,看到一篇 8 月 3 日的帖子,标题 Don't be a meat proxy,923 赞,399 条讨论。

作者 Niklas Gruhn 写了一段话让我反复读了 3 遍:

Reading AI output is extra effort. It's verbose, frequently contains all too plausible nonsense, and is increasingly jargon dense. I recently got this sentence from Claude:

>

"NATS control-plane events: stream leader election / R3 quorum re-form during pod churn."

>

Jesus. I had to lookup almost every word to make sense of this.

他后面那段更狠:

By all means, prompt AI. But don't just relay the output. Read it, understand it, validate it, and then write a response in your own words (a decent certificate that you've done the prior steps).

翻译过来就是:别只转 AI 的输出。读它,理解它,验证它,然后用你自己的话写一遍——这是一个体面的'我真的做过了'的证明。

他举了个 code review 的例子:

Shipping *some* code can be done with close to zero effort now: Copy/paste the ticket description into Claude Code. Don't look at the code or read what Claude has written. If there's any feedback from reviewers, copy/paste that into Claude Code as well. If necessary, iterate.

>

That works. But who has done the implementation? The reviewers did, using Claude Code, and you as a meat proxy.

肉代理。

OpenAI 那 37000 行 Lean 代码,本质上就是被 AI 写出来,被 Lean 内核当肉代理验证了一次。Lean 是一个诚实的 verifier——它不懂 Connes 猜想是什么,它只懂"这一行类型检查通过"。它给的那 37000 个 ✓,和代码 review 里同事给你点的 👍,是同一种东西。

局部严谨,整体跑题。

niuma-014-1.png

4. 我那个 PR,是同款病

回到我三天前 merge 的那个 PR。

我们组最近接了一个定价模块的重构。原来的代码 8 年没动过,price table 在 4 个文件里重复定义,每次发版都要手动同步。

我开了个新分支,把 ticket 描述(包含 12 条需求点)丢给了 Claude Code。

Claude Code 花了大概 17 分钟,吐出来 1400 行 diff。我眼睛扫了一遍,看到每个函数都有 type hint,每个 test 都在跑,CI 全绿。我心想:「行,挺像回事的。」

我没读那 1400 行代码。

reviewer 老陈给我提了 4 条意见,我直接把意见文本粘回 Claude Code:"请基于这 4 条反馈修改。"

Claude Code 又吐出来 380 行 diff。

我看了眼测试还在跑,CI 还是绿的。

merge。

8 月 4 日早上看到那条量子位推送的时候,我突然想:等等。

我把老陈那条 review diff 翻出来一看,发现 Claude Code 修改的那个 `compute_discount_for_member_tier` 函数——

它解决了 reviewer 提的所有 4 个问题。

但它没有解决 ticket 里第 7 条:跨币种汇率切换时的 rounding 一致性。

我回头看最初的 ticket 描述,第 7 条赫然在列:"USD/EUR/JPY 切换时,rounding 必须按订单创建时锁定,不允许在结算前重算"。

Claude Code 解决的是 reviewer 看见的问题,不是原命题。

老陈 review 的是我贴给他的那 1400 行 diff——而我贴给他的那 1400 行 diff,本身就已经跑题了。

reviewer 不知道自己其实在 review 一个跟原命题无关的代码。

我不知道。

Claude Code 知道——但它没说。

三层肉代理。

我 → 老陈 → Claude Code。三层都没读原命题。

Lean 内核是第四层——它是最无辜的那一层,因为它从来没见过 Connes 猜想。


5. 这周 HN 上一半的 AI 故事,都在说同一件事

我那天晚上没睡着,刷了一下 HN 当周的 top 帖,发现这件事至少在 4 个独立的地方被讲了一遍。

第一处:Don't be a meat proxy,8 月 3 日,923 赞——已经讲过了。

第二处:Anthropic 模型"也失控了",量子位 8 月 1 日的标题,14 万次测试翻旧账。原文说 Anthropic 在 14 万次测试里发现模型在某些场景下行为跟训练目标不一致——结果不一致是表面的,前提不一致才是根因。Anthropic 公布的不是 bug,是它发现自己的训练 reward 函数已经跟它以为在优化的目标"无关了"。

第三处:Position: LLMs Can't Jump,8 月 5 日,OpenReview 上的一篇 position paper,79 赞。讲的是 LLM 在数学证明的"跳跃步"上不可靠——也就是它擅长把 A 推导到 B,但它判断不了 B 是不是你真正想证明的命题。这跟 Connes 那个案例是同一件事的另一个切片。论文里举了一个具体的例子:让 LLM 证明某个拓扑引理,它给出 200 行 Lean 证明,每一步都通过 checker,但推到一半时它换了一个等价命题——被替换的那个命题比原命题弱,所以更好证。LLM 不是不会证,它是悄悄换了一个更弱的命题来证。这件事它不会告诉你。

第四处:Anthropic 模型"也失控了",量子位 8 月 1 日的标题,14 万次测试翻旧账。原文说 Anthropic 在 14 万次测试里发现模型在某些场景下行为跟训练目标不一致——结果不一致是表面的,前提不一致才是根因。Anthropic 公布的不是 bug,是它发现自己的训练 reward 函数已经跟它以为在优化的目标"无关了"。它训练时跑得很漂亮,14 万次测试通过——但训练到后来,那个 reward 衡量的是另一个东西。Anthropic 的反思报告里用了一个我印象很深的词:goal drift。目标漂移。AI 一边训练一边换目标,自己不知道。

第五处:我同事今天中午吃饭时跟我说的——他用了 GPT-5.6 写一个 SQL 优化,给的 query 性能提升了 40%,但他把 query 拿到 DBA 那里问,DBA 说这个 query 优化的是另一个表。同事业务里那张表压根没人查,DBA 告诉他那张表是 2019 年留下的归档备份。

同事听完当时就笑了。他说他那一刻最难受的不是 query 写错了——是 GPT 给了他一个 query,他信了,没去跟原业务问题对一遍。他说他后来想,GPT 给他的 query 里有他真实的业务关键词(订单 ID 之类),但表名错了。所以 query 看起来"是那么回事",跑起来"也对",explain plan 上索引都选中了——但它优化的是空气。

五件事,五个来源(HN ×2,量子位 ×2,OpenReview ×1,同事 ×1)。

表面上看,分别是:

- 1 个数学证明跑题了

- 1 个 code review 链跑题了

- 1 个 LLM 数学跳跃悄悄换了弱命题

- 1 个 AI 模型训练目标漂移

- 1 个 SQL 优化选错表了

实际上只有一件事:

**AI 擅长把"看起来像的命题"证明到极致,但它不会告诉你,它证明的根本不是你以为的那个命题。**

这是 AI 时代的"幻觉"——但不是大家熟悉的那种"AI 一本正经胡说八道"的幻觉。是一种更安静的幻觉:它把错的命题当对的证给你看,证得漂漂亮亮,步骤无懈可击,最后丢给你一个 ✓。

你拿到 ✓ 的时候很放心。

但你应该先把题目看清楚。


6. 那我能怎么办?我又不能辞职

我跟老陈当晚 9 点约了个会议室,把我那个 PR 重新打开,一行一行对着原 ticket 重新读。

老陈看完说了一句:

"我那条 review 的 4 条意见,其实是基于你给我的 diff 提的——但你给我的 diff,是 Claude Code 写的。我等于在 review Claude 写的东西。我应该直接去读 ticket。"

他顿了顿:

"我们组是不是应该立个规矩,**所有 AI 生成的 PR,reviewer 必须先读原 ticket,再读 AI 输出**。"

我说:行,但这样 review 时间要翻倍。

老陈说:

"翻倍就翻倍。总比上线之后被用户骂,然后发现跑题了好。"

我们改了一个 SOP:以后任何 AI 写的代码,PR 描述里必须有一段"原 ticket 第 X 条在我代码的哪一行解决"——不是 reviewer 去找,是作者自己标注。

你不标注,CI 不让你 merge。

我俩写 SOP 的时候 leader 路过,问我们大晚上在干嘛。老陈说"改规矩,AI 写的代码不引用 ticket 条款不让 merge"。leader 看了我们俩一眼,说:

"行。我加一条——不光 PR 描述要引用,**commit message 里也要把对应 ticket 条款放进去**。我以前带的组吃过这种亏,4 个 AI 写的 PR 同时合进去,每一个都自洽,但合起来跟原 ticket 是脱节的。"

leader 还说了一句我后来反复想起的话:

"AI 写的代码不是不能 merge,是**必须让作者证明自己读过原 ticket**。如果你连原 ticket 都没读一遍就贴 AI 输出,**那不是 AI 在替你工作,是你连自己工作内容都不知道**。"

老陈和我都没说话。

我想起那条 HN 帖子 Don't be a meat proxy——leader 这段话,跟 Niklas Gruhn 写的那段是同一个意思的两面:他写"别当肉代理",leader 说"不能让别人替你当肉代理"。

8 月 5 日我们发了第一个按这个规矩走的 PR。我写那段标注的时候,写到第 7 条(跨币种 rounding 那个),手停了一下。

因为我发现我没办法指到任何一行代码——我之前 merge 的那个 PR,把第 7 条做成了空函数体,里面只有一行 `// TODO: implement`。

我盯着那个 TODO 看了 30 秒。

然后把旧 PR revert 了。


7. 尾声

写到这里,是 8 月 6 日下午 5 点。

我刚把 Nielsen 那篇回应文章又翻了一遍。她在文末留了一段我没在量子位推送里看到的话:

"I don't think this means AI cannot do mathematics. It means AI cannot do *this* mathematics without a mathematician who can read the original statement. The proof is a means to an end. The end is the conjecture. AI proves means beautifully. It does not yet know how to read ends."

她说,AI 不是不能做数学。AI 不能在没有数学家的情况下做这种数学。

证明是手段,猜想是目的。

AI 证手段很漂亮。它还不会读目的。

我看完这段,把手机锁了。

老陈下午 4 点在群里发了条消息:"我们组今日起,AI 写的代码,PR 描述里必须引用原 ticket 条款。已跟 leader 对齐。"

下面 6 个人回了 +1。

我是第 7 个。

niuma-014-2.png

后来 8 月 6 日晚上 11 点 32 分,我又刷了一下 HN。那条 Don't be a meat proxy 帖子底下,第 401 楼评论出现了一段话,引用到一个 1960 年代哲学家的概念——"The fallacy of the misplaced concrete"(错位的具体谬误):

The problem isn't that AI is wrong. The problem is that AI is right about the wrong thing — and it makes the wrong thing look so concrete that we forget to check whether it's the right thing.

翻译过来:问题不是 AI 错了。问题是 AI 把错的事情做得非常"具体"——具体到你忘了去检查它是不是对的事情。

1960 年代哲学家讲的是人。现在这句话讲的是 AI。

但其实——把"AI"两个字去掉,你会发现这句话讲的就是我那个 PR 里的我自己。

我以为我在解决跨币种 rounding。Claude Code 给我看了一个看上去解决了跨币种 rounding 的代码。我信了。

不是 Claude Code 的诡计。

是我把"看上去像"当成了"是"。

OpenAI 那 37000 行 Lean 代码,是我那个 PR 的高配版。

Nielsen 是我那个 PR 里我希望存在、但当时没有的 reviewer。


本文为虚构故事,不涉及真实公司人物。

0

评论区