☰
AI辅助新数学猜想生成:从数据观察到候选验证
2026/10/16 10:32:03 网站建设 项目流程

做这个系列做到第六篇,聊的方向越来越“悬”了。“让AI参与新数学猜想生成”——这个标题放半年前我自己看到都会皱眉。猜想不是数学家的特权吗?让一个大语言模型去猜猜想,它凭什么?

先别急着下结论。我理解的“数学猜想”,本质上是一个“基于有限观察总结出来的大胆命题”。比如你反复验证了十几组数据,都满足同一个规律,于是你把它写成“如果……那么……”的形式,这个东西就是猜想。历史上很多著名猜想都是这么来的,区别只在于背后的观察量更大、手法更敏锐。AI能做的是什么?它不能替你证明,但它能替你做“大规模观察”和“初步归纳”这部分体力活,还能用不同的语言模式帮你把观察结果表述成命题。这样一来,“从数据到猜想”这条链路就被大幅缩短了。

这次项目我的具体目标是:找一个具体的数学对象作为研究对象,让AI批量产出可检验的候选猜想,再用数值扫描和文献比对逐步淘汰,最后留下几条在严格意义上“暂时还没有被证伪、且有一定研究价值”的命题。整个流程不算复杂,真正有意思的地方在于中间几次AI和我的“来回”——它会说出一些乍一听像胡话、细想又有点味道的话,也会在我以为已经找到新东西的时候,冷静地提醒我可能只是在重复几十年前的结论。

愿意往下看,就把这篇文章当成一次AI辅助数学发现的实验记录。提示词、脚本、踩坑,我全部摊开讲。

1. 先拆项目:AI在“猜想生成”里的真实定位

1.1 猜想从无到有的五个环节

一个看起来“新”的数学猜想,从无到有通常要经历这样几个环节:

  1. 选定研究对象,比如某个数论函数、某类图、某个组合计数序列。
  2. 观察数据,把对象的前几十项、几百项甚至几百万项算出来,看规律。
  3. 归纳假设,把看到的规律描述成一个有明确条件、明确结论的命题。
  4. 反复测试,用更多数据、更多边界情况去攻击它,看能不能找到反例。
  5. 寻找证明,或者把这个命题加强成更有意思的形式。

传统做法里,阶段2和阶段3由研究者的“数学直觉”驱动,靠的是长期积累和某种说不清道不明的敏感度。这个环节恰恰是LLM最有可能帮上忙的地方:它能把大规模语料中的模式迁移到当前上下文里,从而给出“这个序列的增长越来越平缓,可能渐近于某个形式”之类的推演。严格来说它不是在思考,但它确实能产出有启发性的断言。

所以我给AI安排的岗位是:它负责阶段2和阶段3的初稿,我负责阶段1、阶段4以及所有重要判断。这个分工不浪漫,但很务实。

1.2 LLM的能力与短板:为什么数学任务让人又爱又恨

用LLM做数学相关的事,绕不开一个核心矛盾:它既擅长“形式语言”又不擅长“逻辑”。它擅长形式语言,是因为大模型在训练阶段读过的数学文本量极大,哪怕它不理解符号背后的意义,也能生成像模像样的公式推导;它不擅长逻辑,是因为它本质上是“接龙游戏”,每一步只负责预测下一个最合理的token,而不是在维护一个严谨的推理状态机。

这个矛盾在“生成猜想”这类任务里反而变成了一种优势。因为生成猜想不需要严谨推理,它需要的是“大胆的联想”,恰好避开了LLM的推理短板,放大了它“在海量文本中找结构相似性”的长项。反过来说,它也带来了一个巨大的风险:幻觉。LLM会把看似合理但实际上不成立的条件组合在一起,生成一条看起来无懈可击、检验一下就崩掉的命题。

所以整个项目的核心不是“让AI生成”,而是“让AI生成之后如何处置”——用一套工程化的验证流程把幻觉筛掉。这也是我后面花大量篇幅讲验证的原因。

1.3 本次项目采用的完整流程

