一个上标让计算结果相差4倍:AI计算书审查中的公式识别与数值校核实践
一个上标让计算结果相差4倍:AI计算书审查中的公式识别与数值校核实践
一、问题背景:AI 为什么会把 44² 识别成 442?
随着大语言模型在工程设计、施工方案审查和技术文档分析中的应用不断深入,AI 已经能够辅助识别部分计算问题。
但在实际应用中,数学公式的解析仍然存在较大挑战。
例如,一份 PDF 计算书包含以下表达式:
0.330 × 44² × 1770 / 1000
正确的数学含义是:
0.330 × (44 × 44) × 1770 / 1000
但如果 PDF 文本解析过程中丢失了上标格式,就可能变成:
0.330 × 442 × 1770 / 1000
虽然只丢失了一个上标信息,但计算结果可能发生显著变化。
| 解析方式 | 计算结果 |
|---|---|
| 正确识别 44² | 1130.8176 |
| 错误识别为 442 | 258.1722 |
两种结果相差约 4.38 倍。
需要说明,上述表达式仅作为数学解析示例,不代表某项工程公式及其单位、系数已经得到规范验证。
这个案例反映出一个重要问题:AI 计算审查的准确性,不仅取决于模型推理能力,还取决于输入数据是否正确。
二、数学公式识别有哪些常见问题?
在 PDF、Word 和扫描文档中,公式可能具有复杂的排版形式。
常见错误包括:
1. 上标和下标丢失
例如:
- x² 被解析成 x2。
- 10⁻³ 被解析成 10-3。
- F₁ 被解析成 F1。
这些变化可能直接改变数学表达式的含义。
2. 运算符识别错误
例如:
- × 被识别为字母 x。
- ÷ 被识别为普通斜杠。
- ≥ 被识别为 > 或 >。
- √ 被漏识别。
3. 分式结构丢失
例如,原公式为:
a + b
F = ─────
c
但文本解析可能得到:
F = a + b / c
由于运算优先级不同,最终结果可能发生变化。
4. 公式与参数无法正确关联
一份计算书可能包含多组计算工况。
如果 AI 将工况 A 的荷载参数错误地用于工况 B,即使公式运算完全正确,结论仍然可能存在问题。
因此,公式审查不能停留在简单的数值提取。
三、推荐架构:大模型与确定性计算引擎结合
对于工程计算类审查,建议采用以下流程:
文档解析 → 公式识别 → 参数结构化 → 确定性计算 → 适用性判断 → 审查意见输出
其中,大模型与传统计算程序承担不同的职责。
大模型负责语义理解
例如:
- 识别计算对象。
- 理解公式中的参数含义。
- 判断公式对应的计算工况。
- 提取计算依据。
- 解释可能存在的计算问题。
确定性计算程序负责数值运算
例如:
- 加减乘除。
- 乘方和开方。
- 数值精度控制。
- 中间结果复核。
- 已知公式的计算结果验证。
这样的分工能够降低完全依赖大模型进行复杂数值计算的风险。
但需要注意:确定性计算只能保证在输入和计算规则正确的前提下,按照指定算法执行运算。
如果公式本身识别错误,程序仍然可能得到错误的结果。
四、使用 Python Decimal 进行数值校验
Python 提供了 decimal 模块,可以进行十进制数值运算。
与普通浮点数相比,Decimal 能够精确表示许多常见的有限十进制输入,并支持精度和舍入方式控制。
下面使用 Python 验证前面的表达式。
from decimal import Decimal, getcontext
# 设置计算精度
getcontext().prec = 28
# 读取结构化参数
coefficient = Decimal("0.330")
diameter = Decimal("44")
strength = Decimal("1770")
divisor = Decimal("1000")
# 正确公式:包含平方
correct_result = (
coefficient
* diameter ** 2
* strength
/ divisor
)
# 错误解析:44² 被转换为 442
wrong_result = (
coefficient
* Decimal("442")
* strength
/ divisor
)
print("正确结果:", correct_result)
print("错误结果:", wrong_result)
print("结果比值:", correct_result / wrong_result)
程序输出:
正确结果:1130.8176
错误结果:258.1722
结果比值:4.380090497...
这样可以发现数学表达式中上标识别错误带来的显著影响。
实际项目中,不建议直接使用 Python 的 eval() 执行模型生成的公式字符串。
更安全的方式是采用受限的公式解析器,或者将已经确认的公式转换成结构化参数和预定义运算。
五、如何进一步识别公式中的上标?
对于包含可提取文本的 PDF,可以尝试使用 PyMuPDF 读取文字及其排版属性。
例如:
import pymupdf
doc = pymupdf.open("example.pdf")
for page in doc:
data = page.get_text("dict")
for block in data["blocks"]:
for line in block.get("lines", []):
for span in line["spans"]:
text = span["text"]
flags = span["flags"]
is_superscript = bool(
flags & pymupdf.TEXT_FONT_SUPERSCRIPT
)
if is_superscript:
print("检测到可能的上标:", text)
PyMuPDF 支持提取文本片段、字体属性及位置信息,并提供上标识别标记。
但是,上标标记属于推断结果,并不保证所有 PDF 都能正确识别。
特别是扫描件、字体嵌入异常或者复杂公式排版的文档,还需要结合页面图像进行核验。
一种可行的优化方式是:
- 优先读取 PDF 原始文本及排版信息。
- 对存在疑义的公式区域进行图像识别。
- 比较两种解析结果。
- 对公式结构不一致的位置进行复核。
- 确认公式结构后,再执行数值计算。
这样可以避免单纯依赖文本解析导致的公式结构丢失。
六、数值正确,不代表工程计算一定正确
这是 AI 计算审查中非常容易忽略的问题。
例如,某项计算:
- 公式运算正确。
- 输入参数正确。
- 计算结果也正确。
但如果选择的参数不适用于当前工况,仍然可能导致错误的工程结论。
因此,建议把计算审查划分为三个层次。
| 审查层次 | 核心问题 |
|---|---|
| 公式识别 | 是否正确还原原始公式 |
| 数值校核 | 计算结果是否准确 |
| 工程适用性 | 参数、单位、工况与判断依据是否合理 |
其中,前两类问题可以在一定程度上通过程序自动化处理。
第三类问题往往需要结合专业知识、适用规范和工程实际条件进行判断。
此外,还应考虑单位换算、数值取整、保守取值和安全裕度等情况。
例如,计算结果与原文存在差异,并不必然意味着方案不合格。
有时设计人员采用了更保守的参数,反而提高了安全裕度。
因此,不能简单采用“计算结果不同就判定错误”的规则。
七、如何建立更可靠的自动审查流程?
从工程应用角度,建议建立以下机制。
1. 识别不确定性管理
如果系统无法确认某个符号究竟是上标还是普通数字,应将其标记为待核验。
不能在公式结构尚未确认时,直接生成确定性的计算错误结论。
2. 参数来源追溯
每个关键参数应当尽量关联:
- 原文摘录。
- 文件及页面位置。
- 参数名称。
- 数值和单位。
- 对应计算工况。
这样可以帮助用户核查计算输入是否正确。
3. 数值结果与专业判断分离
建议输出两类信息:
数值校核结果:
记录提取的公式、输入参数、程序计算结果以及与原文结果的差异。
专业审查结论:
结合工程适用条件、引用依据及安全裕度,判断是否构成实际问题。
这样可以减少将普通计算差异直接升级为专业审查问题的情况。
4. 人工复核与反馈
对于公式无法准确识别、依据不明确或工程工况复杂的情况,应保留人工复核入口。
人工确认后的结果可以用于建立测试样本集,持续优化公式识别和计算校验能力。
八、如何评价 AI 计算审查效果?
建议使用以下指标:
| 评测指标 | 评价目的 |
|---|---|
| 公式结构识别准确率 | 公式是否被正确还原 |
| 参数提取准确率 | 数值、单位和参数含义是否正确 |
| 数值校核准确率 | 程 |
- 点赞
- 收藏
- 关注作者
评论(0)