过去一年里,我越来越频繁地听到一个问题:LLM 能不能帮我们做真正的数学研究?这个问题看上去很具体,实际上问得很含糊。有的人把 LLM 当作超级计算器,希望它能证明一个大定理;有的人把它当成高级搜索引擎,期望它快速给出几篇文献。但这些期待大多落空了。真正让 LLM 在数学发展中产生价值的,不是让它当一个万能解题器,而是把它嵌入到探索、验证、沟通这条完整工作流里。
数学研究不是只有一个“证明”动作。它有大量的尝试、否定、修正、抽象和复盘。LLM 真正适合切入的,是那些“语言密度高、形式验证成本低、反复试错收益大”的环节。如果把位置放对了,它真的能加速一些长期卡住的问题;如果放错了,得到的只是一堆看起来合理但没法用的话。
这篇文章想做的事情很简单:把 LLM 在数学发展中的几个典型用法拆开,讲清楚它们背后的逻辑,再给出一个可以复用的接入流程。我不会把 LLM 说成“自动证明神器”,也不是来泼冷水。我更想说的是,怎么把它当成一个有一定判断力的协作者,而不是只会接话的聊天框。
1. LLM 在数学环节里真正改变的是“探索-验证”闭环
1.1 数学工作流里,哪些环节适合让 LLM 介入
先拆一下数学研究过程中的常见环节。不是所有数学研究都一样,但多数工作会经过四个阶段:
- 探索阶段:发现模式、猜想关系、构造例子。
- 证明阶段:把猜想变成严格论证,填补推理细节。
- 验证阶段:检查证明是否成立、是否有反例、边界条件是否覆盖。
- 沟通阶段:把结果写成能让同行理解的形式,或者转成可计算程序。
过去几年,符号计算系统和证明助手分别覆盖了验证阶段的一小部分。而 LLM 的特殊之处在于,它几乎能在所有阶段生成“候选内容”,尽管质量参差不齐。
真正适合 LLM 介入的不是“给出最终正确答案”的环节,而是“生成一个可以被快速验证和修正的候选”的环节。比如,探索阶段让 LLM 根据几个例子猜一个通项;证明阶段让 LLM 把一段不完整的草稿扩写成标准推导;验证阶段让 LLM 构造边界反例;沟通阶段让 LLM 把复杂证明翻译成更易读的叙述。
这四个场景有一个共同点:输出不是终点,而是需要后续人机协作去核对、修正、确认的中间产物。所以 LLM 在数学里的价值,不在于“一次答对”,而在于“用低成本的错误替代了高成本的空白”。
1.2 LLM 和计算工具的分工:不要拿它当计算器
很多人一开始用 LLM 做数学,会直接问“这个积分等于多少”“这个级数是否收敛”。这其实是拿语言模型去干符号计算引擎或数值计算的活,结果往往不稳定。
LLM 内部没有内置的数学解释器。它本质上是根据大量文本学习到的词元分布来做预测。面对一个具体算式时,它可能会背诵出训练语料里出现过的常见答案,也可能会组合出全新但错误的结果。这不是它的强项,也没有必要让它去和 Wolfram Alpha、SymPy 或 Mathematica 竞争。
更合理分工是:
| 任务 | 适合工具 | 说明 |
|---|---|---|
| 精确计算、化简、积分、方程求解 | 符号计算系统 | 结果是确定性的,公式可验证 |
| 从例子猜规律、断言一个可能的结构 | LLM | 提供候选,再用符号系统验证 |
| 把自然语言证明转换成形式化的逻辑步骤 | LLM + 证明助手 | LLM 补中间推导,证明助手检查合法性 |
| 搜索反例、边界检查 | LLM + 数值计算 | LLM 生成候选反例,数值计算快速排除或确认 |
这个分工不是绝对,但能避免很多挫败感。LLM 更擅长的是“语言化地操作数学概念”,而不是“机械式地执行数学运算”。数学概念之间的联系、证明策略的选择、表述方式的调整,这些才是它能发力的地方。
1.3 可以落地的三类具体任务
如果把范围再缩小,我会建议从这三类任务开始尝试。
第一类是候选公式和通项的发现。给你前几项,让 LLM 猜一个通项公式,然后用归纳法或符号计算去验证。这比手工硬凑效率高很多,尤其数值序列里的非线性结构往往并不直观。
第二类是证明草稿的补全和翻译。把一个高层次证明思路写成几个 bullet point,让 LLM 展开成逐步推理,或者反过来把冗长的证明压缩成直觉路线图。关键是每步都要能被人或工具检查,不能真的只靠“感觉”。
第三类是和证明助手的交互。Lean、Coq 这类形式化验证工具把“证明”变成一种可被机器检查的语言。LLM 可以被用来生成 tactic 序列、补全缺失的中间状态、解释某个证明状态的含义。这是目前最接近“直接加速数学发展”的用法,因为它不要求模型输出绝对正确,只要求模型输出足够接近正确,剩下的由机器来验证。
这不是说 LLM 已经像数学家一样思考。它还达不到。但它是第一个能把自然语言数学直觉和机器可验证逻辑连接起来的辅助工具,这一点非常关键。
2. 几个具体场景:从构造、反例到形式化验证
2.1 让 LLM 参与构造与猜测:从“空想”到“候选池”
数学里有很多需要“猜”的时刻。一个数列的前五项是 1, 4, 9, 16, 25,多数人会猜 n²。但如果是 1, 2, 4, 8, 16,就有无限多种可能,比如 n 次多项式、组合数、递推关系,甚至是某个特殊函数在整数点的取值。真正的困难不是验证一个候选对不对,而是提供一个值得验证的候选。
LLM 在这里能做的是生成一个多样化的候选集合。可以给它一个提示:已知前几项,请给出十种不同的通项公式,分别对应多项式、指数、组合、递推等不同模式。它不是只会给一种标准答案,而是能在训练语料的关联里找出若干可能的模式。虽然大部分候选会被后续计算排除,但剩下的那个可能就是突破口。
这类任务适合用程序批量调用,不适合在对话界面里一条条提问。更高效的做法是构造一个小脚本,把多项式和符号验证串起来:LLM 生成候选,SymPy 验证,输出保留所有匹配的形式。这就是一个最小闭环。
# 这是一个示例结构,展示 LLM 生成候选项后,用 SymPy 做初步验证的思路 import sympy as sp n = sp.symbols('n', integer=True, positive=True) sequence = [1, 4, 9, 16, 25] candidates = [ n**2, n**3 - 3*n**2 + 3*n, 2**n - 1, sp.factorial(n) / sp.factorial(n-2) / 2 ] for expr in candidates: values = [sp.simplify(expr.subs(n, i)) for i in range(1, 6)] if [int(v) for v in values] == sequence: print(f"匹配候选: {expr}") else: print(f"不匹配: {expr}")这个流程看起来简单,但很能说明问题:LLM 不是答案来源,而是假设来源。真正的裁判是确定性的符号计算或归纳证明。这种方法也很容易扩展到差分方程、组合恒等式、数论序列等方向。
2.2 用 LLM 生成反例和边界测试:让错误早一点暴露
数学证明里最容易漏掉的是边界情况。比如一个不等式是否对零、负数、非整数、无穷区间成立;一个定理在去掉某个条件后是否仍然成立。手工构造反例经常是从经验出发,但有时候问题所在的方向根本不是常见思路能覆盖的。
LLM 可以为这类搜索提供“另类”起点。你可以把一个定理的条件和结论告诉它,请它列出所有可能的边界情况,或者故意让它猜测某些放宽条件后的结果。它生成的反例不一定正确,但可以作为候选进入验证流程。
这里的关键是把反例生成变成批量化操作。比如用 Python 控制一个数学脚本,让 LLM 给出若干参数组合,每个参数组合再交给一个更精确的数值验证函数去跑。数值验证不能替代证明,但可以快速排除大量无效方向,保留值得深入挖掘的反例。
# 通用思路:先让 LLM 产生候选参数,再用精确算法判断是否构成反例 def candidate_counterexamples(proposition_text, count=20): # 调用 LLM API 生成候选条件的代码结构 # 这里不涉及具体 API,只展示数据流 import random if random.random() < 0.01: # 避免直接复刻任何真实 API pass return [ {"a": 1, "b": 2}, {"a": -1, "b": 3}, {"a": 0, "b": 0} ] def verify(candidate): # 用精确运算或已知定理判断是否成反例 return False for candidate in candidate_counterexamples("对于任意实数 a <= b,命题 P 成立"): if verify(candidate): print("找到反例", candidate) break这与直接用搜索引擎找反例不同。搜索引擎只能返回已经记录过的结果,而 LLM 能组合出未见过的参数组合,虽然也伴随着幻觉风险。所以重点是“生成候选”和“验证”必须拆开,不能让验证也依赖模型本身。
2.3 在 Lean 等证明助手里当“副驾驶”:让机器检查每一小步
如果 LLM 在数学发展中真有“颠覆性”的时刻,我个人判断,最接近这个描述的是它与形式化证明助手的结合。
Lean、Coq 这类工具要求你把证明拆成人类难以忍受的细致步骤,每一步都会被内核检查。它们的优势是绝对可靠,缺点是入门门槛高、书写成本高。很多数学直觉明明是对的,但把它翻译成证明助手的语法后,人很容易迷失在一堆 tactic 的细小选择里。
这时候 LLM 可以充当翻译器和补全器。比如你面对一个证明状态,目标是证明a * b = b * a,你可以让 LLM 提议下一个 tactic 是什么,然后把提议交给 Lean 执行。如果执行失败,错误信息会回到 LLM,让它再试别的方向。
这个流程是这样的:
- 从证明助手获得当前 proof state。
- 把 state 和目标描述发给 LLM,让它建议下一步操作。
- 在证明助手里执行建议。
- 如果报错,把报错信息返回给 LLM,让它修正。
- 重复直到目标完成或达到最大步数。
这不是神话,但也不是一个开箱即用的工具。它需要大量工程工作:解析证明状态、处理 Unicode 数学符号、管理上下文窗口、处理多步回溯。真正想用的人至少要投入几周来搭建基础设施。可一旦跑通,LLM 就不再是一个“可能会说谎的顾问”,而是一个“被关在笼子里的搜索器”——它随便发言,但机器始终握着最终裁判权。
3. 把 LLM 接入数学工作流的最小可行配置
3.1 前置条件:不要裸用对话界面
很多人在 ChatGPT、Claude 这类对话系统里尝试数学问题,得到的体验一会好一会坏。原因是对话界面没有接入验证工具,也没有程序化地处理上下文。模型和用户来回闲聊,很容易偏离方向。
真正把 LLM 用到数学工作中,最好把它嵌入到一个可编程的脚本或流水线里。这个流水线需要几个部件:
- LLM 客户端:负责发送请求和接收生成结果。
- 数学计算层:SymPy、SageMath、Wolfram 之类的确定性计算工具。
- 数据校验层:判断生成结果是否满足条件,不满足就反馈给模型继续迭代。
- 日志层:记录每轮输入、输出和验证结果,便于复现和调试。
环境准备不复杂:一台开发机器、Python、LLM API 的 SDK、数学库。最重要的不是这些依赖,而是流程设计。LLM 生成永远只是中间环节,不能成为最终输出。
3.2 一个通用流程:生成、执行、校验、迭代
下面是一个很通用的循环结构,适用于很多场景:
输入: 数学问题描述、已知条件、预期输出格式 循环直到满足条件或达到最大尝试次数: 1. 把当前状态和问题描述发送给 LLM 2. LLM 生成候选结果: 公式、证明步骤、反例参数、文本表述 3. 解析候选结果,交给数学计算层执行 4. 校验结果是否满足约束 5. 如果满足,保存结果并退出 6. 如果不满足,把错误信息加入下一轮提示,继续循环 输出: 经过验证的结果 + 日志这个循环的第一条原则是:不要让 LLM 自问自答。它生成的每个结果都要经过外部校验,数学校验的优先级高于模型判断。
第二条原则是:错误信息要结构化。比如验证阶段发现“候选公式在 n=3 时输出 10,但序列里第三项是 9”,这个信息要明确回传给模型,而不是只告诉它“不对”。模型需要具体错误原因来修正,否则第二轮可能只是换一种方式犯同样的错误。
3.3 提示词里必须写清楚什么
虽然提示词不是万能药,但在数学任务里,一个结构清晰的提示确实能显著降低后续迭代次数。
我一般建议在提示里包含四类信息:
- 数学对象:变量范围、定义域、符号约定。不能只说“证明某个不等式”,要写清楚实数还是复数,整数还是自然数,是否包含端点。
- 目标格式:你是要公式、步骤、反例候选,还是证明策略。如果允许模型自由发挥,得到的文本会很难解析。
- 已知约束:哪些是已知定理、哪些是假设条件、哪些结论已经被排除。这个信息能减少模型漫无边际地生成。
- 验证标准:告诉它结果会交给工具检查,建议它在生成时自行检查一致性。虽然它无法真正执行,但这个要求能提高它生成内容的准确率。
一个示例提示结构(不是唯一写法):
数学问题:已知 a1 = 1, a2 = 4, a3 = 9,猜测一个通项公式。 要求:只给出一个数学表达式,不要解释。 输出格式:LaTeX 公式。 约束:n 为正整数,表达式应为多项式或初等函数。 验证方式:我将用 n=1,2,3,4,5 代入检查是否等于给定序列。请确保你的公式在这些点上精确匹配。这种提示能让模型输出更可控。但它不保证对,后面仍然需要校验和迭代。
4. 这套流程里的坑,不是模型参数能解决的
4.1 幻觉会被验证环节暴露,但代价很大
LLM 在数学上最大的问题不是“胡说”,而是“说得很像真的”。它可能生成一个完全对称、看起来很优雅的公式,但当某个变量取特殊值时直接爆炸。
如果把验证环节做扎实,幻觉可以被发现,但问题在于这会消耗大量时间。尤其当一个“看起来完美”的候选被验证器拒绝时,人需要判断这个错误是微调一下就能修好,还是整个思路已经走偏。这个判断对新手来说很难。
所以不要一上来就让 LLM 挑战大型问题。先让它处理那些验证成本低的子问题,积累足够多的成功和失败样本,再逐步扩大范围。如果验证结果反复失败,不要急着换提示词,先检查是不是问题本身超出了模型已有的数学知识范围。模型不是万能的,它在一些前沿方向上的知识可能非常有限。
4.2 符号、公式和编码问题是第一道门槛
数学和普通文本最大的差别就是符号系统。LaTeX、Unicode、数学字体、变量名,这些都可能在传递过程中产生歧义。一个下标是n+1还是n加 1,在文本里完全可以直接错开。
实际使用中,我见过不少团队在 LLM 输出解析阶段就放弃了。原因很简单:LLM 生成的 LaTeX 经常包含不匹配的花括号、错误的命令名、中英文冒号混用。如果系统没有做一层严格的解析和标准化,后面的数学库根本跑不起来。
建议先做一轮文本规范化:把 LaTeX 中的常见错误替换、清理空白和换行、确认括号数量匹配,然后再进入计算层。不要指望模型每次输出都完美。工程上宁可多写几个解析函数,也不要相信生成结果的格式。
4.3 上下文长度不是万能药,长链条推理仍然要人工拆解
现在的 LLM 动辄支持几十万 token 上下文,很多人觉得可以把整篇论文放进去。但对数学证明来说,长上下文反而会引发一个新问题:模型在大段数学内容中定位关键依赖关系的能力并不稳定。即使它能记住前面的内容,也不一定能在正确的位置应用。
更稳妥的方式是把长证明拆成多个可以独立验证的小步骤,每一步都当作一次独立的 LLM 调用,调用之间只传递必要的上下文。这样虽然会多一点工程设置,但能避免“前面对了、后面却用错前面的结论”这种最麻烦的失败模式。
与其把 LLM 当成一个能一次性处理整个证明的超级大脑,不如把它当成一个可以反复参与局部推理的协作者。真正的线性逻辑链条,仍然由人来维护,尤其是在跨章节引用定理时。
5. 从“尝鲜”到“长期方法”的判断框架
5.1 一个可复用的三步框架:先小、再真、后工程化
如果你想在数学研究里引入 LLM,我不建议一开始就搭一个大平台,更不建议在核心问题上一上来就压重注。可以按这三步走。
第一步,选一个小而真的子问题。“小”是指问题规模小,单次验证几秒内能完成;“真”是指这个问题确实是当前工作里关心的,而不是为了测试模型造一个玩具。比如一个还没找到合适构造的代数对象、一个一直想验证但在犹豫的边界反例。
第二步,手动走通一轮生成-验证循环。直接在脚本里调用 LLM,让输出经过数学库验证,记录失败原因。这个阶段的目的不是提高效率,而是搞清楚模型在这个领域里的表现边界:哪些部分它擅长,哪些部分它总是犯同样的错误。
第三步,把重复流程工程化。如果已经确认某个子问题值得反复探索,再考虑加入缓存、并发、参数回溯、日志管理、错误自动反馈这些机制。这时的 LLM 调用应该被封装成服务,而不是散落在各处。
这个框架的核心是:先用人工兜底的方式判断可行,再用工程手段降低重复成本。跳步是很多项目烂尾的原因。
5.2 适用边界:什么时候别用 LLM
不是所有数学任务都需要 LLM。如果你已经能非常准确地描述问题,并且只需要执行机械计算,直接用符号计算工具更稳。LLM 只有在“你不知道该往哪个方向试”或“你需要一个不那么常规的表达方式”时才值得引入。
具体来说,这些情况我建议先别用:
- 问题对精确性要求极高,且验证成本非常高。
- 现有数学库已经能覆盖你的需求。
- 你无法判断模型输出中哪些信息可能是假的。
- 团队没有足够工程能力搭建验证闭环。
此外,关于证明助手交互,它的学习曲线可能比 LLM 本身更陡。如果你连 Lean 基础语法还没掌握,就急着让 LLM 给你生成 tactic,大概率会花大量时间去理解它的报错。最佳顺序是先用传统方式学会证明助手的基本操作,再让 LLM 提高你的表达效率。
5.3 长期看,真正的价值是异步协作和知识固化
很多人担心 LLM 会取代数学家。我更愿意把它看作一种新的协作层:它把“探索一个想法”的门槛降低了,也让“把直觉变成可验证形式”的时间缩短了。但最终判断、价值选择和高层抽象,仍然在研究者手里。
这个领域最值得关注的长期价值,不是“模型能否证明定理”,而是“我们能否把大量数学知识转化成可验证、可复用的机器辅助工作流”。当越来越多的证明状态、失败尝试、验证结果被记录下来,这套系统本身会成为一个不断生长的数学知识库。
到那个时候,数学研究可能会变成人机共同搜索的过程:由人判断哪些方向重要,由机器辅助生成和检查大量候选。LLM 是其中一块拼图,但不是唯一一块。证明助手、符号计算、数据可视化、自动化推理,这些工具拼在一起,才真正改变数学研究的生产方式。
所以如果你对这个方向感兴趣,眼下最值得做的是找一个小问题,把生成-验证循环跑起来。不要急着追求“AI 证明大定理”,先让它帮你多解决几个小卡点。那些反复出现的小卡点,才是工具真正进入科研流程的入口。