Skip to content

第35课 · AI 复核审计报告

逆行的狗把审计报告撕成两半,一半交给 AI 云朵看结构,一半交给 CODE 齿轮机器算数,再用放大镜终审误报

本节要点

  • 审计报告复核为什么难:报表之间要勾稽、表和附注要对上、附注内还要横加竖加——人工核对 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,把整个过程拆成多个小变更,每个变更只解决一个具体问题。

这样做有两个好处:

  1. 每一步都可控:做砸了只回滚一个变更,不影响全局
  2. 需求可追溯:每个变更都有明确范围和验收标准

整个推进路线大概是:

阶段解决什么问题
语义索引让 AI 理解附注结构,生成「科目 → 附注表」精确映射
表注勾稽报表数 vs 附注数自动核对
结构契约 manifest不同报告格式列布局不同,用 JSON 声明而不是代码硬编码
DeepSeek 并发加速批量调用 DeepSeek API,把 AI 生成结构契约的速度提起来

后面我会专门讲 OpenSpec 这个插件,它比之前的 Superpowers 更适合这种「按开发流程推进变更」的场景。


5. 系统架构:三层分工

整个工具可以分成三层:

第一层:理解层

这一层由 AI(Claude)主导,只做一次:

  • 识别报告类型:合并报告还是单体报告?有没有母公司报表?
  • 定位四张报表:资产负债表、利润表、现金流量表、所有者权益变动表
  • 生成 manifest.json:声明四表的结构,比如项目名在第几列、期末数在第几列
  • 生成 note_map.json:声明每个报表科目对应附注的哪张表、取哪个字段

这两个 JSON 文件是整个工具的结构契约。后面所有计算都基于它们。

第二层:执行层

这一层由代码机械执行:

  • apply_manifest.py:按 manifest 声明,把四表数据抽成 statements.json
  • calculator.py:所有数值计算的统一入口
  • run_check.py:按用户选的深度,批量执行检查

这里最重要的是:所有数值计算都走 calculator,AI 绝不手算。

bash
# 核对两个数是否相等
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

这节课最重要的三个认知:

  1. AI 擅长语义理解,不擅长精确计算。做审计工具,算数必须交给代码。
  2. 工程化比一次性 prompt 重要。用 OpenSpec 拆变更、用 manifest/note_map 把格式差异外部化,工具才能持续迭代。
  3. 复杂工具要分三层:AI 理解结构 → 代码批量计算 → AI 终审误报。

我会把这个 skill 放到课程网盘里,大家可以下载后基于自己的报告格式继续调教。

© 2025 逆行的狗