Skip to content

AI Coding 最贵的不是写代码,而是决定什么值得验证 ​

从 OpenAI 的数学突破,到 ETF Agent 几次真实的工程误判

AI Coding 正在让代码和候选答案变得越来越便宜,但可信的判断并不会随生成速度等比例增长。

我越来越觉得,工程师真正昂贵的能力,正在从“如何实现一个方案”,转向三个更重要的问题:

什么问题值得解决?什么假设必须被验证?什么程度的证据足以让我们作出决定?

这不是说人类要永远负责检查 AI 写出的每一行代码。恰恰相反,真正的进步应该是让机器承担越来越多能够自动验证的工作,把有限的专业判断留给那些真正决定系统价值与风险的地方。

最近两个月开发 ETF Agent 的经历,让我对这一点有了更深的认识。

一、当 AI 能够批量产生答案,我们真的更接近正确了吗? ​

2026 年 10 月,OpenAI 连续公布了大量 AI 生成的数学研究成果。

10 月 26 日,OpenAI 又发布了涉及 Kakeya 猜想、指数时间假设(ETH)和量子场论的研究成果。部分证明已经使用 Lean 进行形式化检查,但这些结果仍需要数学界进一步理解、审查和吸收。

在官方公告中,OpenAI 把模型生成的研究成果称为 Raw Research Data(原始研究数据),并邀请外部专家参与后续研究。

这个表述让我印象很深。

过去,一位数学家可能花费数年寻找一种证明方法。现在,AI 能够快速探索大量可能性,甚至生成复杂的完整证明。

但生成证明、检查形式化逻辑,与确认它证明了原本想证明的命题,仍然是不同的工作。

软件工程正在发生类似的变化。

Coding Agent 可以迅速实现功能、提出架构方案、补充测试,甚至让另一个 Agent 对实现进行评审。

原来因为开发成本太高而被放弃的想法,现在可能几个小时就能得到可运行的版本。

但我们是否因此更容易做出正确的技术决策?

最近两个月,我一直在集中使用 Agent 开发自己的 ETF Agent。随着功能越来越完整,我反而越来越明显地感受到一个变化:

我们越来越不缺少实现方案,却越来越需要判断一个看起来正确的方案,究竟有没有解决真正的问题。

而且,真正麻烦的往往不是 AI 生成了明显的错误。

是它生成了一个非常合理、甚至经过多项检查,却依然站不住脚的结论。

当生成答案越来越便宜时,识别关键假设、发现决定性反例,以及判断一个结果是否值得采用,就成了新的工程瓶颈。

二、一次真实投研:为什么报告完成了,结论却要撤回? ​

10 月 26 日,我们完成了一次 ETF Agent 的真实研究验证。

这次研究涉及后台执行、用户中途纠偏和并发对话。整个研究最终正常完成,原问题没有被其他短问题干扰,用户追加的要求也进入了后续模型请求。

从工程角度看,这是一次值得肯定的进展。

但人工复核最终报告时,我们发现模型根据两份文件的措辞,推断出一个结论:

某项跟踪约束比另一项严一倍。

这句话读起来很专业,甚至可能让人觉得模型进行了深入比较。

可问题是,原始材料并没有提供足够的同口径数据,来支持这个倍数判断。

两份文件描述了不同约束,不代表它们可以直接进行数量比较。

后续我们让 Agent 重新阅读一手文件,并撤回了这个推断。原始报告没有被悄悄覆盖,更正内容作为独立结果保存下来。

这次经历特别有代表性。

因为模型并不是没有查资料,也不是代码执行失败,更不是没有完成报告。

它真正出错的地方,是把两份材料中看起来可以比较的描述,变成了一个并没有得到证明的数量关系。

真正困难的是发现隐藏的前提 ​

假设一份基金报告说“严格控制跟踪误差”,另一份报告给出了某项偏离度上限。

模型可能很自然地把它们放在一起,试图比较哪一个管理得更严格。

但熟悉金融指标的人会先问:它们是不是同一个指标?计算周期一样吗?一个是目标值,还是实际观测结果?

如果这些前提尚未确定,后面的计算再精确,也无法证明比较结论成立。

我们此前的持仓周报开发中,也遇到过类似问题:模型把子集收益率和全组合贡献百分点相互比较,甚至因为数值不同就怀疑供应商数据错误。

后来我们没有为这些错误额外建立一个万能的金融语义校验器,而是调整已有的金融研究指导,让模型先核对对象、时间窗口、分母和计算方法,再进行比较。

对于缺乏可比条件的资料,允许保留未知,而不是强行得出结论。

这项调整有过限定范围的真实模型验证,但没有因此宣布所有金融解释问题都已经解决。

这件事给我的启发是:

当 AI 给出一个结论时,先不要急着检查计算过程,应该先检查它用来推理的前提是否成立。

对于金融、医疗、法律等领域,这一点尤其重要。

有时候,真正昂贵的不是重新算一遍,而是知道哪些东西根本不应该放在一起计算。

