AI 审计 · 本地知识库 · 数据全程不出网

某煤矿项目审计知识库

将 14GB 扫描件、会计账套与合同协议,转化为支持自然语言查询、自动溯源至原始页码、并能主动识别审计疑点的 AI 审计助手 —— 数据全程不出本机。

Mac M4 Pro · 48GB Apple Vision OCR Dify(arm64 原生) Ollama + Qwen3.6 BGE-M3 向量检索 本地部署 · 保密合规

1为什么做这件事

某煤矿项目积累了大量审计资料,形式以扫描件 PDF、合同图片和会计账套导出表为主。人工查阅效率低、跨文档难以关联核对、疑点发现高度依赖个人经验。

审计资料总量
14 GB
月度凭证扫描件 + 合同图片 + 账套
账套科目
309 个
总账 / 明细账 / 余额表 / 汇总表
合同协议
8 份
合作合同 / 共管协议 / 三方协议…
资金账期
2019–2025
6 年 8 个月全周期账

核心痛点

痛点现状影响
资料查阅效率低14GB 扫描件需逐页人工查阅核查周期长、易遗漏
跨文档难以关联合同条款与实际账目分散于不同文件难以开展勾稽与交叉验证
疑点依赖经验异常金额、关联交易凭经验判断线索发现不全面
溯源难结论要回到原始页码逐一核对底稿引用费时
保密硬约束审计资料不能上公有云市面 SaaS 工具不可用
类比:像面对一堆没装订、没目录的几万页档案找一笔钱的来龙去脉 —— 全凭审计员脑子记。这套系统给档案装上「自动识字 + 语义检索 + 溯源引用 + 疑点提醒」,且全程锁在本机。

2数据画像

资料分三类:会计账套(电子表,金额精确)、合同协议(扫描件/图片)、月度凭证(海量扫描件)。处理策略各不相同。

原始数据结构

会计账套(.xls) 会计软件导出 · 金额精确 总账 · 全科目月度发生 明细账 · 309 科目逐笔 科目余额表 · 期初期末 科目汇总表 · 借贷累计 代偿款利息计算明细 合同协议(PDF/PNG) 8 份 · 扫描件 / 图片 合作合同 / 共管 / 三方协议 ✓ Apple Vision OCR · 零失败页 月度凭证扫描件 约 2.4 万页 · 2019–2022 ⚠ OCR 质量差 · 暂不全量入库

关键数据特征

#特征 / 缺口处理
1账套是电子表,金额精确,无需 OCR直接转 MD
2合同是扫描件,需 OCR 且要保页码溯源Vision OCR
3月度凭证 2.4 万页,质量差、信息密度低按需调阅原件
4财务表格行列结构,纯文字 OCR 会拍平表格单独识别
5资料含个人信息与敏感金额全程本地
取舍:并非所有资料都适合全量入库。会计账套(数据精确)与合同协议(关键条款)优先构建为高质量知识库;2.4 万页月度凭证扫描件因 OCR 质量较低、信息密度稀薄,暂不全量入库,涉及具体月份凭证时按页调阅原件 —— 将算力资源集中于核心数据。

3为什么是这套方案(Mac 专属)

初始方案基于 NVIDIA + RAGFlow 技术栈设计。部署平台调整为 Apple Silicon(Mac)后,存在两项架构层面的兼容性约束,需在方案设计阶段予以规避。

约束一 · RAGFlow 未提供 arm64 镜像
官方说明其全部 Docker 镜像仅面向 x86 架构构建。在 Apple Silicon 上部署需自行编译或借助 x86 指令集模拟,前者维护成本高、后者运行效率显著下降,均不满足生产可用性要求。
约束二 · 容器无法调用 Apple GPU
Docker Desktop for Mac 不支持将 Apple GPU(Metal)透传至容器内部。任何在容器中执行的 GPU 加速 OCR 任务均会回退至 CPU 运算,处理性能大幅降低。

两项架构调整

