用AI复核审计报告两周后我推倒重来了

上一篇文章,我说想做一个工具,让AI帮忙检查审计报告里的数字错误。
两周过去了,我真的动手做了。
写了六千多行代码,22个文件。
然后,推倒重来了。
▌ 我最初的思路

思路很直观:
先把审计报告 PDF 精确拆解成结构化数据:每个科目是一个数据块,每个数据块有标题、表格、正文、页码。
拆完之后,建一个索引,用户配好勾稽规则,代码按规则去匹配数据块,找到对应的数字,做比对。
听起来很合理对吧。
我也觉得很合理,所以一头扎了进去。
▌ 第一个坑:标题拆不准

审计报告的附注,结构看起来很规整:一、二、三,(一)(二)(三),1、2、3。
但真正去解析的时候才发现,每家事务所的格式都不一样。
有的用"一、二、三"做大章节,有的用"(一)(二)(三)",有的混着用。正文里的编号列表、表格里的序号、脚注编号,全都会被误识别成标题。
我不停地加规则、加过滤、加纠正逻辑,那个文件膨胀到五百多行,仍然没法覆盖所有格式。
这时候我开始意识到一个问题:我在用错误的方式理解文档结构。
▌ 第二个坑:拆粗了不行,拆细了也不行
标题拆完之后,要把文档切成一块一块的数据块。
拆太粗,一整个科目塞给AI,内容太长,AI找不准数字。
拆太细,每个表格单独一块,跨表格的勾稽关系就断了。
而且同一个科目可能跨三五页,表格可能跨页,正文和表格交替出现。
更要命的是,标题拆错了,数据块就跟着错,索引也跟着错,后面的匹配和检查全部连锁失败。
上游错一点,下游全崩。
▌ 第三个坑:匹配是个无底洞
用户写规则的时候,用的是"应收账款"这样的名字。
但数据块的标题可能是"5. 应收账款"、"(五)应收账款"、“应收账款及应收票据”。
精确匹配只能覆盖最简单的情况,模糊匹配又容易匹错。最后还是要让AI来做语义匹配,但把几百个标题全发给AI,token消耗很大,速度也慢。
中间多了一层索引抽象,反而增加了出错的可能。
▌ 第四个坑:让AI同时干两件事
我最初的设计是,把数据块的文本和规则一起发给AI,让AI同时完成两件事:找到数字,然后比较。
问题是,AI找数字有时候不准——四舍五入、正负号、单位,都可能出问题。
但因为"找数字"和"做比较"耦合在一起,我没法判断到底是哪一步出了错。
是AI找错了数字,还是数字本身就不对?
分不清。
▌ 第五个坑:表格比想象中复杂得多
表内勾稽,我最初用纯代码做:检测到"合计"关键词,就把上面的明细行加起来验证。
但"综合收益总额"不是合计行,“其中:xxx"是子项不该参与合计,固定资产的表格分成原值、折旧、减值、账面价值好几段,每段有自己的合计行。
横向的加减关系(账面余额 - 坏账准备 = 账面价值)更没法自动发现,必须靠人配规则。
表格结构的多样性,远超我的预期。
▌ 推倒重来
两周之后,我停下来,重新想了一遍。
问题的根源是什么?
是我试图把一个非结构化的文档,精确地解析成结构化数据。
审计报告 PDF 的格式变体太多了,精确解析的投入产出比极低。规则越加越复杂,覆盖率提升却越来越慢。
而且中间的抽象层太多:PDF → 标题骨架 → 数据块 → 索引 → 匹配 → 检查。每一层都可能出错,链条越长,越脆弱。
想明白之后,我把六千行代码扔了,重新设计了架构。
▌ 新的思路

核心变化就一句话:不再试图精确解析整个文档,只提取"刚好够用"的结构。
报表(资产负债表、利润表这些)格式相对固定,用代码精确提取。
附注不再精确拆分,只建一个轻量索引:哪个科目大概在哪几页。
检查的时候,报表之间的勾稽用纯代码算,精确可靠。涉及附注的,把那几页内容发给AI,让AI去定位数字,定位完之后,比较的事交回给代码做。
AI和代码各干各擅长的事:
AI负责理解语义——这个数字是什么、在哪里。
代码负责精确计算——加减乘除、比大小。
不再让AI同时干两件事,也不再让代码去理解文档结构。
▌ 现在到哪了
新架构基本跑通了。
报表间的勾稽、附注和报表的交叉核对,已经能用了。
表内的横加、竖加还有一些误报,在优化中,这周应该可以发布第一个可用版本。
▌ 这两周教会我的事

回头看,这两周不算浪费。
踩过的坑让我想明白了几件事:
第一,不要试图精确解析非结构化文档。 只提取刚好够用的结构,剩下的交给AI。
第二,中间抽象层越少越好。 每多一层,就多一个出错的环节。
第三,AI和代码要分工明确。 AI做理解,代码做计算。让AI算数,它会出错;让代码理解语义,它更不行。
第四,先跑通,再优化。 我在核心功能还没稳定的时候,就去做坐标定位、并发优化这些锦上添花的事,结果复杂度爆炸。
这些道理说出来都很简单。
但不踩一遍坑,真的不会信。
最后
上一篇文章我说,审计报告出具前的质量复核,本质上就是一堆有规律的检查。
这个判断没变。
变的是我对"怎么让AI做这件事"的理解。
不是把所有东西都解析清楚再交给AI,而是让AI在模糊中找到精确的答案,然后用代码去验证。
这个工具,快了,没意外这周就可以发布。