M65:合成文档、OCR 与字段规则的最小实现
合成文档 fixture 是带有已知字段值与位置真值的无敏感样本,用它可以把 OCR、字段规则和验证逻辑拆开学习,而不依赖真实客户数据。
内容类型:预习教材(不代表已完成)
日期:2026-10-27
阶段:P1 · AI Model Engineering 90
周次:W10
节奏:周二最小实现
状态:教材已备;学习未完成
标签:synthetic-dataocrfield-extractionfixtureprivacy
一句话定义
合成文档 fixture 是带有已知字段值与位置真值的无敏感样本,用它可以把 OCR、字段规则和验证逻辑拆开学习,而不依赖真实客户数据。
学习目标
- 设计一个小而可复现的账单或表单 fixture。
- 明确 ground truth 包括字段值、页面位置和规范化规则。
- 实现或纸上描述 OCR 后的字段定位、解析与验证路径。
- 区分抽取错误、归一化错误和业务校验失败。
核心知识
1. Fixture 不是随便一张图片
最小 fixture 应有确定 schema,例如:invoice_id、issue_date、currency、subtotal、tax、total。生成时同时保存人类可读文档与机器可读 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 列表开始学习字段规则。
最小练习或观察步骤
- 生成或手画一张单页账单,放入 6 个字段和 3 行明细。
- 写出对应 JSON ground truth,包含原始值、规范值和大致坐标。
- 准备一份“理想 OCR 输出”文本块,先不依赖真实 OCR。
- 用正则与关键词邻近规则抽取总额、日期和发票号。
- 为总额执行解析与
subtotal + tax = total校验。 - 手工制造一处数字错误,预先写下期望状态:识别冲突、不可自动通过。
- 如实际运行,只记录真实输出;本教材不提供预造结果。
常见误区
- 合成文档与 ground truth 一起手工修改,导致错误样本不再可追踪。
- 只保留字段字符串,不保留证据框。
- 用
0代表未识别金额。 - 规则失败时偷偷“纠正”为最可能值。
- 使用真实姓名、账号或交易材料制作练习。
- 一开始就追求复杂表格和多页文档,使最小路径无法定位。
金融、Web3 与文档场景连接
支付争议材料可用合成收据验证交易号、金额和日期;KYC 表单可用虚构身份测试字段关系;链上场景可制作不对应真实私钥的交易确认单,验证地址格式和交易哈希长度。地址校验只能检查语法或校验和,不能证明地址归属;金额守恒也不能证明票据真实性,结论边界要保留。
自检问题
- 一个合格 fixture 的 ground truth 至少包含哪些信息?
- 候选定位、解析、规范化和验证有何区别?
- 为什么空值不能写成零?
- 金额守恒能发现什么,又不能证明什么?
- 如何在不运行 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_raw、value_normalized、page、bbox、confidence、status,并让缺失、不可解析、冲突与合法零值有不同状态。金额守恒可写为 $|total-\sum_i amount_i|\le\epsilon$,但它只能发现部分不一致,不能证明每个字段均正确。若未运行 OCR,也可先以人工候选输入验证定位、解析、规范化和 verifier;学习记录必须明确“设计完成”与“真实运行”之间的边界。
每个 fixture 还应保留可复现的生成种子和预期失败点,这样后续增加 OCR 或 VLM 时,比较的是同一份证据,而不是两套不同样本,也便于复查。
学后填写区
- 我选择的字段 schema:
- fixture 中的可控变量:
- 我定义的状态码:
- 实际运行结果(未运行请写“未运行”):
- 发现的问题与下一步: