基于 GOT-OCR2.0 与 Qwen2.5-Math 构建 AI 数学辅导系统
本文介绍了如何利用 GOT-OCR2.0 光学字符识别模型与 Qwen2.5-Math 数学大模型构建个人 AI 数学辅导系统。文章详细阐述了 Qwen2.5-Math 相比前代的 CoT 与 TIR 推理优势,提供了基于 Python 的环境配置、模型加载及推理接口封装代码。通过七个涵盖方程、排列组合、数论及不等式的实际案例,验证了系统在识别与解题方面的有效性,并分析了显存占用、推理速度及潜在优化方向。

本文介绍了如何利用 GOT-OCR2.0 光学字符识别模型与 Qwen2.5-Math 数学大模型构建个人 AI 数学辅导系统。文章详细阐述了 Qwen2.5-Math 相比前代的 CoT 与 TIR 推理优势,提供了基于 Python 的环境配置、模型加载及推理接口封装代码。通过七个涵盖方程、排列组合、数论及不等式的实际案例,验证了系统在识别与解题方面的有效性,并分析了显存占用、推理速度及潜在优化方向。

随着多模态大模型技术的发展,利用 OCR(光学字符识别)技术结合数学专用大模型来解决教育场景下的作业辅导问题已成为可能。本文介绍如何整合中科大的 GOT-OCR2.0 模型与阿里通义千问的 Qwen2.5-Math 系列模型,搭建一个本地化的个人 AI 数学老师。
GOT-OCR2.0 负责图像识别,相当于系统的'眼睛',能够精准提取题目中的文本、公式和图表;Qwen2.5-Math 负责逻辑推理与计算,相当于系统的'大脑'。通过两者的协同工作,可以实现对小学、初中及高中各类数学题目的自动解答。
Qwen2.5-Math 是阿里通义千问团队开源的数学垂直领域大模型。该系列包含多个参数规模的版本,包括基础模型 Qwen2.5-Math-1.5B/7B/72B 以及指令微调模型 Qwen2.5-Math-1.5B/7B/72B-Instruct,此外还发布了数学奖励模型 Qwen2.5-Math-RM-72B。
相较于上一代 Qwen2-Math 仅支持使用思维链(Chain-of-Thought, CoT)解答英文数学题目,Qwen2.5 系列在以下方面实现了显著升级:
虽然 CoT 能增强 LLM 的推理能力,但在处理高精度计算(如二次方程求根、矩阵特征值计算)时仍面临挑战。引入 TIR 机制后,Qwen2.5-Math-1.5B/7B/72B-Instruct 在 MATH 基准测试中分别取得了 79.7、85.3 和 87.8 的高分。
Qwen2.5-Math 的训练流程主要包含三个关键步骤:
最终构建了名为 Qwen Math Corpus v2 的预训练数据集,总 Token 数量从 v1 的 700B 增加到超过 1T,上下文长度保持为 4K。
GOT-OCR2.0 是由中科大研究学者提出的新一代通用 OCR 理论模型,旨在推动 OCR 技术进入 2.0 时代。其核心特点如下:
本章节将详细演示如何配置环境、加载模型并封装推理接口,打造个人 AI 数学老师。
首先,需要安装必要的依赖库。建议使用 Python 3.8+ 环境,并确保 CUDA 驱动已正确配置。
pip install torch==2.4.0 transformers accelerate tiktoken==0.7.0 verovio==4.3.1 bitsandbytes
在 Jupyter Notebook 环境中,可以通过以下命令检查版本:
from IPython.display import clear_output
import torch
import transformers
import accelerate
print(f"torch: {torch.__version__}")
print(f"transformers: {transformers.__version__}")
print(f"accelerate: {accelerate.__version__}")
为了降低显存占用,建议对 Qwen2.5-Math-7B 采用 NF4 量化加载,而 GOT-OCR2.0 保持 float32 精度以保证识别准确率。预计累计显存占用约为 8.3GB。
from transformers import AutoModel, AutoTokenizer, BitsAndBytesConfig
from transformers import AutoModelForCausalLM, Qwen2ForCausalLM
import torch
# 加载 GOT-OCR2.0 模型
ocr_tokenizer = AutoTokenizer.from_pretrained('ucaslcl/GOT-OCR2_0', trust_remote_code=True)
ocr_model = AutoModel.from_pretrained(
'ucaslcl/GOT-OCR2_0',
trust_remote_code=True,
low_cpu_mem_usage=True,
device_map='cuda',
use_safetensors=True,
pad_token_id=ocr_tokenizer.eos_token_id
)
ocr_model = ocr_model.eval().cuda()
# 加载 Qwen2.5-Math-7B 模型 (4bit 量化)
model_name = "Qwen/Qwen2.5-Math-7B-Instruct"
device = "cuda"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
llm_int8_threshold=6.0,
llm_int8_has_fp16_weight=False,
)
model = Qwen2ForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
torch_dtype=torch.float16,
low_cpu_mem_usage=True
).eval()
tokenizer = AutoTokenizer.from_pretrained(model_name)
我们将图片和文本信息封装成统一的函数,支持两种推理模式:CoT(思维链)和 TIR(工具集成推理)。
def got_ocr20_qwen25_math_7b_infer(image_file, user_input, m_type='cot'):
res = ''
if image_file:
# 执行 OCR 识别
res = ocr_model.chat(ocr_tokenizer, image_file, ocr_type='format')
print("OCR 识别结果:\n", res)
# 构建查询语句
query = user_input + "\n" + res
# 根据模式选择 System Prompt
if m_type == 'cot':
messages = [
{"role": "system", "content": "你是一个数学专家。请一步一步输出对应的结果。"},
{"role": "user", "content": query}
]
else:
messages = [
{"role": "system", "content": "请将自然语言推理与程序结合起来解决上述问题,并将你的最终答案放在 \boxed{} 中。"},
{"role": "user", "content": query}
]
# 生成回答
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = model.generate(**model_inputs, max_new_tokens=4096)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
# 格式化输出
response = response.replace(, ).replace(, ).replace(, ).replace(, )
response
输入图片:包含二元一次方程组的图片。 提示词:计算下面方程组中 x 的解。
推理过程:模型首先通过 OCR 提取方程内容,然后利用 CoT 模式逐步推导消元过程,最终得出 x 的值。
问题描述:在前 1000 个自然数中,既不是平方数也不是立方数的自然数有多少个?
CoT 模式结果:模型通过逻辑推理列出排除集合,计算交集与并集,得出准确数量。 TIR 模式结果:模型编写 Python 脚本遍历 1 到 1000,直接统计符合条件的数字个数,验证了结果的准确性。
问题描述:已知 $15120=2^4\times3^3\times5\times7$,问:15120 共有多少个不同的约数?
分析:这是一个典型的数论问题。模型识别出质因数分解形式,应用约数个数公式 $(a_1+1)(a_2+1)...$ 进行计算。
输入图片:包含图形和文字描述的初中数学题。 结果:模型成功识别图形中的几何关系,并结合代数方程求解未知量。
问题描述:涉及集合交集、并集运算的题目。 注意:部分情况下模型可能输出英文术语,这是因为训练语料中集合相关问题的英文表述较多。在实际使用中,可通过调整 System Prompt 强制要求中文输出。
输入图片:复杂的不等式计算题。 结果:模型能够识别不等号方向及区间表示,给出正确的解集。但需注意,模型有时会使用大学数学定理(如拉格朗日中值定理)来简化证明,对于高中生而言可能超纲,建议配合人工审核。
输入图片:多层嵌套的不等式。 结果:模型展现了较强的符号处理能力,能够分步拆解不等式条件,最终给出正确结论。
max_new_tokens 或尝试使用更小的模型版本(如 1.5B)。ocr_type 参数或预处理图片(增加对比度、裁剪无关区域)。通过将 GOT-OCR2.0 与 Qwen2.5-Math 相结合,我们成功构建了一个能够处理多种类型数学题目的 AI 系统。该系统不仅适用于家庭作业辅导,也可作为教育辅助工具用于自动化批改或解题思路展示。未来可进一步探索多模态交互界面,提升用户体验。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online