调整一 · OCR 与 RAG 解耦
OCR 原生进程化
OCR 任务交由 macOS 原生 Apple Vision 框架处理,以原生进程运行、直接调用神经引擎与 GPU 加速,原生支持简体中文,不依赖容器环境,从根本上规避 GPU 透传限制。
调整二 · RAG 平台选型 Dify
arm64 原生镜像
Dify 官方提供完整 arm64 架构镜像(api / web / sandbox),可在 Apple Silicon 上原生运行,无需模拟,并内置团队账号体系、知识库管理与应用编排能力。
组件选型用途Apple Silicon 适配说明
OCR 解析Apple Vision(ocrmac)扫描件文字识别原生神经引擎加速,中文识别精度高,不依赖容器
表格识别PaddleOCR(PP-Structure)财务表格结构还原规避纯文字 OCR 对表格行列结构的破坏
RAG 平台Dify(开源)知识库 / 检索 / 编排 / 协作提供 arm64 原生镜像
本地 LLMOllama + Qwen3.6问答推理,数据不出网原生 Metal 加速
EmbeddingOllama + bge-m3中文语义向量化多语言模型,中文语义表现优异
硬件Mac M4 Pro · 48GB 统一内存全流程承载统一内存架构,显存容量充裕

4系统总览架构

五层架构:用户层 → 应用层 → 检索层 → 模型层 → 数据层。算力密集型任务(OCR、大模型)以原生进程运行于容器之外,Dify 在容器内承担编排职责。

① 用户层 审计团队浏览器访问(本机 localhost / 局域网 IP)· 自然语言提问 · 多成员账号 ② 应用层 — Dify(Docker · arm64) 煤矿审计助手 · 系统提示词编排 · 知识库关联 · 团队成员管理 引用溯源 · 异常标注 · 对话历史 ③ 检索层 — 混合检索 向量召回(bge-m3) + 关键词召回(BM25) + 可选 Rerank · Top-K=8 · 按页码分块 ④ 模型层 — Ollama(原生 Metal) Qwen3.6(对话推理) · bge-m3(中文向量化)· 全本地,经 host.docker.internal 调用 ⑤ 数据层 账套 MD · 合同 TXT(带页码)· Weaviate 向量库 · PostgreSQL · Redis
设计原则:算力密集型环节(OCR、大模型推理、向量化)均以原生进程运行于容器之外,充分利用 Metal 加速;Dify 在容器内承担编排与检索,CPU 运算即可满足。模型替换、知识库扩充、团队扩展互不影响,审计资料全程不出本机。

5OCR 双路解析

这是 Mac 方案的核心:扫描件先用原生 OCR 转成带页码的结构化文本,再导入 Dify。纯文字走 Vision(快、中文好),财务表格走 PaddleOCR(结构准)。

路径 A
Apple Vision(ocrmac)
处理:合同、协议等以文字为主的扫描件
优势:走神经引擎,中文精度高,M4 上 accurate 模式约 130–200ms/页
关键:每页打 ===== 第 N 页 ===== 标记,溯源到页
路径 B
PaddleOCR(PP-Structure)
处理:含财务表格的月度数据 PDF
原因:纯文字 OCR 会破坏表格行列结构,导致金额与科目错位
输出:还原为 HTML / Markdown 结构化表格

页码溯源是审计刚需

# 来源文件:账户共管协议

===== 第 1 页 =====
甲方:乙方公司(被合作煤矿)
乙方:甲方公司(生产经营方)
...
===== 第 2 页 =====
持卡人:共管账户持卡人
开户行:某商业银行支行
账号:6222 **** **** ****
...
实际成果:8 份合同协议全部 Apple Vision OCR 完成,零失败页、质量高。模型回答能精确溯源到【账户共管协议 第2页】这样的引用格式,满足审计底稿规范。

账套不走 OCR

5 份 .xls 账套为会计软件直接导出的电子表,金额本已精确,无需 OCR —— 由脚本直接转换为 Markdown 表格入库,效率高且不引入识别误差。

6RAG 问答端到端流程

从审计员一句话提问,到带页码引用的答案,系统内部的 6 步流水。

1
提问:审计员以自然语言提问,如"个人账户A 2022 年 1 月那笔约 1380 万元是什么业务?"
2
向量召回:bge-m3 把问题编码,在 Weaviate 检索语义最近的分块 Top-K
3
关键词召回:BM25 命中"个人账户A""约 1380 万元""2022-01"等关键术语,补足向量召回
4
融合排序:向量 + 关键词结果去重融合,可选 Rerank 精排,取 Top-8 进上下文
5
生成回答:Qwen3.6 基于检索到的账套/合同片段作答,标注来源文档名 + 页码/科目
6
异常提示:发现数据矛盾、金额异常、关联交易时主动打 ⚠️,提醒核对原件
系统提示词约束:每个关键信息必须标注来源(如【明细账 1001库存现金】);金额、日期给原文精确数字不推测;找不到就明说"未在现有资料中找到",不编造。这让 AI 答案能直接进审计底稿。