三、再增加一个 Reviewer,真的能解决问题吗? ​

面对这种错误,最直观的工程方案是增加独立 Reviewer。

让一个 Agent 写报告,另一个 Agent 找错误。还不放心,就再增加几个专家,从不同角度讨论。

这当然可能有效。

但我们在 ETF Agent 中踩过另一个很有意思的坑。

10 月 18 日,我们在 Research Reviewer 的受控集成验证中发现:主 Agent 已经读取了完整资料,但传给 Reviewer 的摘要省略了重要的比较日期。

Reviewer 本身有独立上下文,也拥有读取原始结果的能力。

问题是,实际交接过程中,系统虽然调用了原始资料读取工具,却没有把读取出的完整材料交给 Reviewer,最终送进去的仍然是那份不完整的摘要。

换句话说:

我们建立了一个看起来独立的审查者,却没有真正为它提供独立审查所需要的信息。

如果 Reviewer 和原 Agent 都依赖同一份遗漏关键条件的摘要,即使它们给出一致意见,这种一致也不代表结论经过了充分验证。

后来我们的修复很简单:让原来已经读取且获准使用的材料真正进入 Reviewer 的输入,而不是重新发明一套数据获取和验证系统。

这次改动解决的是原始资料交接问题,不能直接推导为 Reviewer 的真实语义判断能力已经提高。

但它改变了我们对“验证是否有效”的理解。

过去,我们可能会问:

Reviewer 有没有调用成功?有没有输出评审意见?

现在,我们还需要问:

Reviewer 到底看到了什么?它有没有机会发现我们真正担心的那种错误?

这是两个完全不同的问题。

为什么我们后来没有让所有研究都强制经过 Reviewer? ​

10 月 21 日,我们又将引用与金融语义的事后评审设计为一种独立、按需使用的能力。

普通研究不必默认增加一轮审查。需要进一步复核时,可以针对一份明确的报告和原始材料,生成独立的评审结果。

评审可以指出疑点,却不直接修改原报告,也不自动取得发布和投资决策的权限。

这里其实有一个很现实的取舍。

如果用户只是查询某只基金的管理费,原始资料清楚、字段明确,增加多轮模型评审未必能带来相称的收益。

但如果 Agent 正在比较两个复杂的投资方案,并且其中某项结论会明显影响用户的资产配置,那么进一步复核关键假设就可能值得投入。

不是验证越多越好,而是验证需要与不确定性、错误代价和实际用途相匹配。

好的验证体系,不应该要求所有正常任务都证明自己绝对正确,而应该能够识别哪些判断真正值得额外检查。

四、但也不是所有验证,都应该交给人类 ​

讨论到这里,很容易得出另一个极端结论:

AI 负责写代码,人类负责验证。

我并不赞同把它理解成一种永久分工。

因为验证能力本身也在被 AI 和自动化技术不断提高。

我们在 ETF Agent 的金融计算中,就遇到过一个很具体的例子。

对于一笔假设费用,137 元乘以 1.5% 的精确结果是 2.055 元。按照约定的舍入规则,应当得到 2.06 元。

但受控测试发现,旧的浮点计算路径曾经得到 2.05 元。

这类问题并不需要一个金融专家逐笔审核,也不需要调用更聪明的大模型重新判断。

我们需要做的是明确金额精度与舍入规则,让原始计算模块采用正确的十进制处理方式,再通过确定性测试检查。

这与前面的“跟踪约束严一倍”有本质区别。

一个问题已经有明确的数学规则,另一个问题连比较是否成立都需要判断。

如果一律使用 Reviewer,前者可能浪费成本,后者也不一定得到可靠结论。

真正合理的做法,是让容易形式化的正确性尽量交给机器,让有限的专业判断集中在难以直接形式化的问题上。

这也不是说金融语义永远只能由人处理。模型已经可以帮助提出反例、检查材料和识别不一致。

只是我们不能因为它能够给出审查意见,就把意见自动当成已经得到证明的事实。

五、对研发和架构师来说,工作方式应该怎样改变? ​

经历这些问题之后,我越来越倾向于改变 Code Review 和架构评审的起点。

过去,我们经常先看一个改动实现了什么,有哪些代码变化,补充了多少测试。

这些仍然重要。

但 AI Coding 时代,可以把更早的一步做得更明确。

先问:我们到底在证明什么? ​

比如一次需求叫“优化 Reviewer 的资料交接”。

这个说法太宽泛了。

换一种表达:

“Reviewer 在评估两份材料是否可比之前,必须实际收到原始比较日期。”

这样一来,真正值得验证的行为就清楚了。

我们不需要先写几十项检查,也不需要把完整研究重复运行很多次。

先构造一个摘要遗漏日期、但原始资料包含日期的场景,检查 Reviewer 实际收到的内容,就能直接检验这次修改的关键假设。

再问:什么反例能推翻这个方案? ​

