# 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和时间 **正确做法**: ```bash # 首选: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启动命令**: ```bash # 启动thread uwf thread start nantong-lease-audit -p "校区:X | 合同文件:Y.pdf | OCR文本路径:/tmp/xxx/Y_ocr.md | 原始文件名:Y.pdf" # 后台执行(最多10步) uwf thread exec --count 10 --background # 检查进度 uwf thread show # 读取结果 uwf thread read --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文件需要复制或重命名: ```bash 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+检查流程。