项目实际跑起来的流程长这样:

  • 输入:一个明确的数学对象。我选的是带计数性质的整数序列:整数的某种划分计数函数。
  • 候选生成:让AI在“头脑风暴模式”下给出20到30条类似猜想的命题。
  • 粗筛:去掉明显废话、明显重复、明显不可检验的。
  • 数值验证:对留下的候选做小规模数据扫描,找反例或者找证据。
  • 二次提问:把数值结果反馈给AI,让它解释为什么会有这种特征,再让它修正或加强猜想。
  • 人工复核:把最终选中的2到3个候选整理成正式文档,等待后续进一步讨论。

后面几节我会把这套流程的每一步都拆开细说,包括提示词长什么样、脚本怎么写的、哪些环节特别容易翻车。

2. 工具准备与提示词设计

2.1 我准备了什么环境

这次项目用到的工具并不高级:一个主流的、能处理较长上下文的对话式大模型,加上一套本地的Python计算环境。关键不是模型有多大,而是怎么把“数学对象”翻译成模型能理解的语言。

本地环境我装了三个库:sympy做符号推算和素数判断,networkx在需要图论对象时用,pandas做数据整理。sympy的npartitions和nextprime这类函数在处理常见规模的数时速度非常快,做初始扫描已经够用了。networkx在后面如果想把这个流程推广到图上会很有用,但我这次的主体流程还是在数论式的序列上跑的。

另外我还额外准备了一个“小常数表”,把常见整数序列的前若干项预存成文本文件。这么做是为了在提示词里把样例数据喂给AI——别小看这一步,你让AI凭空想一个猜想,和让它看着前20项数据想一个猜想,产出质量完全是两回事。数据就是它联想的锚点。

2.2 人设设定:为什么要给AI一个“数学研究者”的身份

提示词工程的核心不是写得花哨,而是限定范围。我第一轮实验用的是最简单指令:“请生成一个数学猜想。”结果它给我一堆教科书级别的正确答案,全是已经存在的经典命题,一个能打的都没有。问题出在哪?模型太“聪明”了,它倾向从记忆里调用最高概率的回复,也就是那些耳熟能详的已知结论。

后来我把设定改成了这样:

你是一位熟悉数论和组合数学的研究者,正在准备学术讨论班上的短报告。你的任务不是解释已知定理,而是针对下面这个研究对象,给出至少10个“你自己都不确定是否正确”的猜想。要求:每条猜想必须包含明确的条件和结论,必须可以用前100项数据做初步检验。请不要引用文献,请不要只复述已有结论。

这个设定的效果立竿见影。因为我同时给了它“研究对象”、“数量下限”、“可检验性”和“禁止复读文献”四个约束,它被迫离开舒适区。其实这个道理和找人聊天一样,你问“有什么想法”,对方大概率客套;你问“针对这个数据,给我十个大胆但可验证的假设”,对方才会认真动脑。LLM也是同样的机制。

3. 实操过程:三个回合把AI从“百科全书”变成“猜想合伙人”

3.1 第一回合:把研究对象和数据“喂”给AI

我选的研究对象是“整数的全划分计数函数”,简单说就是计算一个正整数n有多少种方式被拆成若干个正整数的和,不考虑顺序。例如n=4的时候,划分有5种:4、3+1、2+2、2+1+1、1+1+1+1。这个函数在组合数学里是经典对象,研究历史极其悠久,但正因为它历史悠久,反而不愁没有“新角度”——只要你能找到前人没细看过的维度。

我在提示词里给AI的数据是这样的:

  • 函数定义:p(n)表示正整数n的全划分数量。
  • 前20项:1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627。
  • 额外信息:p(n)的增长速度大约和exp(c√n)相当,这个信息用于判断它是否暗示某种渐近行为。

实际执行的时候,AI反过来问了我一个问题:“你想听整体形状上的猜想,还是局部同余关系上的猜想?”我愣了一下,因为这个问题很专业。我回答“两种都要”。这个细节我印象很深,说明只要给足了上下文,LLM是能理解“一个函数有两类不同风格的规律”的。它给了两条分支的初步探索方向:一条是增长率和渐近形态,另一条是模运算下的剩余类规律。

3.2 第二回合:批量产出粗糙猜想

