审计核验官
补 Excel 在审计逻辑上的缺口:Excel 会算数,不会做审计判断 —— 不会按凭证号重算借贷平衡、不会把四张表按票号与对手方做多对多匹配、不会递推流水余额、不会算税负率、不会做分层抽样。这些正是本技能要做的。
什么时候用
- 用户给了财务流水 / 凭证 / 发票台账 / 合同 / 报销单,要求查问题、查异常、查舞弊迹象
- 用户要「审计底稿」「工作底稿」「抽样」「重要性水平」
- 用户提到借贷不平衡、三单匹配、进销项倒挂、税负率低、公转私、大额整数、可疑交易、洗钱
- 用户在做内审 / 尽调 / 财务复核 / 税务自查
不承担:出具正式审计报告、发表审计意见、代替函证与监盘、判定某项交易是否真的构成洗钱或偷税。本技能产出的是底稿草稿与风险线索,最终判断必须由执业人员复核。
五条铁律(不可绕过)
- 不联网。 数据敏感,全程本地。发票真伪查验、工商核验只能给出「该查哪些」,不得代查。
- 不假装。 缺哪张表,就说对应规则被跳过 —— 引擎会在报告第〇节列出未识别字段,并把规则失效写进底稿。绝不允许在数据缺失时输出「未发现异常」而不加说明。
- 每条异常必须带「进一步审计程序」。 这是引擎的硬约束,也是本技能的底线。不允许出现只有问题、没有处置建议的条目。
- 异常 ≠ 错报。 引擎标记的是「风险迹象」。严禁推算错报金额——引擎已内置该禁令,任何情况下不得绕过它自行加一个「推断错报」数字。
- 阈值必须按项目调整。 默认值(大额 5 万、公转私 20 万、税负预警 1%、进销差额 30%)是经验值。拿到被审计主体的规模与行业后必须复核,调整后重跑,并把调整依据写进底稿。
工作流
第一步:锁定三个口径(缺就要问,别猜)
- 被审计单位名称(写进底稿表头)
- 会计期间(决定「跨期入账」判定;格式
2026-01-01 至 2026-06-30) - 重要性水平基准 —— 没有就不填,引擎会按「凭证借方发生额合计 × 0.5%」自动测算,并在底稿里写明这是自动值、须复核
第二步:让数据落地(三条路径,按用户手上有啥选)
| 用户手上有什么 | 怎么做 |
|---|---|
| 已有 CSV/Excel 台账 | 放进同一个目录,直接跑 --dir。表头不用改,引擎自带别名识别 |
| 什么都没有,愿意填 | 用 assets/templates/ 的 5 张空白表,粘进去 |
| 只有截图 / 粘贴的文本 | 由你转成模板结构。看不清的字段留空并在底稿注明「待补录」,不要猜金额、票号、日期 |
投料优先级:凭证分录(必需)> 银行流水 > 发票台账 > 报销单 > 合同台账。缺表的影响见 references/usage-guide.md。
第三步:跑引擎
python scripts/audit_engine.py --dir <数据目录> --outdir <输出目录> \
--entity "某某有限公司" --period "2026-01-01 至 2026-06-30" \
--preparer "张三" --reviewer "李四"
依赖 openpyxl(仅读 .xlsx 时需要;纯 CSV 无需任何第三方库):
python -m pip install --quiet openpyxl
阈值按项目调(完整清单见 references/rules-and-thresholds.md):
--materiality 80000 --large 100000 --private-large 500000 --vat-warn 0.02
产出两个文件:审计核验报告_<时间戳>.md(三份标准输出)与 凭证核验异常清单_<时间戳>.csv(清单单独导出,便于给复核人)。
第四步:复核产出再交付
不要把引擎输出直接原样发给用户。 必须先做这三件事:
- 核一遍高危项。看是否有明显误报(例如把真实的红字冲销当成「负数金额异常」、把正常往来款当成「无票采购」)。有误报就在交付时点明,不要藏。
- 把默认阈值换成项目实际值,重跑一次。改了什么、为什么改,写进交付说明。
- 标注底稿状态:这是草稿,未经项目负责人复核签字不得入卷。这句话必须在交付里出现。
输出结构
| 章节 | 内容 |
|---|---|
| 〇 | 输入数据与字段识别情况(含未识别字段告警) |
| 【凭证核验异常清单】 | 序号 / 风险等级 / 异常类型 / 涉及金额 / 涉及单据 / 异常描述 / 建议核查方向 |
| 【审计底稿草稿】 | 目标 → 依据与标准 → 已执行程序 → 抽样方法与结果 → 审计发现 → 附表 A 大额交易明细表 → 结论 → 进一步审计程序 → 局限性 |
| 税务及合规风险提示 | 分散在「税务·」「反洗钱·」两类异常中,并在底稿结论与必做程序中单列 |
关键设计:降噪原则(不要改)
「整数大额交易」是形式特征。若该对手方在发票台账或合同台账中有记录,引擎不再单列为异常,只放进附表 A 大额交易明细表。
理由:不降噪的话异常清单会被「30 万货款」这类有完整票据支撑的正常业务淹没,真正的可疑项被埋掉。第一版没做这件事时输出 105 项(29 项高危)噪音,降噪后 42 项且全部可追溯。
资源索引
scripts/audit_engine.py—— 引擎本体(唯一入口,文本 CSV/Excel 均可)scripts/make_demo_data.py—— 生成含 27 处已知异常的示例数据scripts/self_test.py—— 自检:验证 28 类规则命中 + 底稿 11 节完整 + 5 条硬约束references/usage-guide.md—— 投料清单、缺表影响、全部命令行参数、已知边界references/field-mapping.md—— 五张表的字段别名对照表(用户表头对不上时查这里)references/rules-and-thresholds.md—— 28 条规则清单、默认阈值、对应财务报表认定assets/templates/—— 5 张空白投料表(ASCII 文件名,可被引擎自动识别)examples/demo/—— 示例数据
自检
改动引擎或阈值后,务必跑一次:
python scripts/self_test.py
返回 PASS 才算可用。它会核验 28 类预埋异常是否全部命中、底稿 11 节是否完整、5 条硬约束是否满足。
常见故障
| 现象 | 原因与处置 |
|---|---|
| 报告第〇节出现「未识别字段」 | 用户表头与别名表都不匹配。查 references/field-mapping.md,或用 assets/templates/ 的表头改名后重跑 |
| 大量「跨期入账」误报 | --period 没传或格式不对。必须写成 2026-01-01 至 2026-06-30 |
| 反洗钱规则全部没触发 | 缺银行流水表。文件名需含 bank/流水/银行/对账 |
| 三单匹配全部没触发 | 缺发票台账或报销单 |
| 读 .xlsx 报 ModuleNotFoundError | python -m pip install openpyxl |
| 中文显示乱码 | 终端编码问题,报告文件本身是 UTF-8,不影响。用 Read 工具查看 |