这是我认为 Coding Agent 非常适合参与的一步。

人可以提出设计目标,Agent 则可以帮助寻找边界条件、生成反例、探索不同输入,甚至给出与当前方案相反的建议。

如果一个架构方案声称“多个 Reviewer 可以提高研究可信度”,我们就可以主动追问:

如果所有 Reviewer 都看到同一份错误摘要,会怎样?

如果它们引用了同一个过期来源,会怎样?

如果 Reviewer 无法取得关键原文,它会承认材料不足,还是继续生成自信的评审?

这些反例比简单要求 Agent “充分考虑各种情况”更有价值。

因为它们直接挑战方案赖以成立的前提。

最后问:证据到什么程度,就值得作出决定? ​

有些问题可以通过确定性测试直接解决。

有些问题需要在真实模型和相同输入条件下做对照。

还有些问题,例如某项投资分析是否足以支持具体行动,必须结合真实业务约束、风险和责任要求。

这三类验证不需要采用同一套标准。

真正重要的是知道:我们当前做出的决定,会产生什么后果?现有证据是否足以承担那个后果?

对一项低风险、可回退的内部研究功能,可以允许有限不确定性。

涉及资金执行、访问权限等高后果操作时,则必须保留明确的授权和执行保护,不能由模型一句“已经验证”来代替。

成熟的工程判断,不是要求所有事情都被验证到没有疑问,而是知道哪些疑问可以接受,哪些疑问必须在行动之前解决。

六、AI Coding 真正昂贵的,是判断力与验证资源 ​

回到 OpenAI 最近的数学研究。

最让我受到启发的,不是 AI 生成了多少份证明,而是这些成果已经多到值得认真思考:应该怎样组织研究人员理解它们、核查关键假设,并把有价值的部分转化为可以继续使用的知识。

软件工程可能也会经历这样的变化。

以前,很多好的想法因为实现成本太高而没有机会验证。现在,我们可以快速得到越来越多的候选方案,但每一个方案都可能携带尚未发现的假设,也可能需要新的验证工作。

当答案的生产速度超过理解和判断的速度,继续提高代码产量,未必能让团队同比例地提高交付质量。

最近两个月 ETF Agent 的开发经历,让这个问题变得非常具体。

一份已经完成的金融报告,因为比较前提不成立而需要撤回结论;一个看起来独立的 Reviewer,因为缺少原始材料而失去了有效审查的基础;而一个精确计算错误,却可以在明确规则后交给确定性程序解决,根本不需要增加模型评审。

它们带来的启发是一致的:

不是所有问题都值得增加一层 AI,不是所有错误都需要更多测试,也不是所有正确性都必须依赖人的判断。

真正重要的是找到正确的验证方式,并让验证成本与问题的重要程度相匹配。

我认为,AI Coding 时代,工程师和架构师尤其需要把注意力放在三个地方。

第一,定义什么才算正确。 不只是把需求写成任务,而是识别业务目标、隐藏假设和必须保护的行为。一个比较是否成立,往往比比较公式是否算对更重要。

第二,知道怎样有效地推翻错误方案。 与其让 AI 不断生成支持现有设计的论据,不如让它寻找决定性反例。一个能够暴露关键错误的反例,可能比大量没有触及核心假设的测试更有价值。

第三,决定验证资源应该投入到哪里。 能用确定性方法解决的,交给工具;依赖复杂语义的,结合原始材料与独立审查;涉及资金、权限等高后果操作的,保留必要的授权、保护和责任机制。

这并不是让人类永远成为 AI 的最终裁判。

恰恰相反,随着模型、形式化方法和自动化技术进步,人类需要亲自完成的验证工作也会逐渐减少。

但只要软件系统仍然服务于现实中的用户和业务,就必须有人或一套具有明确责任的机制,决定我们究竟要实现什么、什么风险可以接受,以及什么时候值得采取行动。

AI Coding 降低了产生方案的成本,却不会自动降低作出错误决定的代价。

所以,未来优秀工程师的竞争力,可能越来越不体现在他能够亲自编写多少代码,而在于他能够让多少有价值的判断,被准确表达、有效验证,并最终转化为可靠的系统能力。

我们不应该再把研发效率简单理解成单位时间内生成多少代码、完成多少 PR,或者运行多少次测试。

真正值得追求的,是用更少的无效验证、更清晰的判断和更可靠的决策,持续解决更重要的问题。

当代码和答案越来越便宜,最昂贵的不是继续生产更多答案,而是能够回答:

什么值得做,什么值得怀疑,以及凭什么相信我们已经做对了。

这才是我认为 AI Coding 时代,软件工程能力真正需要升级的方向。


延伸阅读 ​

更多工程实践见 ETF Agent Engineering Notes。欢迎 Star 或分享能够挑战这些判断的工程反例。

与个人博客并行:这里按问题连续阅读,博客保留时间线。 · 联系邮箱:hpoenixf@foxmail.com · 微信:hpoenixf0510