Files

4.7 KiB

OCR与Workflow教训(2026-06-29 跃龙路校区)

1. 纯扫描件OCR:用ocrmypdf,不用raw tesseract

问题:跃龙路两份合同(租赁合同签字.pdf 11MB + 物业合同.pdf 1.4MB)都是纯扫描件(pdftotext提取0字符)。

错误做法

  • 用tesseract直接OCR → 输出大量乱码("ARR: MEER"应该是"名称:范存益","FAK."应该是"平方米")
  • 试图用vision_analyze逐页核实 → 连续7次timeout,完全不可用
  • 转而手动delegate_task让subagent做vision → 部分成功部分失败,耗费大量token和时间

正确做法

# 首选:ocrmypdf(有预处理管线,中文识别质量远高于raw tesseract)
ocrmypdf -l chi_sim+eng --output-type pdf 原件.pdf OCR后.pdf
# 然后提取文字层
pdftotext OCR后.pdf output.md -layout

ocrmypdf vs raw tesseract对比

维度 ocrmypdf raw tesseract
预处理 自动去噪、矫正、二值化
输出格式 PDF+A(含文字层) 纯文本
中文识别质量 较好(仍有少量错误) 很差(大量乱码)
适用场景 扫描件合同、手写签名页 印刷体清晰文档

注意:ocrmypdf输出仍有少量错误(空格分割、个别字误识),但整体可读性远优于raw tesseract。关键数字(金额、日期、面积)仍需人工或vision核实。

2. Vision工具timeout处理

问题:vision_analyze对大尺寸扫描件图片(>300KB)频繁timeout。压缩到100KB仍timeout。

解决方案

  1. 先尝试压缩:PIL.Image.resize((1000, ...)) + JPEG quality=50
  2. 如仍timeout,改用browser_navigate(file://...) + browser_vision
  3. 如browser_vision也timeout,用delegate_task让subagent做(subagent有独立timeout预算)
  4. 最终方案:用ocrmypdf替代vision做OCR,只在关键页面用vision核实

最佳实践:先用ocrmypdf做全量OCR,只对关键条款(租金金额、违约金比例、当事人名称)用vision逐页核实。不要试图vision每一页。

3. uwf workflow必须使用

教训:Maggie明确指出"跃龙路又没有按照workflow进行了"。手动做OCR+分析+建表=跳步+质量失控。

正确流程

  1. 用ocrmypdf做OCR(或用已有校正OCR文本)
  2. 启动uwf nantong-lease-audit workflow(4角色:classifier→template-diff→rule-analyzer→data-extractor)
  3. 每个合同一个thread,可并行启动
  4. 等待所有thread完成(约10-15分钟/合同)
  5. 读取JSON输出喂给single-campus-builder.py

uwf启动命令

# 启动thread
uwf thread start nantong-lease-audit -p "校区:X | 合同文件:Y.pdf | OCR文本路径:/tmp/xxx/Y_ocr.md | 原始文件名:Y.pdf"
# 后台执行(最多10步)
uwf thread exec <thread-id> --count 10 --background
# 检查进度
uwf thread show <thread-id>
# 读取结果
uwf thread read <thread-id> --quota 8000

JSON输出路径/tmp/nantong-lease-audit/<校区>-row-data.json

4. delivery-gate.py文件名模式

G1检查:寻找模版比对-*.md格式的文件名(不是*-template-diff.md)。

  • 正确:模版比对-跃龙路租赁合同.md
  • 错误:跃龙路-template-diff.md

修复:workflow产出的template-diff文件需要复制或重命名:

cp /tmp/nantong-lease-audit/跃龙路-template-diff.md /tmp/<校区>/模版比对-跃龙路租赁合同.md

G5检查数据行数≥3是默认值。对于只有2份合同的校区(租赁+物业),这是正常情况,不算失败。如果G5报错但确认校区确实只有2份合同,可安全忽略此项。

5. 物业合同JSON被覆盖

问题:两个合同共用同一个uwf workflow名称(nantong-lease-audit),data-extractor角色默认写入/tmp/nantong-lease-audit/row_data.json。如果两个thread同时跑,后完成的会覆盖先完成的。

解决方案

  • 物业合同没有对应的07模版,不需要走template-diff角色
  • 物业合同的K列和L列内容需要手动填充(从OCR文本+workflow摘要中提取)
  • 或者:在builder脚本中直接从OCR文本和物业合同分析摘要手动构造物业数据行

6. ocrmypdf产出仍需OCR完整性检查

ocrmypdf产出文字层后,用pdftotext提取的.md文件可能仍有少量乱码。需要:

  1. 运行ocr-integrity-check.py检查乱码
  2. 如果检查失败(检测到公司名乱码等),用vision核实关键页
  3. 核实后手动修正.md文件中的乱码
  4. 重新运行检查直到通过,生成step1.verified checkpoint

快捷方案:如果之前已有vision校正过的.md文件(本次session中手动校正的),直接复用,不需要重新跑ocrmypdf+检查流程。