OpenVINO™ 开发者说:把发票 OCR 搬到本地 AI PC,一个财务台账 Agent Skill 的实现记录
openlab_96bf3613
更新于 2天前
【开篇寄语】本文为 OpenVINO™ 社区开发者的实践分享。此项目面向 AI PC 的本地发票 OCR 财务提取 Skill:ocr-finance-skill。该 Skill 将批量 OCR、字段抽取、财务校验和台账导出封装成一个 Agent 可调用的本地工具,用户仅需用自然语言描述“识别哪个目录、导出什么格式、需要检查哪些问题”,剩下的流程由本地 Skill 完成。OpenVINO™ 作为开源AI工具套件,期待大家结合自身场景验证与交流,共同推动技术落地。
【作者介绍】LucianaiB | 专注提质增效,探索 AI 前沿技术 MCP开发者 | Agent开发者 | Skill开发者
前言
财务报销、供应商对账、票据归档这类工作里,发票录入通常不是单纯的 OCR 问题。真正消耗时间的是后面的结构化整理:发票代码、号码、日期、购销方、税号、金额、税额、价税合计都要录入,还要检查重复票、金额不一致和缺失字段。
这次我做的项目是一个面向 AI PC 的本地发票 OCR 财务提取 Skill:ocr-finance-skill。它把批量 OCR、字段抽取、财务校验和台账导出封装成一个 Agent 可调用的本地工具,让用户用自然语言说清楚“识别哪个目录、导出什么格式、需要检查什么问题”,剩下的流程由本地 Skill 完成。
一、为什么选择发票 OCR 这个场景
发票处理是一个很适合 AI PC 的场景,原因有三点。
第一,数据敏感。发票里包含企业名称、纳税人识别号、金额、交易信息等内容,很多情况下不适合直接上传到云端。
第二,流程重复。单张发票处理不复杂,但一旦进入月度报销、供应商对账或历史票据归档,数量上来之后,重复劳动会非常明显。
第三,结果需要可复核。财务场景不能只返回一段 OCR 文本,还需要结构化字段、导出台账,以及明确告诉用户哪些票据需要人工复核。
所以这个项目的目标不是做一个“能识别图片文字”的 Demo,而是做一个能落到财务流程里的本地 Agent Skill。
二、项目能力概览
当前版本支持以下能力:
批量处理本地发票图片和 PDF。
抽取发票代码、发票号码、开票日期、购方名称、购方税号、销方名称、销方税号、金额、税额、价税合计。
导出 JSON、CSV、XLSX 三种结果。
生成 review_items.json 复核清单。
检查金额不一致、重复发票、缺失字段、低置信度结果。
默认使用 RapidOCR + OpenVINO 本地推理。
保留 INT8 权重量化实验后端,便于对比端侧模型优化效果。
一次典型调用如下:
python -m skill.invoice_ocr.cli `--input .\samples\public\fuxijia_vat_100 `--output .\runs\fuxijia-vat-100-openvino-optimized `--format json,csv,xlsx `--ocr-backend rapidocr-openvin
输出目录中会生成:
results.json 完整结构化结果results.csv 可导入财务系统的台账results.xlsx 方便人工查看的 Excelreview_items.json 需要复核的异常票据
三、整体架构
项目被拆成四层:
用户自然语言需求↓Agent Skill 调用↓本地 OCR + 字段抽取 + 财务校验↓JSON / CSV / XLSX / 复核清单
代码目录大致如下:
skill/invoice_ocr/cli.py 命令行入口pipeline.py OCR pipelineextractors.py 字段抽取和后处理validators.py 财务校验exporters.py JSON/CSV/XLSX 导出schemas.py 数据结构scripts/export_openvino.pyquantize_openvino_weights.pybenchmark.pycompare_backends.pyagent_command_test.pydocs/benchmark 报告、优化记录、提交摘要
这种拆分的好处是:OCR 引擎、字段抽取、财务规则和导出格式互相独立,后续要替换模型或增加票据类型时,不需要重写整个流程。
四、OpenVINO 本地推理
项目默认后端是:
rapidocr-openvino也就是 RapidOCR 调用 OpenVINO 推理引擎完成 OCR。为了对比不同本地后端,我保留了几个选项:rapidocr RapidOCR + ONNXRuntimerapidocr-openvino RapidOCR + OpenVINO,默认推荐rapidocr-openvino-int8 检测、方向分类、识别全部使用 INT8 实验模型rapidocr-openvino-int8-cls 仅方向分类模型使用 INT8sidecar 读取同名 txt,用于稳定测试
在 5 张公开 VAT 样本上,OpenVINO 后端相比普通 RapidOCR 有明显速度优势:
可以看到,rapidocr-openvino 在识别行数不下降的情况下速度更好,因此当前作为默认后端。
INT8 实验也保留了下来,但它没有直接作为默认方案。原因是全 INT8 虽然可以端到端跑通,但在公开 VAT 样本中识别行数下降比较明显。后续如果要继续做量化,需要配合更完整的校准集,而不是只追求模型体积变小。
五、从 OCR 文本到财务字段
发票 OCR 的难点不只是识别文字,而是把文字变成可靠字段。
例如 OCR 可能把同一栏拆成多行:
名
称:
佳作天成(北京)科技有限公司
也可能把销售方标签拆成:
销
售方
早期版本主要依赖关键词附近的文本行,遇到这种情况会漏掉购销方名称。后来我增加了基于 OCR 坐标的版面后处理:不仅看文字内容,也看字段在票面中的位置关系。
金额抽取也类似。发票中经常同时出现商品行金额、合计行金额、价税合计金额,如果只按文本顺序抓第一个金额,很容易把商品行金额当成合计金额。现在的后处理会优先识别:
表格中的“金额 / 税率 / 税额”列;
“合计”行;
“价税合计(小写)”附近的金额;
金额 + 税额 = 价税合计的财务一致性。
这让项目从“能 OCR”更接近“能做财务台账”。
六、财务复核规则
当前复核规则包括:
金额 + 税额是否等于价税合计;
是否缺失发票号码;
是否缺失开票日期;
是否缺失金额、税额或价税合计;
OCR 平均置信度是否低于阈值;
是否存在重复发票。
重复发票一开始只按发票号码判断,后来改为优先使用:
发票代码 + 发票号码
这样更符合真实财务语义,也减少了误判风险。
七、公开 VAT 样本验证
我使用公开 VAT 发票样本进行了验证。
最新 100 张样本运行结果如下:
指标 | 当前结果 |
发票代码 | 100/100 |
发票号码 | 100/100 |
开票日期 | 95/100 |
金额 | 100/100 |
税额 | 100/100 |
价税合计 | 100/100 |
OCR 识别行数 | 6437 |
后处理优化前后对比:
指标 | 优化前 | 优化后 |
购方名称缺失 | 46 | 13 |
销方名称缺失 | 42 | 3 |
金额不一致异常 | 26 | 1 |
开票日期缺失 | 5 | 5 |
这次优化没有改 OCR 引擎,而是增强了 OCR 之后的版面理解和财务一致性规则。结果说明:对于发票这类强版式文档,后处理质量对最终可用性影响很大。
需要说明的是,100 张样本里存在大量重复票据,因此 review_items.json 中仍会出现较多重复发票复核项。这不是 OCR 失败,而是复核规则识别到了相同的发票代码和发票号码组合。
八、Agent Skill 封装
为了让它更像一个 Agent 可用的能力,而不是普通脚本,我把项目整理成了 Skill 形式:SKILL.md
README.mdrequirements.txtrequirements-ocr.txtskill/scripts/docs/samples/
用户不需要记住内部实现细节,只需要表达任务:
请识别这个目录下的所有发票,导出 Excel,并列出重复发票和金额异常项。
Agent 可以把它转成稳定的本地工具调用,最终返回输出目录、处理数量、关键字段和复核清单。
这类封装方式适合 AI PC 场景:大模型负责理解意图,本地 Skill 负责确定性执行,敏感数据留在本机。
九、本地隐私和可控性
发票数据通常不适合随意上传。这个项目默认只读取本地文件,不上传云端,也不移动或删除原始发票。
所有结果都落在本地输出目录:
runs/
对财务人员来说,这种方式的好处是:
原始文件仍在本地;
结构化结果可以审计;
异常项可以复核;
台账可以直接交给后续系统或人工流程。
十、总结
这个项目的核心思路是:把发票 OCR 从“识别文字”推进到“生成可复核的财务台账”。
从应用价值来看,它非常适合 AI PC 场景。发票数据天然包含企业名称、税号、金额和交易信息,隐私要求高,不适合随意上传云端。本项目默认在本地读取、本地推理、本地导出,原始票据不离开设备,结果也沉淀在本地目录中。这种方式既保留了 AI 自动化带来的效率提升,也兼顾了财务数据的安全边界。
从技术实现来看,项目已经形成了比较完整的端侧智能工作流:RapidOCR 负责基础识别,OpenVINO 负责本地推理优化,后处理规则负责把 OCR 文本转成结构化财务字段,校验模块负责发现重复发票、金额不一致和缺失字段,最后再导出 JSON、CSV、XLSX 和复核清单。也就是说,它不是一个孤立的 OCR Demo,而是一个可以直接嵌入办公流程的 Agent Skill。
在公开 VAT 样本验证中,当前版本已经能够稳定抽取发票代码、发票号码、金额、税额和价税合计;经过后处理优化后,金额不一致异常从 26 条降到 1 条,销方名称缺失从 42 条降到 3 条,购方名称缺失也明显下降。这说明对于发票这类强版式文档,单纯依赖 OCR 并不够,结合版面位置和财务一致性规则,才能真正提升最终可用性。
当然,当前版本也有一些客观限制。由于手头设备环境限制,还没有在 Intel Core Ultra / NPU 设备上补充真实 NPU benchmark;少量样本仍存在开票日期或购方名称识别不完整的问题,后续还可以继续针对日期区域、购方区域和更多票据类型做专项增强。这些不足并不影响当前作品的演示和提交,但也为后续优化留下了明确方向。
整体来看,ocr-finance-skill 已经完成了从本地 OCR、OpenVINO 推理、字段抽取、财务复核到 Skill 封装的完整闭环。它的优势不只是“能识别发票”,而是把一个真实、重复、敏感且高频的财务办公流程,变成了 AI PC 上可控、可复核、可扩展的本地智能能力。发票 OCR 只是起点,同样的模式未来还可以扩展到报销单、采购单、合同、对账单等更多企业文档场景,具备很强的实际落地价值和延展空间。
Skills体验地址:https://www.modelscope.cn/skills/WEIAIb/ocr-finance-skill