第35课 · AI 复核审计报告

本节要点
- 审计报告复核为什么难:报表之间要勾稽、表和附注要对上、附注内还要横加竖加——人工核对 50-150 页报告又累又容易漏
- 旧工具的问题:让 AI 直接做数字加减会算错;附注表格结构复杂(其中项、跨列、两期并列)容易产生大量误报
- 核心思路:AI 做语义,代码做算术
- AI(Claude / DeepSeek)负责:识别报表结构、定位四表、理解附注归属、判断哪些字段要加减
- 代码负责:把数字抽出来、统一走 calculator 做加减核对、结果可复现可审计
- 用 OpenSpec 推进:把整个大需求拆成一个个可控变更(语义索引 → 表注勾稽 → manifest 结构契约 → DeepSeek 并发加速),每一步有范围、有验收、可追溯
- 三层架构:理解层(AI 生成 manifest.json + note_map.json)→ 执行层(代码抽数、计算、批量检查)→ 复核层(AI 终审,剔除误报,保留真错)
- 能查什么:四表间勾稽、表注勾稽、附注内变动表 reconcile、横加竖加、文本与格式
- 最终输出:Excel 复核报告(按类别分 sheet)+ Markdown 复核报告(带页码和原文摘录),只读不改源报告
1. 审计报告复核:最累的不是判断,是「找数和算数」
审计报告复核是财务审计里典型的高重复、高容错率工作。
一份年报动辄 50-150 页,里面涉及大量勾稽关系:
- 四表之间要平衡:资产 = 负债 + 权益;利润表推导链;现金流量表三类净额合计;权益变动表期初 + 变动 = 期末
- 表和附注要对上:报表里的「应收账款」要等于附注里的「账面余额 − 坏账准备」;「固定资产」要等于「原价 − 累计折旧 − 减值准备」
- 附注内部要自洽:变动表里的「期初 + 增加 − 减少 = 期末」;账龄表的明细之和要等于合计
- 文本格式也不能漏:公司名是否统一、金额单位是否一致、页码是否连续、有没有错别字病句
这些工作如果靠人工逐页核对,眼睛看花、手指按酸,还容易漏。所以很早之前我就在想:能不能让 AI 自动帮我做这件事?
2. 旧工具为什么不好用
我之前做过一个「审计工具箱」,里面也有报告检查功能。它效率很高,3-4 分钟能跑完一份报告,但有一个致命问题:误报太多。
原因有两个:
第一,AI 不擅长做数字加减。
大模型可以帮你理解报表、提取字段,但你让它直接算「113,157,711.68 + 5,000.00」,它可能会算错。同样两个数问两次,答案可能还不一样。而且最关键的是:没有审计轨迹,出了问题无法追溯。
所以在审计场景里,算数这件事不能交给 AI。
第二,附注表格结构太复杂。
附注里经常有这种结构:
- 「其中:」子项——明细下面还有子项,求和时不能重复计入
- 百分比列——占比列不能参与金额加减
- 两期并列——本年数和上年数混在一起,不能跨期相加
- 表头不规范、跨页续表、嵌套层级
如果让 AI 自己判断「哪些行该加、哪些列该加」,它很容易猜错,产生大量误报。然后你就要花大量人力去筛查,反而更累。
3. 核心思路:让 AI 做它擅长的,让代码做它擅长的
这次重新做这个 skill,我的核心思路特别简单:
AI 做语义理解,代码做确定性计算。
AI 擅长什么
- 看懂报告结构:四张报表在哪些页、哪里是合并口径、哪里是母公司口径
- 理解附注归属:「附注三、货币资金」这个章节讲的是货币资金
- 判断列含义:哪一列是项目名、哪一列是期末余额、哪一列是年初余额
- 识别名称变体:「股东权益」其实就是「所有者权益」
- 判断哪些字段需要做加减、哪些字段要核对
代码擅长什么
- 精确求和、核对、reconcile
- 处理千分位逗号、括号负数、全角字符、万元单位
- 批量并发执行
- 结果可复现、可核验
所以整个工具的流程就是:
AI 把数字和结构识别出来 → 代码把数字拿去算 → AI 再对结果做终审复核。
4. 用 OpenSpec 推进:把大需求拆成一步步变更
这个需求非常大,不可能一次性让 AI 写一个完整工具。我用的是 OpenSpec,把整个过程拆成多个小变更,每个变更只解决一个具体问题。
这样做有两个好处:
- 每一步都可控:做砸了只回滚一个变更,不影响全局
- 需求可追溯:每个变更都有明确范围和验收标准
整个推进路线大概是:
| 阶段 | 解决什么问题 |
|---|---|
| 语义索引 | 让 AI 理解附注结构,生成「科目 → 附注表」精确映射 |
| 表注勾稽 | 报表数 vs 附注数自动核对 |
| 结构契约 manifest | 不同报告格式列布局不同,用 JSON 声明而不是代码硬编码 |
| DeepSeek 并发加速 | 批量调用 DeepSeek API,把 AI 生成结构契约的速度提起来 |
后面我会专门讲 OpenSpec 这个插件,它比之前的 Superpowers 更适合这种「按开发流程推进变更」的场景。
5. 系统架构:三层分工
整个工具可以分成三层:
第一层:理解层
这一层由 AI(Claude)主导,只做一次:
- 识别报告类型:合并报告还是单体报告?有没有母公司报表?
- 定位四张报表:资产负债表、利润表、现金流量表、所有者权益变动表
- 生成
manifest.json:声明四表的结构,比如项目名在第几列、期末数在第几列 - 生成
note_map.json:声明每个报表科目对应附注的哪张表、取哪个字段
这两个 JSON 文件是整个工具的结构契约。后面所有计算都基于它们。
第二层:执行层
这一层由代码机械执行:
apply_manifest.py:按 manifest 声明,把四表数据抽成statements.jsoncalculator.py:所有数值计算的统一入口run_check.py:按用户选的深度,批量执行检查
这里最重要的是:所有数值计算都走 calculator,AI 绝不手算。
# 核对两个数是否相等
python3 scripts/calculator.py check "113,157,711.68" "113,157,711.68"
# 对一组数求和
python3 scripts/calculator.py sum "1,234.56 5,678.90 100.00"
# 验证变动表:期初 + 增加 - 减少 = 期末
python3 scripts/calculator.py reconcile "100" "50" "30" "120"第三层:复核层
代码批量检查完后,会产生大量结果,其中很多是误报。这时候需要 AI 做终审:
- 把报错的项对应回原文
- 判断这是真错还是特殊结构导致的误报
- 把误报剔除,把真错保留
比如附注里「货币资金」明明明细求和是 900 多万,但合计行被你改成了一堆 9,AI 终审会发现差异巨大,确认是真错。
6. 关键困难点
做这个 skill 的过程中,有三个主要困难点:
困难点 1:大模型真的不会算数
这不是贬低 AI,而是客观事实。大模型做数字加减会出错,而且结果不可复现。
解法:所有计算统一交给 calculator.py,AI 只负责识别字段和传数。
困难点 2:报告格式千变万化
不同公司、不同事务所出的报告,表格样式差别很大:
- 有的期末数在第 3 列,有的在第 5 列
- 资产负债表可能拆成两段,需要拼成一张完整表
- 表头不写「合并/母公司」,需要 AI 语义识别
- Word 里有嵌套表、合并单元格
- 四表被做成图片嵌入 PDF
解法:
- 用
manifest.json声明每家公司的列布局,换格式只改配置 - 用
python-docx处理复杂 Word 表格 - 图片报表用 MinerU 等 OCR 工具兜底
- 缺失关键项目时输出诊断,不静默跳过
困难点 3:附注表定位容易「指错表」
这是最容易出问题的环节。比如 AI 可能把「风险汇总表」当成「货币资金明细表」,或者把「养老保险表」当成「短期借款明细」。定位错了,后面一切计算都是错的。
解法:
- Claude 语义定位生成 note_map
- 代码做值校验:表合计值应该和报表值大致匹配
- 排除汇总表(一张表含多个报表科目的那种)
- 失败时 fallback 到 Claude 手动处理
7. 能检查哪些内容
这个 skill 支持四类检查:
第一类:报表间勾稽
- 资产负债表:资产总计 = 负债合计 + 所有者权益合计
- 利润表:营业利润推导链完整;利润总额 − 所得税 = 净利润
- 现金流量表:经营 + 投资 + 筹资净额 = 现金净增加额
- 权益变动表:期初 + 本期变动 = 期末
第二类:表注勾稽
覆盖 41 个主要科目,例如:
- 货币资金 = 库存现金 + 银行存款 + 其他货币资金
- 应收账款 = 账面余额 − 坏账准备
- 存货 = 各项目合计 − 存货跌价准备
- 固定资产 = 原价 − 累计折旧 − 减值准备
- 营业收入 = 主营业务收入 + 其他业务收入
第三类:附注内勾稽与横加竖加
- 变动表 reconcile:期初 + 增加 − 减少 = 期末
- 横加:账面余额 − 坏账准备 = 账面价值
- 竖加:明细之和 = 合计行
- 排除「其中:」子项、百分比列、两期列的误加
第四类:文本与格式
- 错别字、病句、前后矛盾、口径不一致
- 公司名是否统一、金额单位是否一致
- 页码是否连续、页眉是否统一
- 审计报告类型识别是否正确
8. 最终输出:Excel + Markdown 复核报告
检查完成后,会输出两个文件:
Excel 报告(6 个 sheet):
- 摘要:统计 + 按类别汇总
- 报表内勾稽
- 表注勾稽
- 附注内勾稽
- 横加竖加
- 文本格式
Markdown 报告:
- 按问题 / 存疑分章
- 每条带页码定位
- 带原文摘录,方便人工复核
这两个输出都是只读不改源报告,本身就是 audit-only 的复核底稿。
9. 使用要点
9.1 检查前需要 DeepSeek API Key
这个 skill 会调用 DeepSeek API 做批量并发(默认 30 并发,可以改成 60、100)。运行前它会检查你有没有配置 API Key,没有的话要提供一个。
模型推荐用 DeepSeek V4 Flash 这种非推理模型,速度快、成本低。
9.2 检查深度分三档
- 快速检查:只做四表间勾稽 + 格式
- 标准检查:+ 表内横加竖加 + 高频表注 + 文本
- 深度检查:+ 全部变动表 reconcile + AI 全表标注
日常复核用「标准」就够了。
9.3 规则可以自定义
skill 里有两个规则文件:
references/rules.md:内置规则库references/user_rules.md:用户自定义规则
你不用自己写 markdown,直接列一个清单告诉 AI「我还想检查这些」,让它帮你更新规则就行。
9.4 这个 skill 不是完美的
坦白说,这个 skill 目前还有不少局限:
- 复杂表格的横加竖加仍然可能误报
- 某些不规范的附注表,DeepSeek 可能提取不到目标值
- 第一次解析文档的步骤没有代码固化,速度较慢
但好处是:它可迭代。你拿自己事务所的报告去跑,遇到问题让 AI 改规则、改提示、改代码,慢慢就能调教出适合你报告格式的版本。
10. 核心 takeaway
这节课最重要的三个认知:
- AI 擅长语义理解,不擅长精确计算。做审计工具,算数必须交给代码。
- 工程化比一次性 prompt 重要。用 OpenSpec 拆变更、用 manifest/note_map 把格式差异外部化,工具才能持续迭代。
- 复杂工具要分三层:AI 理解结构 → 代码批量计算 → AI 终审误报。
我会把这个 skill 放到课程网盘里,大家可以下载后基于自己的报告格式继续调教。