NLP(九十七)大模型数学解题能力的初步探索
本文将会介绍如何对大模型进行微调(SFT),使其具备数学解题能力,这是笔者在探索大模型的数学解题能力方向的初步探索,后续将持续跟进。
在文章NLP(九十六)使用LLaMA-Factory实现function
calling中,笔者介绍了如何使用LLaMa-Factory
微调框架,对Qwen1.5-4B
模型进行微调,实现function calling
功能,使得大模型具有工具调用能力。
对大模型微调使其具备调用调用能力,这是通过function calling的方式实现的,这也是说,我们事先需要提供对应工具API的调用函数及其函数参数。那么,有没有一种工具是大模型天然具备的呢?
当然有,这就是我们开发大模型时要用到的代码啊!代码(包括Python)就是一种最基本的工具。受此启发,我们可以对大模型进行微调,使其具备生成Python代码的能力,从而解决数学题目。
数据合成
对大模型微调,使其具备数学解题能力,高质量的数据集是最重要的保障之一。
业界、数学界关于大模型数学解题能力方面的研究,已经有不少研究成果和数据集。在LLaMa-Factory
中,内置了两类数学方面的数据集,它们为BelleGroup/school_math_0.25M
和TIGER-Lab/MathInstruct
,前者是包含约25万条由BELLE
项目生成的中文数学题数据,包含解题过程,但题目偏简单,多为小学数学题;后者由13个具有中间原理的数学数据集编译而成,其中6个为新数据集,混合了思想链(CoT)和思想程序(PoT),确保覆盖了广泛的数学领域。
但是,这两个数据集并没有调用Python代码去解题,仅仅是利用了大模型本身的世界知识和推理能力(如COT)。
我们希望在用大模型解决数学题目时,能够按照我们读书时的过程,先给出思考过程,再调用合适的知识点(这里是Python)代码,最后给出结果。下面是一个数学题目的解答过程:
1 |
|
基于上述的这种格式,我们借助GPT-4-turbo
模型进行数据合成,其中一个模板(即Prompt)如下:
1 |
|
如何写好合适的Prompt,使得GPT-4-turbo
能够遵循指令,给出高质量的数学解题过程,也是值得探索的,笔者这里只是给出了初步尝试的结果,这中间的过程还是有待提升的。
使用GPT-4-turbo
模型生成数据,再经过大量时间的数据清洗与合成,最终我们得到547个样本(包含重复样本),它们都满足sharegpt格式,格式样例如下:
1 |
|
这就是我们最终送入LLaMa-Factory
的数据格式了。
模型微调
使用LLaMa-Factory
微调框架对大模型进行SFT,笔者之前在很多文章中已经介绍多次了,并没有太多新意,这里也不再给出详细的微调过程。
我们使用Qwen/Qwen1.5-32B
模型,对上述合成的少量数据集进行SFT,训练完毕后导出模型为Qwen1.5-32B-math
,再使用下面的脚本启动训练后模型的推理服务:
1 |
|
模型预测
接下来,就是快乐的模型预测时光了,此时,我们就能见证大模型在经过数学题数据集微调后,是否具备了数学解题能力。
在此之前,我们先看看Qwen/Qwen1.5-32B
模型本身的数学解题能力。
- 题目:小明有98元,他要买一本书和一支笔,已知书的价格是25元,笔的价格比书的价格多15元,请问小明还剩余多少元钱?

- 题目:抛物线y=x^2﹣4x+3的顶点坐标为多少?

- 题目:计算123456789与987654321的乘积

由此可见,模型在微调前已经具备一定的数学解题与分析能力,但无法调用Python代码,并且存在幻觉(第三题的结果是不正确的!),另外,模型还会生成额外的不相关文本,这与模型是生成模型而并非Chat模型有关,这点可使用Chat模型来解决。
让我们来看看微调后模型Qwen1.5-32B-math
的表现吧!
这里先给出模型预测的Python代码:
1 |
|
在这里,我们将生成后的Python代码存入temp.py脚本中,并使用subprocess
模块运行该脚本并获取Python代码的执行结果,然后将其加工成prompt",输出会是:
{python_code_execution.strip()}
"送入大模型中继续回答。
我们来看看模型微调后的结果(下面会给出几个表现好的case):
首先是上面展示过的三道题目。
- 题目1:小明有98元,他要买一本书和一支笔,已知书的价格是25元,笔的价格比书的价格多15元,请问小明还剩余多少元钱?

- 题目2:抛物线y=x^2﹣4x+3的顶点坐标为多少?

