如何用 AI 提取发票行项目:先保留原值,再复算总额

如何用 AI 提取发票行项目:先保留原值,再复算总额

Olivia Park
2026年9月6日· 10 分钟阅读

要用 AI 提取发票行项目,先在处理文档之前定义好一行输出的样子,保留每个原始值和页面定位,然后用确定性的公式核验金额。AI 可以提出结构化的行;但它绝不应判定缺行、来历不明的费用、币种冲突或总额不符是无关紧要的。

对于发票来说,负责任的 AI 流程尤其重要,因为整齐的 JSON 并不能证明文档被正确读取。把提取、计算和会计审批当作三个独立的阶段。

关键要点

  • 为每张发票和每条可见的行分配稳定的身份标识和来源定位。
  • 原始文本与规范化字段并列保存;绝不覆盖证据。
  • 把数量、单位净价、折让、附加费、税和舍入分开。
  • 在模型之外复算行金额和单据控制总额。
  • 把缺失、重复、含糊或不符的记录交给人处理。

什么是用 AI 提取发票行项目?

发票行项目是你的流程打算审批、核对、入账或提出异议的最小计费单位。它通常是一行可见的产品或服务,但续行、捆绑描述、贷项行、小计、运费或税额汇总在页面上可能看起来很相似。提取之前先定义粒度,以免模型只为了让表格整齐而合并或拆分行。

Peppol 账单规则区分了单据总额、发票行、折让、附加费、税目和舍入关系。[1]欧盟委员会把欧洲电子发票标准描述为一个语义数据模型,旨在支持可互操作的发票信息。[2]OASIS UBL 同样为发票行、价格、数量、折让或附加费、税和货币总额提供了各自的结构。[3]这些是设计字段时有用的参考,而不是普遍适用的税务或记账指引。

为你实际处理的单据集写一份行政策:

页面对象输出处理方式
产品或服务行一条候选行,拥有自己的行 ID
换行的描述只有在版面位置和复核都确认时,才并入上一行
页眉或页脚作为单据元数据保存,而不是计费行
折让或附加费按显示的内容,原样记录在行级或单据级
税额汇总与商品或服务行分开保存
小计或应付金额作为控制总额,而不是另一项购买的商品

如果发票是 PDF,先按照 PDF 表格提取流程处理。即使在同一个文件中,含可选文字、扫描像素、多张表格或旋转版面的页面,也可能需要不同的提取方法。

如何准备证据与行结构?

步骤 1:冻结来源包与控制总额

为原始文件分配一个不可更改的导入 ID,并记录文件名、接收时间戳、页数、印在单据上的供应商身份、发票号码、发票日期、标明的币种,以及任何获批的查重键。原件保留在受管控的来源系统中;不要让 AI 充当档案库。

提取各行之前,先从单据中记录可见的控制数,不作任何解读:

  • 标明的行金额小计;
  • 单据级的折让和附加费;
  • 按标明的税目或税率列出的税额小计;
  • 不含税总额和含税总额;
  • 预付金额、舍入金额和应付金额;
  • 每个相关金额旁标注的币种;
  • 当版面能看出来时,每页的行数。

字段缺失时记为 Not shown,而不是零。零是一个财务数值;缺失是一种证据状态。如果两页标明的币种或发票号码不同,就把两项观察都保留下来并建立一条异常,而不是挑选看起来更合理的那个。

步骤 2:建立保留来源的行结构

使用一种能够还原提取器看到了什么、规范化又改了什么的结构。实用的最低要求是:

字段用途
导入 ID / 发票 ID把每一行链接到已冻结的来源
候选行 ID发票内稳定的行身份
页面与区域定位页码加边界框、表格/行号或同等位置信息
原始行文本为复核保留的逐字证据
供应商行号印出的行号,或 Not shown
描述 / 商品标识文本与标识分开,不作猜测
数量 / 单位代码原始值和规范化值
单位净价 / 价格基数价格以及单据所用的任何基数数量
行级折让 / 附加费金额、原因和层级
税目 / 税率严格按标明内容;不推断司法辖区
报告的行金额该行印出的金额
计算的行金额确定性的重新计算结果
提取置信度分流信号,绝不能作为正确性的证据
异常 / 复核人 / 状态人工处置和审计轨迹

数值字段要把 raw_value、normalized_value 和 normalization_rule 分开保存。小数分隔符、千位分隔符、括号、后置负号以及因地区而异的币种写法,都必须按照明确的单据政策解析。提取完成后,可参考表格清理指南,但不要改动来源记录。

AI 应如何提取并规范行项目?