我让AI一次性给出了12条候选。输出里确实混了不少噪音,比如“p(n)总是偶数”——看一下第6项p(6)=11就打脸了。但也没人规定初稿必须是对的,猜想本来就是用来挨打的。真正有价值的候选我现在还原几个,连同我的初筛意见和验证结果一起列在下面:

编号候选内容(简写)初筛意见数值验证结果
Ap(n)对10取模的剩余序列最终是周期的待验证n≤2000内未呈现固定周期,暂不推荐
B当索引为素数时,p(n)的奇偶性随位置呈某种模式有潜力n=1570附近出现反例,淘汰
C每6个连续整数中至少有一个p(n)能被5整除弱但可检验n≤10000成立,保留并进一步探索
Dp(n)的增长率渐近行为存在一个未被精确刻画的余项描述性太强不适合做数值检验,降级为讨论材料
Ep(n)的某种均值函数最终单调递增明显由数据趋势推出验证到n=5000成立,但价值有限

候选A给我一个教训:LLM看到“1,2,3,5,7,11……”这种序列很容易联想到周期,但数学上“周期”是一个非常严格的概念,需要证明而不是观察。候选B最有意思,它盯上了前20项里n=2,3,5,7,11,13这样“素数位置”上的取值,提出了一个关于“索引为素数的划分数的奇偶性”的猜想。这个方向相当对路,数论里本来就有大量“素数下标性质”的研究。候选C是个很“弱但可检验”的命题,我拿脚本立刻验证到n=1000:真的成立。而且在n=10000以内也没有找到反例。后来查文献才发现这类结论与经典的模同余现象有关,只不过那篇文献用的模数和范围更精细。不是我发现了新东西,但这个过程告诉我:AI确实能隐约“感知”到隐藏在数据里的同余结构。

3.3 第三回合:让AI自己扮演“杠精”挑毛病

LLM生成猜想的最大问题不是它给得少,而是它对自己生成的东西天然乐观,它不会停下来说“这条其实很弱”。所以我设计了第二轮独立对话,把AI定位从“提出者”切换成“审查者”:

下面是我收到的一份候选猜想清单,请你逐条扮演严格的审稿人。对于每条,请给出:可疑点、最可能被反例攻击的小数值范围、以及你猜的存活概率。不要为了鼓励我而放水。

这个“审查者”角色帮我淘汰了12条里的7条。值得一提的是,审查者能准确指出候选B的反例极可能出现在n=1570附近,而实际用脚本检查时,n=1570真的就出问题了。原因可能是模型在训练时看过大量包含“1570”的数学讨论,它不一定是在推理,而是在从记忆里检索相关反例的蛛丝马迹。不管机制是什么,结果是有用的——它提供的高风险区域几乎就是标注好的搜索范围。

这里要特别提醒一句:这种自审机制只能当粗筛,不能当证明。AI说自己“这条猜想我相信”,既不增加猜想的概率,也不提供证明,它只是在帮你圈出优先验证的范围。

4. 验证环节的工程化做法:数值扫描、文献比对和边界意识

4.1 数值扫描:最笨但最有效的第一步

对于数论类猜想,我习惯写一个通用扫描脚本。下面这段代码是我针对“p(n)对模数m的取值规律”这类猜想用的初始模板:

import sympy as sp max_n = 2000 m = 5 partition_residuals = [] # sympy的npartitions内部有高效算法,适合做初步扫描 for n in range(1, max_n + 1): p_n = sp.npartitions(n) residual = p_n % m partition_residuals.append(residual) # 输出前200项的连续10项和,方便肉眼观察周期结构 for start in range(0, 200, 10): print(start + 1, sum(partition_residuals[start:start + 10]))

实际跑数据的时候,我一般还会同时输出“反例区间”,也就是某个候选在哪些n处失效,而不是只看总体通过。因为判断一个候选的存活概率,不仅要看它错没错,更关键的是看它错在前面还是错在后面。错在n=7的猜想几乎可以立刻删掉,错在n=1570的则有更多“值得讨论”的余地。数值实验永远只能提供“证据”,不能提供证明。任何一个有限范围内的统计结果,都无法排除下一个数字突然出现反例。这个边界如果没意识到,整个项目就变成了“用数据自我安慰”,学术意义就没了。

