目录

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

目录

/images/audit_rebuild_cover.png

上一篇文章,我说想做一个工具,让AI帮忙检查审计报告里的数字错误。

两周过去了,我真的动手做了。

写了六千多行代码,22个文件。

然后,推倒重来了。

▌ 我最初的思路

/images/audit_rebuild_approach.png

思路很直观:

先把审计报告 PDF 精确拆解成结构化数据:每个科目是一个数据块,每个数据块有标题、表格、正文、页码。

拆完之后,建一个索引,用户配好勾稽规则,代码按规则去匹配数据块,找到对应的数字,做比对。

听起来很合理对吧。

我也觉得很合理,所以一头扎了进去。

▌ 第一个坑:标题拆不准

/images/audit_rebuild_pits.png

审计报告的附注,结构看起来很规整:一、二、三,(一)(二)(三),1、2、3。

但真正去解析的时候才发现,每家事务所的格式都不一样

有的用"一、二、三"做大章节,有的用"(一)(二)(三)",有的混着用。正文里的编号列表、表格里的序号、脚注编号,全都会被误识别成标题。

我不停地加规则、加过滤、加纠正逻辑,那个文件膨胀到五百多行,仍然没法覆盖所有格式。

这时候我开始意识到一个问题:我在用错误的方式理解文档结构。

▌ 第二个坑:拆粗了不行,拆细了也不行

标题拆完之后,要把文档切成一块一块的数据块。

拆太粗,一整个科目塞给AI,内容太长,AI找不准数字。

拆太细,每个表格单独一块,跨表格的勾稽关系就断了。

而且同一个科目可能跨三五页,表格可能跨页,正文和表格交替出现。

更要命的是,标题拆错了,数据块就跟着错,索引也跟着错,后面的匹配和检查全部连锁失败。

上游错一点,下游全崩。

▌ 第三个坑:匹配是个无底洞

用户写规则的时候,用的是"应收账款"这样的名字。

但数据块的标题可能是"5. 应收账款"、"(五)应收账款"、“应收账款及应收票据”。

精确匹配只能覆盖最简单的情况,模糊匹配又容易匹错。最后还是要让AI来做语义匹配,但把几百个标题全发给AI,token消耗很大,速度也慢。

中间多了一层索引抽象,反而增加了出错的可能。

▌ 第四个坑:让AI同时干两件事

我最初的设计是,把数据块的文本和规则一起发给AI,让AI同时完成两件事:找到数字,然后比较。

问题是,AI找数字有时候不准——四舍五入、正负号、单位,都可能出问题。

但因为"找数字"和"做比较"耦合在一起,我没法判断到底是哪一步出了错。

是AI找错了数字,还是数字本身就不对?

分不清。

▌ 第五个坑:表格比想象中复杂得多

表内勾稽,我最初用纯代码做:检测到"合计"关键词,就把上面的明细行加起来验证。

但"综合收益总额"不是合计行,“其中:xxx"是子项不该参与合计,固定资产的表格分成原值、折旧、减值、账面价值好几段,每段有自己的合计行。

横向的加减关系(账面余额 - 坏账准备 = 账面价值)更没法自动发现,必须靠人配规则。

表格结构的多样性,远超我的预期。

▌ 推倒重来

两周之后,我停下来,重新想了一遍。

问题的根源是什么?

是我试图把一个非结构化的文档,精确地解析成结构化数据。

审计报告 PDF 的格式变体太多了,精确解析的投入产出比极低。规则越加越复杂,覆盖率提升却越来越慢。

而且中间的抽象层太多:PDF → 标题骨架 → 数据块 → 索引 → 匹配 → 检查。每一层都可能出错,链条越长,越脆弱。

想明白之后,我把六千行代码扔了,重新设计了架构。

▌ 新的思路

/images/audit_rebuild_newarch.png

核心变化就一句话:不再试图精确解析整个文档,只提取"刚好够用"的结构。

报表(资产负债表、利润表这些)格式相对固定,用代码精确提取。

附注不再精确拆分,只建一个轻量索引:哪个科目大概在哪几页。

检查的时候,报表之间的勾稽用纯代码算,精确可靠。涉及附注的,把那几页内容发给AI,让AI去定位数字,定位完之后,比较的事交回给代码做

AI和代码各干各擅长的事:

AI负责理解语义——这个数字是什么、在哪里。

代码负责精确计算——加减乘除、比大小。

不再让AI同时干两件事,也不再让代码去理解文档结构。

▌ 现在到哪了

新架构基本跑通了。

报表间的勾稽、附注和报表的交叉核对,已经能用了。

表内的横加、竖加还有一些误报,在优化中,这周应该可以发布第一个可用版本。

▌ 这两周教会我的事

/images/audit_rebuild_lessons.png

回头看,这两周不算浪费。

踩过的坑让我想明白了几件事:

第一,不要试图精确解析非结构化文档。 只提取刚好够用的结构,剩下的交给AI。

第二,中间抽象层越少越好。 每多一层,就多一个出错的环节。

第三,AI和代码要分工明确。 AI做理解,代码做计算。让AI算数,它会出错;让代码理解语义,它更不行。

第四,先跑通,再优化。 我在核心功能还没稳定的时候,就去做坐标定位、并发优化这些锦上添花的事,结果复杂度爆炸。

这些道理说出来都很简单。

但不踩一遍坑,真的不会信。

最后

上一篇文章我说,审计报告出具前的质量复核,本质上就是一堆有规律的检查。

这个判断没变。

变的是我对"怎么让AI做这件事"的理解。

不是把所有东西都解析清楚再交给AI,而是让AI在模糊中找到精确的答案,然后用代码去验证。

这个工具,快了,没意外这周就可以发布。