返回 M01~M90 教材库
M65 · 预习教材教材已备 ≠ 学习已完成

M65:合成文档、OCR 与字段规则的最小实现

合成文档 fixture 是带有已知字段值与位置真值的无敏感样本,用它可以把 OCR、字段规则和验证逻辑拆开学习,而不依赖真实客户数据。

2026-10-27synthetic-dataocrfield-extractionfixtureprivacy

内容类型:预习教材(不代表已完成)
日期:2026-10-27
阶段:P1 · AI Model Engineering 90
周次:W10
节奏:周二最小实现
状态:教材已备;学习未完成
标签synthetic-data ocr field-extraction fixture privacy

一句话定义

合成文档 fixture 是带有已知字段值与位置真值的无敏感样本,用它可以把 OCR、字段规则和验证逻辑拆开学习,而不依赖真实客户数据。

学习目标

  1. 设计一个小而可复现的账单或表单 fixture。
  2. 明确 ground truth 包括字段值、页面位置和规范化规则。
  3. 实现或纸上描述 OCR 后的字段定位、解析与验证路径。
  4. 区分抽取错误、归一化错误和业务校验失败。

核心知识

1. Fixture 不是随便一张图片

最小 fixture 应有确定 schema,例如:invoice_idissue_datecurrencysubtotaltaxtotal。生成时同时保存人类可读文档与机器可读 ground truth。字段真值最好包含原始文本、规范值、页码和边界框;例如原始文本 CAD 1,234.50,规范值为币种 CAD 与数值 1234.50

合成样本的价值是控制变量:字体、字号、旋转、噪声和布局都可被明确修改。它不能代表真实世界分布,但特别适合理解处理链、写单元 fixture 和验证边界。

2. OCR 输出到字段的四步

第一步是候选定位:通过关键词邻近、正则或坐标区域找到可能值。第二步是解析:把字符串拆为日期、金额或编号。第三步是规范化:统一千位分隔符、币种、日期格式和空白。第四步是验证:检查类型、范围、唯一性和跨字段约束。

规则应把“未找到”“找到多个”“格式无效”“关系冲突”分开返回。空值不是零,低置信度不是错误值,解析失败也不应被语言模型静默补全。

3. Ground truth 与证据

只保存最终字段值不足以定位错误。若 OCR 把 8 识别为 3,这是识别错误;若文本正确但字段绑定到错误行,是关系错误;若抽取正确却将欧式日期误规范化,是归一化错误。Ground truth 的位置与原始文本让这些问题可区分。

4. 金额守恒是便宜而强的 verifier

账单可检查 subtotal + tax ≈ total,允许货币舍入误差。该规则不能证明整张文档真实,却能发现一类 OCR/关系错误。其他约束包括日期不晚于付款日、币种一致、编号格式和必填字段完整性。规则失败应产生显式状态,不应自动改写原值。

机制与推导

建议的数据结构是:

document_id
  image_path
  fields:
    total:
      raw_text
      normalized_value
      page
      bbox
      source_confidence
  validations:
    arithmetic_consistency

处理函数可返回 value | null、证据列表和状态码,而不是仅返回字符串。这样,下游可以把“无字段”“不可读”“冲突”映射到不同动作。若使用 OCR 服务,fixture 仍应留在本地且不含真实 PII;若不方便运行 OCR,可从手写的 OCR token 列表开始学习字段规则。

最小练习或观察步骤

  1. 生成或手画一张单页账单,放入 6 个字段和 3 行明细。
  2. 写出对应 JSON ground truth,包含原始值、规范值和大致坐标。
  3. 准备一份“理想 OCR 输出”文本块,先不依赖真实 OCR。
  4. 用正则与关键词邻近规则抽取总额、日期和发票号。
  5. 为总额执行解析与 subtotal + tax = total 校验。
  6. 手工制造一处数字错误,预先写下期望状态:识别冲突、不可自动通过。
  7. 如实际运行,只记录真实输出;本教材不提供预造结果。

常见误区

  • 合成文档与 ground truth 一起手工修改,导致错误样本不再可追踪。
  • 只保留字段字符串,不保留证据框。
  • 0 代表未识别金额。
  • 规则失败时偷偷“纠正”为最可能值。
  • 使用真实姓名、账号或交易材料制作练习。
  • 一开始就追求复杂表格和多页文档,使最小路径无法定位。

金融、Web3 与文档场景连接

支付争议材料可用合成收据验证交易号、金额和日期;KYC 表单可用虚构身份测试字段关系;链上场景可制作不对应真实私钥的交易确认单,验证地址格式和交易哈希长度。地址校验只能检查语法或校验和,不能证明地址归属;金额守恒也不能证明票据真实性,结论边界要保留。

自检问题

  1. 一个合格 fixture 的 ground truth 至少包含哪些信息?
  2. 候选定位、解析、规范化和验证有何区别?
  3. 为什么空值不能写成零?
  4. 金额守恒能发现什么,又不能证明什么?
  5. 如何在不运行 OCR 的情况下先学习字段规则?

专业课程对齐

  • Stanford CS231n:对应受控视觉数据、图像变换与表示;用于设计字体、字号、位置、旋转、模糊和遮挡都可追踪的 synthetic fixture,而不是生成无法解释的随机图片。
  • Hugging Face VLM Course:对应图像—文本输入输出与多模态建模边界;帮助区分 ground truth 字段、OCR 候选、规范化结果和模型生成文本。
  • Stanford CS329S:对应数据验证、测试与生产约束;用于把 schema、状态码、证据坐标和金额守恒检查设计成可重复 fixture contract。

深入学习提示

先选读 CS231n 的图像变换概念,把每个 fixture 的生成参数和 ground truth 一并保存;再精读 HF VLM 的输入表示,明确“图中真实值”“OCR 原字符串”“解析后值”是三个不同对象;最后按 CS329S 思路补数据验证。建议至少定义 value_rawvalue_normalizedpagebboxconfidencestatus,并让缺失、不可解析、冲突与合法零值有不同状态。金额守恒可写为 $|total-\sum_i amount_i|\le\epsilon$,但它只能发现部分不一致,不能证明每个字段均正确。若未运行 OCR,也可先以人工候选输入验证定位、解析、规范化和 verifier;学习记录必须明确“设计完成”与“真实运行”之间的边界。

每个 fixture 还应保留可复现的生成种子和预期失败点,这样后续增加 OCR 或 VLM 时,比较的是同一份证据,而不是两套不同样本,也便于复查。

学后填写区

  • 我选择的字段 schema:
  • fixture 中的可控变量:
  • 我定义的状态码:
  • 实际运行结果(未运行请写“未运行”):
  • 发现的问题与下一步:
学完后,请把自己的理解、练习结果和仍不确定的问题写入文末“学后填写区”,再到唯一进度账本更新状态。预先阅读后续教材不会自动增加完成数。