我最早以为,”拍照解方程”是一台完整的智能机器:镜头扫过题目,系统像人一样看一眼,再想一下,然后给出答案。

后来我把它拆开看,发现真相有点扫兴——它根本不是一个整体,而是一条流水线。前半段是一位视觉翻译员,把像素变成一行 LaTeX 代码;后半段是一位代数计算员,拿着这行代码去解方程组。两个环节之间只隔着一行文本,而这行文本可能是错的。
更残酷的是:翻译员在赌概率,计算员在做确定性的数学。计算员从头到尾没看过原图一眼,它只为那行文本负责。
这个结构决定了这类系统的全部优点,也决定了它所有的翻车现场。顺着流水线走一遍,你就明白它为什么时灵时不灵。
文字 OCR 的假设,对数学公式基本不成立
普通文字 OCR 解决的问题,是把图像里的字符按从左到右的顺序读出来。这个假设对文字成立,因为一行文字确实是线性排列的。
数学公式是二维的。
“x²”里的 2 不是一个普通字符,它被放在右上角,这个位置本身就是含义。分数的横线把分子和分母垂直堆叠,根号像一把伞罩住后面的整个式子。上标、下标、嵌套、覆盖——这些空间关系承载的信息,和字符本身一样多。
所以传统公式识别远不是”OCR 加几个数学符号”那么简单。InftyReader 那一代系统的工作流程是这样的:
- 在图像里定位公式区域,把它从正文里摘出来
- 把公式切成一个个独立符号
- 对每个符号做字形识别——这一步和普通 OCR 类似
- 判断相邻符号的空间关系:左边、上标、下标、上方、被覆盖
- 用语法把这些关系组装成一棵结构树
- 最后把树序列化成一维 LaTeX 文本
我最早犯过的错误,就是以为公式识别等于文字 OCR 加数学符号词典。直到看到这六步才想通:真正的难点在第 4 步。一个字符放在什么位置,比它长什么样更重要。OCR 做的是字形到字符的映射,公式识别做的是空间关系到数学结构的映射,两者差着一整个维度。
2017 年,有人把公式识别直接变成了看图写代码
2017 年,Deng 等四人在论文Image-to-Markup Generation with Coarse-to-Fine Attention里干了一件很激进的事:不再切符号、不再判断位置,把公式图像到 LaTeX 文本的转换整个当成一个序列生成问题。
编码器是一个卷积神经网络,把图像压成一组特征图;解码器是一个 LSTM,一个 token 一个 token 地往外吐 LaTeX。每吐一个 token 之前,注意力机制会让解码器回头看一眼图像中相关的区域——就像你一边抄写一边对照原稿。
论文摘要的大意是:给定公式图像,端到端地训练一个网络直接生成对应 LaTeX 标记序列,不手工设计任何公式结构规则,二维布局交给模型从数据里自己学。
这个模型从头到尾没有显式建模任何二维结构,却靠注意力学会了上标、分数、根号这些布局。这个做法让我想通了一件事:理解数学结构,不是唯一路径。数据和注意力足够时,一个纯粹的条件概率模型也能学会把像素翻译成 LaTeX。但这不叫理解数学,这叫学会了转写。
这个区分决定了系统的上限。这个模型可以把一个复杂的偏微分方程完美转写成 LaTeX,但对这个方程意味着什么一无所知。它产出的文本,只是下游代数求解器的输入。
从单条公式到方程组,难度又高了一整层
前面说的都是”一张图里有一条公式”。但标题里是方程组——一张照片里可能有三条、五条甚至十几条公式,而且它们属于同一个系统。
这让问题多出了几个前置环节:
- 检测出图像里所有公式区域,而不是把它们当成正文
- 判断公式的阅读顺序。印刷题还好,手写笔记的排列千奇百怪
- 把属于同一个方程组的公式分到一组——哪些式子互相约束,哪些是上一题的残影?
- 然后才轮到逐条识别
最后一个分组步骤,实际产品里大多靠几何启发式:对齐、间距、缩进。听着简单,但排版一乱,分组就错;分组错了,后面解的就是一堆不相干式子拼出来的伪方程组,解得再精确也毫无意义。
求解器根本不知道题目长什么样
假设识别环节运气不坏,输出了这样一份 LaTeX:
egin{cases} x + y = 3 \ x - y = 1 \end{cases}
接下来发生的事,和”看懂题目”没有半点关系。
LaTeX 是一门排版语言,不是数据结构。求解器第一步,是把这串文本解析成表达式树:根节点是等号,左子树是 x+y-3,右子树是 0。这步叫语义解析,它本身就是一道坎——SymPy 的 parse_latex 能解析单个表达式,但遇到方程组、矩阵、分段函数,支持非常有限,工程上经常要自己写解析逻辑。
解析成树之后,才轮到真正的代数方法。线性方程组用高斯消元或 LU 分解,一般的多项式方程组用代入消元、结式、Gröbner 基。这些算法是确定性的:输入对,输出对;输入错,输出错得离谱。SymPy 官方求解器文档对 solve 的边界也交代得很坦白:它能处理很多类型的方程,但从不敢承诺一切方程都解得动。
如果问我会不会信任这种系统,我的答案是:只有在识别成功时它才可靠,而识别恰恰是它最不稳定的环节。
它栽在哪儿
| 你以为 | 实际上 |
|---|---|
| 系统看懂了题目 | 它只是把像素翻译成 LaTeX,语义理解几乎为零 |
| 识别错一点,答案会接近正确 | 求解器没有接近这回事,错一个符号就是另一个答案 |
| 手写难点在于字形 | 手写的结构歧义才是本质:这条横线是减号还是分数线? |
| 公式识别已经成熟 | 长公式、矩阵、复杂下标,视觉模型普遍处理不好 |
更深一层的问题是错误传播。视觉识别输出的是概率分布,它天生可以犯错;代数求解器不接受任何近似,它天生要求精确。两者被强行接在一起,中间没有任何置信度缓冲带。
所以这类系统的真实短板不在代数,在视觉。视觉最薄弱的一环,是把二维结构压成一维 LaTeX 的那一步——一旦压错,后面全是白算。
为什么不干脆让模型从图片直接输出答案
这条路确实有人在走。把视觉和推理放进同一个多模态模型,从像素直接生成答案。但在MathVista这类视觉数学基准上,目前最强的多模态模型也只有五成左右的正确率,连简单的图表读数和几何题都会翻车。
两条路线赌的是不同的东西。流水线赌视觉识别准确率能提上去,端到端赌模型推理能力能补上来。目前看,前者在工程上更可控,因为每个环节都能单独测试、单独改进;后者在概念上更接近人解题,但错误不可解释,也难以定位。
回到开头那个问题:拍照解代数题,到底是怎么工作的?
答案是四个字:先猜,再算。
猜——视觉模型从像素里猜一份 LaTeX,它用概率工作,错了也不会脸红。算——代数求解器用高斯消元这类确定性算法,精确、无情,但完全看不见原图。
你拍下的那道方程组能不能被解对,几乎完全取决于第一环节猜得准不准。这件事,是这个领域最诚实的技术现实。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/1240.html