feat(ocr): 扫描件与图片识别——OCR 进文字层、资质库上传识别、大图浏览
计划见 docs/architecture/vision-plan.md(VS1–VS13,docs/decisions.md)。 - 验证:OCR(RapidOCR + PP-OCRv6 small,CPU)和 DeepSeek Flash 看图在国动投标文件 和 7 张证书上初测(tech-validation §7,代码 spikes/s5-ocr/) - OCR 服务 services/ocr(镜像、Compose 服务):整页转正(含 180°)、红章附近按红色通道重读 - 扫描页和插图识别后并入文字层 v6,句子标 source=ocr;出处标「OCR」(迁移 0013); 依据识别文字的问题降级,规则不查扫描附件;国动端到端见 check-eval §16 - 资质库上传识别:添加资质对话框最上面传证书照片,识别后填表,只预填和 OCR 文字 对得上的字段;识别值留痕、照片挂成附件(迁移 0014,提示词 vision.cert_fields v1) - 资质库改为查看详情(只读键值 + 附件缩略图),附件用大图浏览控件看,不开新标签页 (设计规范 §7.23);PDF 附件按页出预览图 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -862,9 +862,11 @@ S1–S4 风险最高,建议先做;S8(桌面外壳 PoC)等桌面版立项
|
||||
| SK12 | 参考 BidEngine 的五项改进(2026-11-03) | 见 `ref-bid-engine-analysis.md` §5。**原因码**:没通过校验的结果记具体原因(`extract.FAILURES`,存在清单项 `ai_values.failures`),解析结果按原因计数(`verify_failures`),提示词规则和原因码的对照表在 `prompts/README.md`。**分块**:相邻分块重叠约 800 字;模型输出被截断(`finish_reason=length`)或不是合法 JSON 时,把分块对半重跑,最多 3 层,拆到底仍不完整的记 `output_incomplete`(以前当成「这一块没有结果」,审计发现 deepseek-flash 有输出正好停在 8192 token、整块条目悄悄丢掉的情况)。**项目基本信息**:提示词 v2,12 个字段每个都要表态 found / ambiguous / not_found,跨分块合并后分 found / absent(文件本身没写)/ needs_review(抽取有问题),记在解析结果 `info_fields`。**占位符**:「____元」「××」「( )」「待填」不算取值。**提示词**:substantive v4,qualification / scoring / schedule / tech_param v3,每条禁止事项对应一个原因码。三份样本的待确认:国动 4 → 2,S02 13 → 3,S06 57 → 55(S06 有 4 次对半重跑,截断的分块都救回来了) | 已实现 |
|
||||
| SK13 | S01–S10 标注集评测后的修正(2026-11-03) | 见 `extract-eval.md` §7。规则:合并时待确认条目不再「借道」正式条目(`pending_categories`),表后说明、章识别、★ 节标题、输出接近上限按截断处理、格式范本和整表概括句不收;提示词 substantive v5、qualification v4、schedule v4、tech_param v4;WPS 旧版 DOC 直接修正字体表字符集;表格按单元格切句(切句 s3-v4)。口径 Q1–Q4 见 decisions.md。报告分数有过拟合,只按人工标注算未全部达标,泛化未测,见 `extract-status.md` | 已实现 |
|
||||
| SK14 | 查标第 1 步(2026-11-04) | 见 `m3-plan.md`「第 1 步落地记录」。解析流水线的前几个阶段(格式核对、转换、文字层、扫描件判断)拆到 `document/pipeline/normalize.py`,解析任务和检查批次共用;投标文件每个版本只解析一次,扫描页不报错,交给检查按「请人工核对」处理(C10)。新增 `check`、`ops`(反馈)模块,worker 任务 `check_project`。Valkey 客户端设 2 秒超时、SSE 连接池上限 500(SK1);CI 加 Gotenberg、直接跑 `init-roles.sh`(SK2) | 已实现 |
|
||||
| SK15 | OCR 进文字层(2026-11-05,vision-plan 第 1 步) | **OCR 服务** `services/ocr`(uv workspace 成员、镜像 `deploy/docker/ocr.Dockerfile`、Compose 服务 `ocr`):RapidOCR + PP-OCRv6 small,CPU;整页转正(90° / 270° 试识别、180° 用方向分类模型判);找红章,章附近按红色通道重读;返回行坐标、转正后坐标、红章位置。**worker**(`document/pipeline/ocr.py`):`BD_OCR_PROVIDER=http` 时,扫描页整页、文字页里占页面 5% 以上的图片区域渲染成 200 dpi 图片发给服务;OCR 行换算回 PDF 坐标,和文字层重叠的去掉,章上沿圆弧排的字去掉;切句沿用文字层规则,插图里的字各自成句;句子带 `source = "ocr"` 和置信度,接在原有句子后面编号(文字层 v6,原有编号不变)。OCR 服务不可用按基础设施错误退回额度(`ocr_unavailable`)。**查标**:识别文字参与响应匹配;依据识别文字的问题降一级、报价数字降到提示(VS4);规则检查不看扫描附件和插图上的识别文字(整份扫描件除外);扫描件兜底的说法改为「识别了文字但没认出这份材料」。**出处**:`citation.ocr`(迁移 0013),界面和报告在原句前标「OCR」(设计规范 §7.3,报告模板 v5)。国动真实投标文件 183 页识别约 65 秒,见 `check-eval.md` §16 | 已实现 |
|
||||
| SK16 | 资质库上传识别(2026-11-05,vision-plan 第 2 步) | 「添加资质」对话框最上面传证书照片,识别后填表(单一入口,VS12;一张图一张证书,VS11)。接口 `POST/GET/DELETE /qualification-scans`,页面图走签名地址;worker 任务 `recognize_qualification`(`qualification/recognize.py`):OCR 服务 → DeepSeek Flash 看图(`vision.cert_fields` v1,`ai.run_json` 加 `images` 入参、`ai_call.job_type` 加 `qualification_scan`)→ 字段引用 OCR 行逐个校验(一致、日期一致、识别不确定、不一致、格式不对),只有一致的预填。识别值存 `qualification.ai_values`,照片挂成附件;新增 `qualification.holder`(迁移 0014)。附件支持 WEBP。不扣额度,每企业每天 100 次 | 已实现 |
|
||||
|
||||
SK11 修正前后(同一模型 deepseek-chat,即 deepseek-flash 不思考模式)的待确认数:国动 46 → 4,S02 17 → 13,S06 174 → 57;同一句被拆成多条的情况没有了。剩下的待确认多数是表格两栏或竖排文字串行(要按单元格切句才能解决)。实质性条款任务上比较了 flash 不思考、flash 思考(deepseek-reasoner)、deepseek-v4-pro:抽到的条款大体一致、互有多少,后两者慢 15~45 倍、输出 token 多 7~12 倍,没有看出明显更准;选型等标注集评测出结果再定。
|
||||
|
||||
用国动便民小程序(71 页)、S02、S06 三份文件实测(真实模型 DeepSeek):单份 33~87 秒,清单 216~1348 条,正式清单里的条目都带页码和原句。发现并已修复:标注规则说明的碎片被当成条款、页码混进正文、跨页拆成两条、「做无效响应处理」等写法漏认、上级标题下列出的无效情形被合成一条或漏掉、「无效质疑」被误当成投标无效、「是否接受联合体」取错证据。
|
||||
|
||||
还没做、留了 TODO 的:转换镜像的字体包(S1)、OCR(S5)、分包对应到清单项、模型路由的候选列表、降级和限流、查标全部。S01–S10 标注集评测和修复见 `extract-eval.md`。
|
||||
还没做、留了 TODO 的:转换镜像的字体包(S1)、分包对应到清单项、模型路由的候选列表、降级和限流、查标全部。S01–S10 标注集评测和修复见 `extract-eval.md`。
|
||||
|
||||
Reference in New Issue
Block a user