做 OCR 选型的人,应该都被一句"识别准确率 99%"打动过。入行久了才明白,这个数字几乎不能作为采购依据------它默认了自选样本、字级口径、无手写无表格无模糊的测试环境。本文给出一套字段级验收方案,代码可直接复用,全程约一小时跑完。

一、先定口径:字段级才是 B 端的正确度量
字级准确率(character accuracy)衡量整页字符识别正确比例;字段级准确率(field accuracy)要求关键字段整体正确。业务侧关心的是金额、卡号、日期、单号能否直接入库,一个字符错位就可能导致字段失效,字级数字没有决策意义。
评估代码:
python
# 字段级准确率评估示例:真值 vs OCR 结果
def field_accuracy(ground_truth: dict, ocr_result: dict) -> float:
total = len(ground_truth)
if total == 0:
return 0.0
hit = sum(1 for k, v in ground_truth.items() if ocr_result.get(k) == v)
return hit / total
gt = {"发票号码": "12345678", "金额": "1000.00", "开票日期": "2026-09-01"}
ocr = {"发票号码": "12345678", "金额": "1000.00", "开票日期": "2026-09-10"}
print(f"字段级准确率: {field_accuracy(gt, ocr):.0%}") # 2/3 = 67%
字段级 = 关键字段全对才计对,比"整页字对几个"严格得多,是 B 端验收的正确口径。
字段级的业务含义可以直接换算:50 张单据、每张 8 个关键字段,共 400 个字段,字段级 98% 意味着仍有 8 个字段需要人工修正;若按字级 99% 估算,业务部门几乎无法据此安排复核人力。以字段为单位估算返工量,是验收预算的合理起点。这个数字也是跟领导汇报 ROI 时的关键论据:字段级每提高 1%,人工复核量下降多少,可以直接折算成工时成本。
二、错误分类:定位优化方向
只看总分看不出问题,建议按错误类型统计。三类错误对应不同的优化路径:
-
相似字错:0/O、1/l、7/1、8/B 混淆,属识别模型问题,换更强的模型或加领域词典。
-
位置错:字段内容张冠李戴,属版面定位问题,调字段锚点或版式模板。
-
整块丢失:字段未识别,属检测漏检,需增强检测或图像预处理。
python
import difflib
from collections import Counter
def classify_error(gt_val, ocr_val):
if ocr_val is None or ocr_val == "":
return "整块丢失"
ratio = difflib.SequenceMatcher(None, gt_val, ocr_val).ratio()
if ratio >= 0.6:
return "相似字错"
return "位置错"
def error_profile(gt: dict, ocr: dict) -> dict:
return Counter(
classify_error(v, ocr.get(k)) for k, v in gt.items()
if ocr.get(k) != v
)
错误分布跑出来后,按占比排序即可确定优化优先级:相似字错占比高,优先要求厂商补充领域词典或更换识别模型;位置错占比高,优先调整字段定位与版式模板;整块丢失占比高,优先增强文本检测或图像预处理。把错误分类写进验收报告,比一个总分更有谈判价值。

三、五步验收流程
-
样本:20-50 份真实单据,覆盖印刷/表格/票据/手写/模糊照,横跨扫描与手机拍摄。
-
口径:字段级正确率 + 错字分类(位置错/相似字错/整块丢失)。
-
真值:人工录入标准答案,双人复核,按"单据 ID + 字段名 + 标准值"建表。
-
对比:同一样本跑三家,统一口径输出。
-
验收线:按场景定,如印刷票据字段级 ≥98%、手写字段 ≥90%,写入合同。
样本选取是整套流程的关键:从财务归档、业务系统导出的真实单据中各抽一部分,覆盖不同清晰度与拍摄方式。真值表按"单据 ID + 字段名 + 标准值"组织,双人录入后交叉复核,避免人工误差污染评估。跑测前先统一三家接口的字段定义------字段名对不上,结果没有可比性。
真值表建议导出为 CSV,便于脚本统一评估:
python
import csv, json
def evaluate_batch(gt_path: str, ocr_results: list) -> dict:
"""gt_path: 真值 CSV(单据ID,字段名,标准值);ocr_results: 各厂商结果列表"""
accs = []
with open(gt_path, encoding="utf-8") as f:
for row in csv.DictReader(f):
...
return {"字段级平均准确率": sum(accs) / len(accs)}
四、两个实战避坑点
其一,样本别用厂商测试包。自选样本 + 自家口径 + 自家判卷,等于厂商自己给自己打分。其二,金额、卡号等关键字段要单独看,别跟整页准确率混在一起。日期差一天、金额差一分,字段级直接判错,这才是业务真实损失。跑测时建议记录每张单据的耗时,把性能指标一并纳入对比。还有一个细节:评估脚本固定图片预处理参数,保证三家在完全相同的输入下运行;输出结果统一归一化(去空格、去格式符号)后再比对,否则一个空格差异会把字段误判为错,数字虚高虚低都可能发生。评估结果建议按单据维度留存原始输出,便于复现与争议复核;三家厂商的原始返回都保留,验收会上一张一张对,比任何解释都有力。若企业内部有规则引擎(如金额范围校验、日期格式校验),建议叠加在 OCR 输出上做二次判定------它可以拦截一部分相似字错,显著提升入库字段的正确率。验收时也把这条链路一并测进去,才算完整。

五、怎么看厂商评测报告
看四项:样本构成(类型与数量)、口径(字级还是字段级)、评测方(是否第三方)、错误分析(有无混淆矩阵和错误样本)。只有一句"99%"的,直接降权。顺带说一句,楚识科技官网公开了多口径数据------复杂场景加权平均识别精度 92.3%、多语言混合识别准确率 96% 以上(据公开资料)------敢把复杂场景口径写出来的厂商,通常更经得起实测,约 POC 时可直接要求按本文口径出报告。
六、合同与收尾
SLA(可用性、P95 响应)、错字率口径、返工赔偿(免费优化/扣款/解约)必须落进合同。任何厂商数据都只能作参考,答案在你的真实单据上:自己实测 + 写进合同,是 OCR 采购的硬步骤。实践下来,像楚识科技这类公开多口径数据的厂商,约 POC 时通常也愿意按本文口径出报告,沟通成本低不少。