步骤 3:只提取可见值,不补空白

每次只处理一页或一个有边界的表格。要求模型返回符合结构的行,外加未能对应的文本和结构警告。它不应为了让发票平账而添加一个可能缺失的产品、从上一行复制数值,或把无法辨认的字符变成一个方便的数字。

只提取这个有边界的页面区域中可见的发票行证据。
返回原始行文本、页面与区域定位、候选行身份,以及
所要求的字段。保留标点、正负号、小数分隔符、币种、
单位和缺失状态。不要合并行、推断税务处理、修复总额,
或创造数值。把不确定的分段和未对应的文本放入异常。

有用的结构警告包括:跨页的行、表格内重复出现的表头、孤立的金额、没有数字单元格的描述、遮住文字的图片,以及同一字段可能对应两列。置信度分数可以帮助排定复核优先级,但分数再高也不能代替与来源的比对。

步骤 4:按明确规则规范数值

只有在保留原始值之后才规范化。按照记录在案的地区和供应商规则,解析正负号、小数符号、分组符号、百分比、单位和币种代码。遇到含糊的形式就拒绝,而不是悄悄强制转换。

例如,1.250,00 在一种惯例下可能表示 1,250.00,而 1.250 在其他地方既可能是带分组的整数,也可能是小数。模型无法仅凭格式解决这种歧义,需要有佐证的单据元数据或人工确认。

按照适用的发票规范和组织政策所要求的精度,用十进制算法处理金额。审批计算不要使用二进制浮点数。不要仅仅因为印出的总额有两位小数,就对每个中间值都进行舍入;允许舍入的环节必须来自适用的规则和发票背景。

步骤 5:确定性复算每一行

先定义公式,再应用。一个简化的行金额公式可以是:

计算的行金额 = 数量 × 单位净价 ÷ 价格基数 − 行级折让 + 行级附加费

这是一个控制公式,而不是普遍适用的税务规则。有些单据对价格基数、折扣、附加费、税、贷项或舍入的表达方式不同。Peppol 为采用其规范的发票公布了明确的计算和舍入规则。[1]只有当发票和流程确实属于该规范的范围时,才应用这些规则。

保存所有公式输入、规则版本、未舍入的结果、舍入操作、计算结果、报告结果和差额。然后按获批的容差对差额分类。AI 可以解释是哪项输入造成了差异,但计算应由确定性代码或经过复核的电子表格完成。

使用可复用的字段验证清单测试必填字段、数值范围、正负号约定、允许的币种状态和定位是否完整。

如何验证总额与完整性?

步骤 6:逐层勾稽单据总额

分层计算总额,让差额始终可以诊断:

  1. 按币种汇总计算出的行金额。
  2. 把该合计与报告的行金额小计比较。
  3. 加上经核实的单据级折让和附加费。
  4. 按适用规则和标明的税目重新计算税额小计。
  5. 比较不含税总额和含税总额。
  6. 加上经核实的预付款和舍入,得出应付金额。
  7. 把每个计算出的控制数与印出的控制数比较。

绝不要把不同币种的金额加总成一个数。如果单据除了发票币种外还使用了税务记账币种,就分别保存两者的角色,只应用获授权的换算规则。缺少汇率并不意味着可以去获取当前的市场汇率。

对账表应列出 control name、reported amount、calculated amount、currency、difference、tolerance rule、status 和 reviewer。双表核对流程可以帮助把提取出的行与采购订单或总账导出数据进行比较,但单据本身的算术应先独立通过。

步骤 7:检查缺行和重复行

仅靠总额无法证明完整。一条缺失的行和一条重复的等值行可能相互抵消。把算术检查与结构检查结合起来:

  • 按页比较可见行数与提取出的候选行数;
  • 保留印出的行号,并标出缺号或重号;
  • 检测重复的原始文本和相同的来源区域;
  • 确保每个含金额的区域都对应到某一行,或明确标为非行对象;
  • 比较跨页续行和重复的表头;
  • 复核零值、负数、异常大的金额以及只有描述的行;
  • 区分真正的贷项行与提取时的正负号错误。

不要自动删除重复项。两条相同的服务行可能是合法的,而从重叠的页面区域中被提取两次的同一行则不是。由来源定位和人工复核决定如何处置。

如何复核异常与维护?

步骤 8:把问题送入异常队列

建立一个发票异常队列,包含严重度、发票 ID、候选行 ID、来源定位、原始证据、未通过的规则、计算出的差额、负责人、决定、理由和修订版本。典型的类别包括 unreadable、segmentation conflict、missing line、possible duplicate、currency conflict、formula mismatch、tax review 和 control-total mismatch。

