
问题质量记录审核的工作量在哪制造业的质量记录检验记录、出厂检验报告、返修单、入库单大量还是纸质填写后扫描存档。供应商交来一批档案二方审核前要有人逐页核对填写规范日期有没有写满 8 位、范围值是不是用「」、直径符号是不是大写 Φ、印章有没有压到日期、该签字的栏有没有空着、页码连不连续。这些检查有两个特点规则是确定的但载体是脏的。规则写在管理要求里一条一条都能说清楚载体是手写加印章加扫描OCR 漏识、印章粘连、倾斜、复印件二次扫描什么都有。所以这件事一直是人在做一个档案几百页一批几千页。RecordLint质录检做的事只有一件把这几千页里可能有问题的地方挑出来输出「疑点清单 原图红框 规则依据」人只看疑点。它不做最终判定也不调用大模型全离线。下面讲它怎么做的以及为什么不用大模型。为什么不用大模型三个原因按重要性排可解释性是硬需求。每条疑点都要能回答「依据哪条规定」审核员要拿这个跟供应商说话。规则引擎天然带出处大模型给不出稳定的条款引用。档案不能出厂。质量记录里有产品图号、批次、客户名多数单位不允许上传到任何外部服务。本地跑一个 7B 模型做视觉判定在千页级批次上又太慢。误报要能修根因。规则误报了改一个参数就好模型误报了你只能换 prompt 碰运气。代价是要自己写规则以及要在 OCR 不可靠的前提下把规则写稳。后者才是这个项目的主要工作量。流水线config/rules.yaml 通用规则库A/B/U 类启停、级别、参数 config/packs/ 规则包表单类型清单 F 类表单专项规则 qaudit/ ingest.py PDF/TIF/JPG → 统一长边的页面图像 ocr.py RapidOCR 封装 页级缓存 layout.py 表格线提取 → 单元格网格 seal.py 红色印章检测HSV 形态学位置/倾角/重叠 formtype.py 表单类型识别决定规则适用范围 context.py PageContext规则引擎的唯一输入 rules_a.py / rules_b.py / rules_f.py / rules_u.py 四类规则纯函数 pipeline.py 流水线编排 report.py HTML/JSON 报告一页扫描件进来先统一到固定长边不同扫描仪分辨率差三倍规则里的像素阈值才有意义然后三路并行OCR 出文本框、表格线提取出单元格网格、HSV 阈值抠出红色印章。三路结果合成一个PageContext这是规则引擎的唯一输入。规则是纯函数输入PageContext输出疑点列表所以每条规则都能单测。四类规则类判定依据例子A 文本确定性OCR 成功即可判定日期 8 位、范围值「」、Φ 符号、修约位数B 视觉判定像素与几何印章歪斜/重叠/压日期、空栏未明示「/」、划改处数F 表单专项强绑定表单类型返修结论未闭环、入库标签数量空白U 单据级跨页缺页、页码不连续、同一记录重复传递规则库和代码解耦是核心设计。改级别、改阈值、改适用表单都在 YAML 里A02_range_symbol:enabled:truelevel:HIGHtitle:范围值使用短横而非clause:范围值用波浪号「」连接不用短横参照 GB/T 15835params:# 仅在带计量单位的测量语境下判定避免误伤批次号(22-02-10-7)、零件号units:[℃,MPa,mm,kg,HRC,HRB,HBW,N,kN,g]注意params.units这一行它就是下一节要讲的东西。真正的工作量五层误报抑制第一版规则写完直接在千页级批次上跑首轮疑点多到没法看。逐条对原图大半是规则写法的问题不是档案的问题。修的过程沉淀成五层按从上游到下游排第一层表单类型门控。供应商随货带来的合格证是外单位自制文件不适用我方内部表单的填写格式要求。每条规则带applies_to/exclude_forms表单类型识别错了后面全错所以这一层最先做。第二层语境约束。「范围值必须用」这条规则裸跑会把批次号22-02-10-7、合同号全判成违规。加一个条件只在数字后面跟着计量单位时才判。同理「小数位数」规则先判断这个数字是不是零件号、文件号。规则的精度大半来自这类语境条件而不是正则本身。第三层像素兜底。手写字 OCR 经常整段漏识「该栏是否为空」如果只看 OCR 结果会把写了字但没识别出来的栏判成空栏。所以凡涉及「是否为空」的判定都追加一次墨迹率检测和印章覆盖检测这个单元格里有没有足够的暗像素有没有被红章盖住。有就不判空。同列连续空白再合并成一条疑点不然一列 30 个空格出 30 条。第四层系统性问题折叠。同一档案内某条规则命中 5 页以上且覆盖率超过 60%那不是 5 个错误是这家供应商的填写习惯。折叠成一条档案级疑点逐页明细留在findings.json。第五层批次级折叠。一条规则在整批里散命中超过 30 页合成一条批次级疑点附各档案分布。审核员看到的是「这批里有 8 家供应商的日期都没写满」而不是 200 条一样的话。五层下来千页批次的首轮疑点通常压缩一个数量级。经验是首轮噪声大半来自规则写法而非档案本身逐条核对原图后修掉几个根因就好常见的根因是页码顺序写法、单位缺失的页级误判、密排印章粘连、印章重叠判据。印章检测的两个坑红色印章检测的主干很朴素HSV 阈值抠红色形态学闭运算连成块findContours取外轮廓再按外接框面积页面面积的 0.025% 到 12% 之间和长宽比0.25 到 6过滤掉红线、红字和整页红底。每个候选块用minAreaRect取倾角OpenCV 不同版本的角度区间不一样统一归到 [-45, 45]。坑在后面红线框不是章。很多表单上有「与原件一致」这类红色方框HSV 一抠全是红连通域也过关。区分办法是算fill_ratio红色像素占外接框的比例低于 0.18 的是空心框标成 frame所有印章规则跳过它。一个章被拆成几块。扫描件上章的印泥不均闭运算之后一个章可能还是两三个碎片倾角对碎片算必错。merge_nested按面积从大到小扫交集占小块 90% 以上的并进大块碎片间像素不相交所以fill_ratio可以直接按面积加权合并。重叠判据。两个章有交集就算「重叠」盖章的人手抖一点就交一个角。实现是分别算交集占 A、占 B 的比例取大者再和 YAML 里的阈值比各单位口径不同自己调。倾角同理默认超过 8° 才报且只对angle_reliable的块报细长的碎片不算。至于印章清晰完整、印章倒盖这两条规则写不出来用了一个小模型qaudit/train/整块可拆掉不影响主线。这是全项目唯一的模型而且是本地训练的分类头不是大模型。已知边界写在这里也写在合同里手写 OCR 和印章视觉判定做不到 100%系统输出的是疑点不是结论最终判定由质量职能按程序签署。需要和工艺文件、ERP、LIMS 比对的判定C 类本版本不做因为那需要外部真值。表单专项规则F 类每个单位不一样仓里只带一个民品制造业示例包要自己按《规则包编写指南》写。怎么在自己的档案上跑gitclone https://github.com/jackzhouqd/recordlintcdrecordlint pipinstall-rrequirements.txt python run.py audit samples/synthetic/batch-0001--outout/demo# 仓内合成样本先冒烟python run.py audit ./你的档案目录--outout/baseline# 再上真实档案python-mqaudit.cliimportout/baseline/findings.json--dbqaudit.db --run-id R-2026Q3--operator张三 python-mqaudit.cli serve--dbqaudit.db--port8000# 本地审核界面标准库 http.server sqlite3合成样本由tools/synth_forms.py生成没有任何真实档案。真实档案第一轮一定会有噪声按上面五层的顺序修根因不要一条一条关规则修完把人工判定用gold子命令并进金标准集eval子命令会给出漏检率这样每次改规则都有数可对。仓库https://github.com/jackzhouqd/recordlint https://gitee.com/zjqdcn/recordlint AGPL-3.0。规则包和误报案例欢迎提 issue尤其是你们单位的填写口径和我示例包不一样的地方。