7检索与融合打分

向量召回靠余弦相似度抓语义,关键词召回靠 BM25 抓关键术语(角色代称、金额量级、脱敏卡号),两路融合互补。

向量余弦相似度

cos_sim(q, d) = (q · d) / (|q| × |d|)    取值 [-1, 1],越接近 1 越相似

混合检索融合(实时计算器)

两路召回融合分数公式(拖动权重看融合分如何变化,以一个候选分块为例):

final_score = α · vec + β · bm25
0.60
0.40

vec = 0.86 · α= 0.516
bm25 = 0.72 · β= 0.288
final_score= 0.804
为什么要混合检索:纯向量召回擅长语义("回款分配"能匹配到"按吨煤收益分配"),但对卡号 6222 **** **** ****、金额 约 1380 万元 这种关键串容易漏;BM25 关键词召回正好补上。审计场景里金额量级和关键账户极重要,所以两路都要。

分块策略

参数设定原因
分段标识\n=====对齐 OCR 页码标记,每页独立成块,溯源准
最大分段512 tokensbalance 上下文完整与检索精度
分段重叠128 tokens避免关键信息被切在分块边界丢失
索引方式高质量(bge-m3)中文语义向量化效果好
检索方式混合检索向量 + 关键词,精确数字不漏

8端到端问答演示

以"替乙方公司代偿了哪些债务,总共多少钱?"为例,走完一次完整问答。

Step 1 · 提问

审计员: "替乙方公司代偿了哪些债务,总共多少钱?"

Step 2 · 混合检索命中

命中分块
向量代偿款利息计算明细 · 其他应收款-代偿款科目 · 合作合同代偿条款
关键词命中"代偿""乙方公司""乙方法定代表人""环保处罚款"等术语

Step 3 · Qwen3.6 生成回答

替乙方公司代偿款共 136 笔,合计约 1400 万元(其他应收款-代偿款科目)。

重点代偿事项:
| 事项 | 金额 | 备注 |
|------|---------|------|
| 环保处罚款 | 百万元级 | 2019-04-04,单笔较大 ⚠️ |
| 代偿乙方法定代表人借款/欠款 | 百万元级 | 乙方法定代表人 |
| 代偿工资款 | 数十万级 | |
| 代偿税款 | 数十万级 | |

⚠️ 核查建议:代偿是否有合同依据、能否收回、利息计算是否合理、
   代付罚款的合规性。

来源:【代偿款利息计算明细】【明细账 其他应收款-代偿款】
注:涉及具体业务建议调阅对应记账凭证原件核实。
可溯源、可复核:答案直接给出金额量级、笔数、重点事项,并标注来源科目与文档,主动用 ⚠️ 提示核查方向。审计员复核时按引用回原始账套即可,不必从头翻。

9审计疑点成果

基于账套结构化数据的初步扫描,系统已辅助梳理出 5 大核心疑点(金额均已按量级脱敏,涉及具体业务需调阅记账凭证核实)。

⚠️ 疑点 1 · 库存现金流水亿元级,异常

库存现金科目借贷方累计均为 亿元级。现金科目出现如此巨额流水不正常,疑似大额现金收付或将银行业务挂账现金科目。
核查方向:调阅大额现金收付凭证,核实资金真实流向与单据完整性。

⚠️ 疑点 2 · 个人银行卡疑似作公司资金过渡账户

总账单月大额中出现以个人名义记账的科目:"个人账户A" 2022 年 1 月借方 约 1380 万元(与当月库存现金发生额相互印证);"甲方法定代表人个人卡" 2022 年 7 月借方 约 960 万元。与合同"销售回款走共管账户持卡人个人账户共管"相互印证。
核查方向:个人卡走公司大额资金的合规性、是否存在账外资金、税务风险。

⚠️ 疑点 3 · 替乙方公司代偿资金约 1400 万元

其他应收款-代偿款共 136 笔,合计 约 1400 万元。含付环保处罚款百万元级、代偿乙方法定代表人借款多笔百万元级、工资款数十万级、税款数十万级。
核查方向:代偿是否有合同依据、能否收回、利息计算是否合理。

⚠️ 疑点 4 · 财务费用 / 应付利息均为亿元级

财务费用借方累计、应付利息贷方累计均为 亿元级。项目利息负担极重。
核查方向:借款来源(是否关联方)、利率水平、利息计提依据。

⚠️ 疑点 5 · 其他应付款贷方亿元级