设定停止规则。例如,当发票身份含糊、币种冲突、必需的行缺少定位,或应付金额在获批规则下无法对平时,阻止入账。置信度较低的描述或许可以在不阻断算术的情况下复核,但这条边界由政策而不是模型来设定。

步骤 9:抽样核验并持续维护

上线初期,对按风险抽取的样本逐个字段、对所有异常,都独立地与来源图像比对。衡量字段级准确率、行分段错误、缺失率和重复率、算术不符、按供应商/版面分布的失败模式,以及复核人的更正。单一的单据级准确率可能掩盖最关键的字段。

在 OCR、模型、提示、供应商模板或规范化规则变化后重新测试。保存来源、提取器版本、结构版本、计算版本、复核人决定和更正历史。NIST 把虚构内容、隐私、信息完整性和人机配置列为生成式 AI 的风险领域。[4]在模型接触之前尽量减少发票数据,并使用获批的环境。

核对清单

  • 原始文件、页数、身份和标明的币种都已冻结。
  • 已定义行粒度,以及表头、总额、折让和附加费的处理方式。
  • 每条候选行都保留了原始文本和页面/区域定位。
  • 缺失值保持缺失,而没有变成零或猜测值。
  • 数量、价格基数、折扣、附加费、税和舍入彼此分开。
  • 小数解析和舍入规则都有版本号。
  • 行金额和单据总额都用十进制算法重新计算。
  • 完整性检查并不只依赖总额平衡。
  • 异常都有负责人、理由和有证据支持的处置。
  • 入账或审批仍由获授权的财务人员负责。

总结

  • 提取之前先定义行粒度和控制数。
  • 把来源定位和原始值与规范化字段并列保存。
  • 让 AI 整理可见的证据,而不是填补空白或修复总额。
  • 用确定性方法重新计算金额,并逐层对账。
  • 把结构和金额方面的异常交给负责的人复核。
  • 为来源、结构、公式和决定建立版本记录。

常见问题

AI 的准确率足以自动入账吗?

准确率因版面、扫描质量、语言和字段而异。使用字段级验证、确定性的总额计算和基于风险的人工审批;不要把流畅的输出或某一个基准测试当作入账的依据。

发票小计应该当作行项目吗?

不应该。除非获批的结构明确规定了其他角色,否则把可见的小计作为控制总额保存。把它们算作购买项目通常会造成金额重复。

空字段怎么办?

使用明确的缺失状态,例如 Not shown、Unreadable 或 Not applicable。不要把缺失转换成零,也不要复制附近的数值。

AI 能决定正确的发票税率吗?

它可以转录标明的税率并标出冲突。确定适用的税务处理,需要相关司法辖区、交易事实、现行规则以及合格的税务或会计人员审核。

为什么平账仍可能提取错误?

一条缺失的行和一条重复的行可能相互抵消,错误的数量也可能被错误的价格掩盖。除了总额之外,还要检查来源覆盖、行身份和字段值。

贷项和负数行如何处理?

保留印出的正负号和单据角色,然后应用获批的发票规则。不要仅仅为了让控制总额平衡就翻转正负号。

能用当前汇率修复币种差异吗?

默认不能。保留每个标明的币种和单据中的换算证据。把缺失或不一致的汇率交给获授权的复核人。

多久重测一次?

在模型、OCR、提示、结构、供应商版面或计算方式发生重大变化后重新测试,并持续监控更正情况。

免责声明: 本文提供的是关于单据处理和控制的一般信息,不构成会计、税务、法律或审计建议。请应用适用的发票规范,并由合格的财务和税务专业人员批准重要的处理和入账决定。

来源

  1. OpenPeppol — Peppol BIS Billing 3.0 — https://docs.peppol.eu/poacc/billing/3.0/bis/
  2. European Commission — Compliance with the European eInvoicing standard — https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/Compliance%2Bwith%2BeInvoicing%2Bstandard
  3. OASIS — Universal Business Language Version 2.1 — https://docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.pdf
  4. NIST — Artificial Intelligence Risk Management Framework: Generative AI Profile — https://www.nist.gov/publications/artificial-intelligence-risk-management-framework-generative-artificial-intelligence

Sources checked 2026 年 9 月 6 日。

延伸阅读

开启 3 天免费试用

注册即可免费体验全部高级功能。

*仅限新用户;每位用户只能获得一次试用。

如何用 AI 提取发票行项目:先保留原值,再复算总额 | AethoVPN