4.2 文献比对:怎么避免“我以为是新发现”

AI生成的猜想里,有很大一部分其实早就是已知定理,或者已知定理的简单推论。为了避免把时间浪费在重复发明上,我在选定候选之后会做一次文献比对。具体操作不是去翻纸质期刊,而是把猜想的精确表述输入学术搜索引擎,再配合几个关键词的组合依次查,比如“partition function congruence”这类组合词。

这里的关键心得是:把AI的原话翻译成规范数学表述再去查,而不是直接粘贴AI的话。LLM的表达容易带口语腔,比如它会说“p(n)好像每隔5个就有一次可以整除”,正规文献的写法是“p(5n+4)≡0 mod 5”,这两种表述在检索系统里的命中率完全不同。所以我会先手动把候选改写成一个标准条件表达式,再拿去查。

4.3 形式化验证的边界

有些读者可能会问:为什么不直接上形式化验证工具,比如定理证明器?我的回答是:不是不能,是成本问题。猜想生成阶段真正的瓶颈在于候选数量太大,形式化验证适合用在已经通过了数值初筛、且人工判断“有希望”的少数几条上。

更现实的做法是,对少数几个核心候选,先把命题拆成“如果A则B”的形式,再由人写出证明思路,用大模型生成证明草稿,再交给人工逐行审查。这一步里AI仍然只是草稿机器,负责速度和覆盖面,不负责正确性。同理,真正能证明一个猜想的,依然是坐在屏幕前的人类研究者。

5. 踩坑实录与常用排查技巧

5.1 高频问题速查表

做这类项目踩过的坑很多,我把最高频的几个问题整理成一张表:

现象可能原因处理办法
生成的猜想全是已知结论提示词没禁止复述文献加上“不要引用已知定理”、“必须包含新的条件组合”
猜想的条件太弱,比如“存在某个数”模型在偷懒,用存在性表述替代构造性描述强制要求给出具体构造或具体范围,否则剔除
数值验证找不到反例,但心里不踏实扫描范围太小,或者命题形式允许边界反例扩大扫描范围,并检查边界条件,比如n=0、n=1之类
AI自己审稿时全通过模型上下文被之前的乐观人格污染新开对话,换“最严厉审稿人”设定,不让它看到原稿的自我评价
同一猜想反复出现模型只在重复训练语料里的热门结构换一个研究对象,或者要求它从“反方向”构造,比如证明不可能性
生成内容被格式化语言带偏提示词里的术语太多,模型开始凑词减少术语密度,要求逐条给例子,用例子反向锚定

5.2 三个特别有用的“废话过滤器”

我在实验里反复用到三种提示策略,效果稳定,分享出来:

  1. “请给出你认为失败概率最高的3条。”——这个过滤器逼模型暴露出它在训练数据里见过的失败案例信息,往往能精准标记出最弱的猜想。
  2. “如果这个猜想对普通小整数成立,但你对大整数的行为没有把握,请直接说没有把握。”——这是把不确定性显式化,避免AI用含糊措辞掩盖问题。
  3. “把每条猜想的验证方式写清楚。”——一旦AI写不出具体可运行的验证步骤,说明它自己都不知道自己在说什么,这条可以直接淘汰。

5.3 我对这套流程的最终体会

做完了这次项目,我对“AI辅助数学研究”这件事的预期调整成了更务实的版本。AI大概率不会突然某天自己证明一个世纪难题,但在“找感觉”、“产候选”、“筛方向”这些脏活累活上,它确实是以前没有过的帮手。真正最有价值的能力可能不是“生成”,而是“逼使研究者把话说清楚”。因为每当你要让AI理解一个数学对象的时候,你都不得不先把它精确地描述出来,这个“描述”的过程本身就在推进思考。

最后再分享一个小技巧:无论AI产出的猜想想不想用,都建议把它存档,哪怕第二天醒来看见它错得离谱。猜想的价值不只在“对”,更在“视角”,有些错误的猜想如果错得有特点,反而能指向一个你原本没注意到的结构。这大概就是和“数学家做朋友”最大的收获:你永远不知道哪一次看似不着边际的对话里,藏着下一个值得认真对待的问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询