其他应付款贷方累计为 亿元级,借方为千万级。
核查方向:挂账明细、是否含关联方往来或体外资金。

资金规模概览(科目汇总表 · 全期累计)

科目借方合计贷方合计
库存现金亿元级亿元级
财务费用亿元级亿元级
应付利息千万级亿元级
其他应付款千万级亿元级
主营业务收入亿元级亿元级
其他应收款千万级千万级
主营业务成本千万级千万级
项目背景:2018 年 12 月甲方公司与乙方公司签《煤矿生产经营合作合同》,甲方公司负责矿井建设、生产、销售,按吨煤收益的 80% 向乙方公司债权人按比例分配。因乙方公司对公账户被法院冻结,煤炭销售回款经协议走第三方个人账户(共管账户持卡人,某商业银行支行)共管 —— 这是疑点 2 个人卡走账的合同依据。

10关键指标与现状

当前已搭建完成的系统现状。

已建成的知识库

知识库内容文档数
煤矿账套数据总账、明细账(309 科目)、科目余额表、科目汇总表、代偿款利息明细、审计线索清单6
煤矿合同协议合作合同、账户共管协议、三方协议(三方协议关系人)、乙方公司全部合同、审计报告、工程结算单、账户证明8

系统现状

部署平台
Dify · 12 容器
arm64 原生 · localhost
对话模型
Qwen3.6
本地 Ollama · Metal
向量模型
bge-m3
中文语义检索
合同 OCR
零失败页
Apple Vision · 质量高
数据出网
0
全程锁在本机
审计疑点
5 大类
已辅助梳理成清单
最后一步(需在浏览器手动操作 · 约 3 分钟):知识库 API 密钥无法用于创建应用,需登录 Dify → 工作室 → 创建空白应用 → 聊天助手 → 命名「煤矿审计助手」→ 上下文勾选两个知识库 → 粘贴系统提示词 → 发布。完成后即可使用自然语言提问。

11本地 vs 云端对比

为什么审计场景坚持本地部署,而不是用现成的云端大模型 API。

维度本地(本方案)云端 API
数据保密资料不出本机需上传到第三方
合规性满足审计资料保密要求敏感账套上云有风险
持续成本电费极低,模型免费按 token 计费
响应速度本地推理,无网络往返受网络与限流影响
复杂推理Qwen3.6 可满足需求能力更强,可脱敏后选用
折中方案:默认全部走本地 Qwen3.6,数据不出网。仅当遇到需要复杂推理、且数据可脱敏的场景时,才可选接入 Claude 等云端 API(约 50–300 元/月)。涉及敏感审计数据的查询始终走本地。

12FAQ

为什么不用现成的 RAGFlow?

RAGFlow 官方仅提供 x86 架构镜像,未发布 arm64 版本。在 Apple Silicon 上部署需自行编译或借助 x86 指令集模拟,维护成本与运行效率均不理想。故选用 Dify —— 其官方提供 arm64 原生镜像,可在 Mac 上原生运行,并内置团队账号体系、知识库管理与应用编排能力。

为什么 OCR 不放进 Docker?

Docker Desktop for Mac 不支持将 Apple GPU(Metal)透传至容器,容器内 OCR 只能依赖 CPU 运算,性能显著下降。因此 OCR 采用 Apple Vision 框架以原生进程运行,直接调用神经引擎与 GPU 加速,并原生支持简体中文。Docker 仅承载 Dify 编排服务,CPU 运算即可满足。

为什么财务表格要单独走 PaddleOCR?

Apple Vision 输出为纯文字流,会破坏表格的行列结构 —— 这对财务数据是致命缺陷(金额与科目错位)。因此含表格的 PDF 改由 PaddleOCR 的 PP-Structure 进行表格识别,还原 HTML / Markdown 表格结构,确保金额与科目准确对应。

2.4 万页月度凭证为什么不全量入库?

这些扫描件 OCR 质量较低、信息密度稀薄,全量入库性价比不高,且会稀释整体检索质量。处理策略为:会计账套(电子表,数据精确)与合同协议(关键条款)构建为高质量知识库;涉及具体月份凭证时,按页码调阅原件 —— 将算力资源集中于核心数据。

AI 答案能直接进审计底稿吗?

能,但需复核。系统提示词强制每个关键信息标注来源(如【账户共管协议 第2页】【明细账 1001库存现金】),金额给原文精确数字不推测,找不到就明说不编造。审计员按引用回原始资料核对即可。同时系统会提醒:扫描件 OCR 可能有误差,关键金额建议核对原件。