- 题目3:计算123456789与987654321的乘积

接着是更多题目的展示。
- 题目4:若(ax-b)(3x+4)=bx^2+cx+72,则a+b+c的值为多少?

- 题目5:123456789 + 987654321 = ?

- 题目6:已知ΔABC为正三角形,则tan(A+)的值等于多少?

- 题目7:各项均为正数的等比数列{a_{n}}的前n项和为S_{n},已知S_{3}=10, S_{6}=30,则S_{12}等于多少?

- 题目8:复数 3+4i 的模是多少?

- 题目9:(1+2x)^6 的展开式中 x^3 项的系数为多少?

- 题目10:学校图书馆有故事书、科技书和连环画共1200本,其中故事书占60%,科技书和连环画的数量比是2:3,图书馆有多少本连环画?

接着,我们来看下最开始提到的数据题数据集BelleGroup/school_math_0.25M
和TIGER-Lab/MathInstruct
中的两道题目。
- 题目11:某天,小明去菜市场买了5个苹果和3个梨,花了20元。第二天,他又去同一个菜市场买了3个苹果和4个梨,花了15元。问:小明每个苹果和每个梨的价格是多少元?

- 题目12:Suppose you have a system of linear equations: 2x + 3y + z = 7 x + 2y + 4z = 12 3x + y + 2z = 8 Using matrix methods, find the values of x, y, and z that satisfy the system of equations.

最后,我们来看看大学数学中的微积分方面的数学题目的表现。(题目来自网站:https://univs-news-1256833609.cos.ap-beijing.myqcloud.com/123/upload/resources/file/7526039.pdf 中的 第七题 )

再使用定积分计算器(https://zs.symbolab.com/solver/definite-integral-calculator)进行验证,答案正确。
总结
ok,经过上述漫长的模型预测的测试,我们可以发现,经过SFT后的大模型遵循了指令,并且按照我们的要求给出了思考过程,分析过程,调用Python代码,执行Python代码,最后给出答案。上述的测试的答案(除了精度上的偏差)都是正确的,这样的表现无疑是让人惊喜的。
大模型之所以有这样的数学解题能力,个人理解是:
大模型本身就具有一定的数学题目分析能力,借助Python代码(实际上就是code intepreter)能力,可以得到正确结果,这样既避免了幻觉,又能借助Python中的数学相关模块的帮助,因此,才使得它拥有了数学解题能力。
当然,上面的模型预测题目只是给出了一些好的测试样例,实际上,现在微调后的大模型在数学解题能力方面还有很大的进步空间。
基于笔者这段时间的尝试和思考,关于大模型数学解题能力方面的提升如下:
- 高质量数学题的数据集获取
- 更大规模、更高质量、形式更丰富的数学题的数据合成
- 数据集的清洗,包括公式整理、去重等
- 加入 高等数学题、与其它专业学科融合的题目等方面的数据集
- 多模态数据集的获取与合成,使得大模型能结合图片进行解题
- 多次思考过程,类似于COT,现在的方案只有一次思考,生成一次代码
- 可靠性:生成的Python代码更可靠,现在生成的Python代码存在多种问题,如运行报错,无法执行,进入死循环等等
- 准确性:Python代码运行后的数字精度问题,是否可以用分数或根式等其它形式表达,现在的执行结果有时候返回小数,与正确答案存在精度偏差,其实返回分数或根式更为合理(比如上面的题目11、12等)
- 稳定性:大模型的生成文本或代码不稳定,变动较大,导致答案有时正确,有时不正确
- 更优雅地数学解题过程与代码生成,有时候一道题目有更好的解法(比如上面的题目7)
- 其它...
上述的问题,每一个都很有难度,希望在后面的尝试与探索能有所突破~
本项目已开源至Github,网址为:https://github.com/percent4/llm_math_solver ,后续将持续更新~
参考文献
- NLP(九十六)使用LLaMA-Factory实现function calling
- 上交开源MathPile专业数学语料库,95亿tokens,含可商用版:https://mp.weixin.qq.com/s/Qe_wMMsvdsNSJGv_oI24fw
- BelleGroup/school_math_0.25M: https://huggingface.co/datasets/BelleGroup/school_math_0.25M
- TIGER-Lab/MathInstruct: https://huggingface.co/datasets/TIGER-Lab/MathInstruct?row=0
- 单卡 3 小时训练专属大模型 Agent:基于 LLaMA Factory 实战: https://zhuanlan.zhihu.com/p/678989191
- 题海网: http://www.7249.cn/
欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。

欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。