数据真的不出网吗?

是。对话模型 Qwen3.6 与向量模型 bge-m3 均通过本地 Ollama 运行于本机,Dify 同样以本地 Docker 部署,向量库与数据库亦在本机。整条链路不向任何外部服务发送资料。仅当主动选择接入云端 API(可选项)时才存在数据外发,该选项默认关闭。

团队多人怎么用?

给这台 Mac 设固定内网 IP(路由器绑 MAC 地址),团队成员浏览器访问 http://<MacIP> 即可。Dify「设置 → 成员」里添加团队账号,分配管理员/编辑/普通成员角色。本地模型也可设为监听 0.0.0.0 供局域网调用。

换了对话模型,知识库要重建吗?

无需重建。更换对话模型(如 Qwen 升级版本)仅需在 Dify 模型设置中修改模型名称,知识库无需变动。但更换 Embedding 模型必须重建知识库索引 —— 因向量维度与语义空间发生变化,原有向量不再兼容。

13交付资产沉淀

系统交付时,结构化数据、脚本、配置全部归甲方,构成可长期演进、可复用的数字资产。

账套结构化
01–05_*.md
总账/明细账/科目余额表/科目汇总表/代偿款利息明细,会计软件导出转 MD
合同结构化
合同协议/*.txt
8 份合同 OCR 文本,带页码标记,可溯源
审计线索
审计线索清单.md
5 大疑点 + 资金规模概览 + 核查建议
转换脚本
convert_ledgers.py
账套 .xls → Markdown 批量转换
OCR 脚本
ocr_contracts.py
Apple Vision 批量 OCR,带页码标记
导入脚本
import_to_dify.py
结构化文本批量导入 Dify 知识库
平台编排
dify/docker/
docker compose up -d 一键启动全套服务
运行日志
日志/
OCR / 模型拉取 / Dify 启动全程留痕

14技术栈一览

选型说明
OCR(文字)Apple Vision(ocrmac)macOS 原生框架,神经引擎加速,原生中文,不依赖容器
OCR(表格)PaddleOCR PP-Structure还原财务表格行列结构
RAG 平台Dify(开源)arm64 原生镜像 · 知识库 / 检索 / 编排 / 团队
LLMQwen3.6本地 Ollama · Metal 加速 · 数据不出网
Embeddingbge-m3智源开源,中文语义 SOTA
向量库WeaviateDify 默认,Docker 内
关系库 / 缓存PostgreSQL / RedisDify 元数据与队列
模型运行时Ollama(原生)无需 GPU toolkit,安装后即享 Metal 加速
部署Docker Compose仅 Dify,CPU 即可
硬件Mac M4 Pro · 48GB · macOS 26.2统一内存即显存
全本地 · 全开源:核心组件全部开源,无订阅费用、无厂商锁定;模型权重、结构化数据、脚本配置均纳入交付范围。核心优势在于 —— 审计资料全程不出本机,满足保密合规要求。

15使用与维护

日常怎么用、怎么加新资料、怎么备份。

日常提问示例

· 煤炭销售回款按什么比例分配?(答:吨煤收益 80% 向债权人分配)
· 替乙方公司代偿了哪些债务,总共多少钱?
· 账户共管协议指定的持卡人是谁?卡号开户行?
· 个人账户A 2022 年 1 月那笔约 1380 万元是什么业务?
· 库存现金科目为什么有亿元级流水?

加新资料

1
新账套:改 脚本/convert_ledgers.py 跑转换
2
新合同扫描件:改 脚本/ocr_contracts.py 的 TARGETS 跑 OCR
3
import_to_dify.py 文件列表,重跑导入,等索引完成后抽检

备份

# Dify 数据(知识库 + 向量库 + 配置)
cd ~/业务/煤炭/知识库构建/dify/docker
tar -czf ~/dify备份-$(date +%Y%m%d).tar.gz volumes/

# 结构化输出(重做 OCR 很费时)
tar -czf ~/输出备份-$(date +%Y%m%d).tar.gz ~/业务/煤炭/知识库构建/结构化输出/
维护建议:回答不够准确 → 调小 Top-K、开启 Rerank;无法检索到已有信息 → 检查分段大小、确认文档已完成索引;表格数据缺失 → 确认已走 PaddleOCR 表格路径并重新导入;推理速度偏慢 → 查看活动监视器,必要时更换更小参数的模型;建议每周备份一次。