- 新增 docs/architecture/extract-status.md:指标两种读法(报告值 / 只按人工标注)、 已确认的进展、泛化风险(Fable 过拟合评估)、P0–P3 遗留问题、找样本和建留出集的流程 - extract-eval.md、AGENTS.md、架构 SK13、evals/README.md 改正达标说法并指向新文档 - 读标召回率优化暂停,后续专项优化从 extract-status.md 接着做 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 KiB
13 KiB
读标抽取:现状、遗留问题和下一步(2026-11-03)
用途:读标抽取的召回率优化先暂停,后续做专项优化时从这份文件接着做。 评测过程和数字见
extract-eval.md;本文件的结论以这里为准。§7 里「三项目标全部达标」的说法要按本文 §2 的口径重新理解。 依据:S01–S10 标注集评测(修复前 base、修复后 fix3),以及 Fable 顾问的两次审读(修复审读、过拟合评估),关键数字已复核。
1. 现状一句话
修掉了几个确定的缺陷,搭起了结构识别的框架。但现在的分数是在同一批 10 份样本上调出来、又用同一批样本评的,泛化能力还没有被测过。
2. 指标怎么读
| 指标 | 目标 | 报告值(fix3) | 只按人工标注算 | 说明 |
|---|---|---|---|---|
| 标注类实质性条款召回(含待确认区) | ≥ 99% | 99.4% | 98.9%(356/360) | 看过输出后,S02 的 11 条 ★ 按口径 Q2 改成了可选;按原标注算不达标 |
| 写明无效类召回(含待确认区) | ≥ 90% | 98.1% | 98.1% | 正式清单只有 84.7%。新增召回主要来自两处:江苏范本的「上述……否则无效」句(33 条),以及 Q4 把资格条件定义成无效 |
| 实质性条款准确率(正式清单) | ≥ 95% | 98.4% | 72.4%(含补标)/ 71.5%(不含) | 1,232 条里明确判错 20 条;另有 320 条靠评分脚本「按定义算对」:★ 节内 234 条(S10 占 225),资格条件法规无效 86 条。这 320 条没有人逐条核对过,真实准确率在 72%~98% 之间 |
| 资格条件准确率 | — | 90.0% | 71.5% | 两轮 AI 裁定补了可选单元;裁定理由里有不少「拿不准」,真值在两数之间 |
| 日期递交准确率 | — | 99.3% | 81.8% | 同上 |
| 评分项准确率 | — | 100% | 95.4% | 同上 |
| 技术参数准确率 | — | 98.8% | 98.3% | 同上 |
「只按人工标注算」指两点:不含两轮裁定补的 117 个可选单元;评分脚本里的两条「按定义算对」规则不生效。按这个口径,可以确认达标的只有写明无效类召回(含待确认区)。
3. 已经确认的进展(换任何文件都成立)
| 改动 | 修掉的缺陷 |
|---|---|
合并时待确认条目不再借正式条目进清单(pending_categories) |
S07 一份有 93 条普通技术参数被标成「致命」 |
| 输出用到上限的 92% 按截断处理,拆到底时采用已有输出 | 模型临近上限自己收尾,S03 两页参数整段静默丢失 |
| WPS 旧版 DOC 直接修正字体表字符集 | S07 正文全是「第第第第」,产品里根本没法用 |
| 表格按单元格切句(s3-v4) | 多行单元格串行、竖排窄列一字一句,评分表和参数表的证据对不上 |
| 是 / 否字段的否定词补「非」「不专门」 | 「非专门面向中小企业」8/10 份核对不通过 |
| 「视为串通投标」算无效依据(87 号令第三十七条) | 串通情形依据校验不过 |
| 格式范本正文(「我单位……」)不收 | 资格任务把声明函逐句抽成资格条件 |
| 评分、标注工具:按「页码 + 片段」定位,切句变了能自动改写;有留出集就能直接用 | 以前没有可重复的评测 |
4. 泛化风险:哪些规则是照着样本调的
Fable 用样本外的写法逐条验证过,标「已验证」的是复现过的。
4.1 道理通用、写法和阈值照样本定(换文件可能失效或误判)
| 规则 | 样本外的失效写法 | 失效后果 |
|---|---|---|
章识别 structure.chapters |
「第1章」「第一部分」、章号和标题拆成两句、采购需求或附件放在最后(已验证:全部返回空) | 静默不跳章:召回不掉,但资格准确率退回、成本 +27%、合同章「拒绝接受」的排除失效 |
资格任务跳过采购需求章 SKIP_CHAPTERS |
磋商文件把「供应商资格要求」写在采购需求章 | 静默漏抽,没有兜底。10 份样本里没有一条资格标注落在被跳过的章,这条规则在样本上没付过代价 |
表后说明 trailing_notes |
只认句首「上述 / 以上」;「注:第1~5项缺任一项投标无效」覆盖 0 行(已验证) | 漏抽 |
| 同上,后果词含「不合格 / 拒绝」、不看章 | 需求章「以上人员须经考核,不合格的拒绝进场」(已验证) | 上方参数行全被当成无效依据,进待确认 |
INVALID 新增「不得参加 / 被拒绝 / 拒绝接受」 |
「评标委员会成员不得参加评审」「不得参加后续培训」「甲方有权拒绝接受不合格货物」(已验证) | 一般要求冒充写明无效;只排除了合同章,而且前提是章识别成功 |
概括句过滤 BLANKET / leads |
「上述证书原件须在开标时携带,否则投标无效」本身是一条要求(已验证) | 被当成引导句丢掉,兜底也不补 |
★ 节 star_sections |
「★1 核心交换机」被当成节标题(已验证);后面没有同级编号时,范围最多延伸 800 句 | S10 一个标题覆盖 381 句、产出 225 条致命,没有人逐条核对 |
★ 降级 star_scored(Q2) |
后果写在不带 ★ 的句子里(「重要技术参数负偏离超过三项的,投标无效」)(已验证) | 真正的废标 ★ 被显示成「重要」 |
评标方法 EVAL_METHOD |
招标投标体系的「综合评估法」「经评审的最低投标价法」 | 项目信息答不出 |
| 阈值 | 表后往回 40 句、行长 ≤ 60 字、★ 节范围 800 句、最后一章不超过一半、92% | 都是看样本定的,没有样本外依据 |
4.2 照着答案改的
- 提示词例子取自测试文件:substantive v5、qualification v4、schedule v4、tech_param v4 的新例子,逐字来自这 10 份(如「须统一部署于市级政务云平台」「上述资格证明文件 1~6 项」「提供公安部检测报告」「5 分钟内提出疑义」)。这些条目在 10 份上的得分不能当证据,换文件前要换成虚构或别处的例子。
- 评分脚本镜像了抽取规则:
score.py里「★ 节范围内一律算对」「法规无效且碰到资格标注就算对」两条,等于用抽取规则去证明抽取规则(§2 的 320 条)。 - 看过输出后改了标注集:S02 的 ★ 改成可选;两轮 AI 裁定补了 117 个可选单元;标注员和裁定员是同一类模型,都没有人工复核。
4.3 换文件后的预计(Fable 的推测,未验证)
| 新文件 | 标注类召回 | 写明无效类召回 | 实质性条款准确率 |
|---|---|---|---|
| 同样是江苏政府采购 IT 类 | 大概率 ≥ 98%,到不到 99% 五五开(★ / 斜体下划线的兜底是通用的) | 能守住 90%(范本句一致) | 最先掉,按人工逐条口径估 85%~90% |
| 外省、招标投标体系 | 基本不受影响 | 掉到 80% 左右(「作废标处理」「否决投标」写法不全,章识别失效) | 掉得更多;资格准确率退到 60%~70% |
| 扫描件 | 可能掉到 80%~90%:斜体下划线和单元格都依赖矢量信息,★ 经 OCR 常变成 * 或 ☆ | 依赖 OCR 质量 | — |
5. 遗留问题清单
按优先级排。P0 不做,后面的分数都不可信。
P0 评估体系
- 建留出集:至少 10 份,改代码之前选好、不看,组成见 §6.1。代码冻结后只跑一次、出一份报告,不裁定;裁定中「标注漏了」的只记录,计为错误。
- 人工标注:实质性条款和资格条件必须人工标(两项目标指标都在这里,两轮 AI 裁定已经证明偏宽)。评分、日期可以 AI 标注,再人工抽查 20%。标注员不能和裁定用同一类模型。
- 评分脚本拆列:准确率分两列报:「对上人工标注」和「按定义算对」(★ 节、法规无效)。标注类召回按 S02 两种口径都报。裁定补标的单元单独计数。
- 10 份现有样本的标注集人工复核:先复核实质性条款(S03、S06 最难),再把
reviewed改成 true。
P1 规则改保守(防样本外误判)
- ★ 节继承来的条目:先进
pending_categories,由人确认,不直接标致命。S10 一份 250 条致命,和口径 Q3「清单失去意义」的理由自相矛盾,Q1 的落地方式要重新定。 - 表后说明:只在公告、须知、资格、格式这几章生效;后果词去掉「不合格」「拒绝」;支持「注:第1~5项……」这类不以「上述」开头的写法。
INVALID:- 「不得参加」要求同一句里带「投标」或「采购活动」;
- 「拒绝接受」只认主语是采购人或代理机构、对象是投标文件的写法;
- 按法律体系补「作废标处理」「予以废标」(招标投标体系里等于否决投标;政府采购里「废标」多指整个采购终止,不能混用)。
- 概括句过滤:只在上下确实有编号列表时生效,句子本身写着具体要求的不过滤。
- ★ 降级:带后果的句子里没有 ★,但提到了 ★ 的定义词(「核心技术参数」「重要技术参数」),也不降级。
- 章识别:
- 支持「第1章」「第一部分」、章号和标题拆成两句;
- 认不出时计数
chapters_unreliable,写进解析结果; - 资格任务不跳过采购需求章,或者跳过之后对采购需求章补一遍关键词扫描(「资格要求」「供应商须具备」)。
- 评标方法:补「综合评估法」「经评审的最低投标价法」等招标投标体系的写法。
- 提示词例子:换成虚构的,或取自留出集以外的文件。
- 回归测试:把 §4.1 里每条「已验证」的反例写成单元测试。
P2 覆盖面
- 招标投标体系:术语(招标人、否决投标)、无效写法、评标方法都没有样本,规则基本没覆盖。
- 扫描件:OCR(技术验证 S5)还没做。斜体下划线、表格单元格这两条规则在扫描件上不成立,要另想办法,例如用版面分析认表格、用多模态模型认标注。
- 外省范本:江苏范本的「上述……否则无效」「苏采云」写法不能当通用规则。
- 补遗、更正公告:没有样本。
P3 质量细节(extract-eval.md §7.4)
- 写明无效类在正式清单里的召回只有 84.7%:主要卡在符合性审查表(表头在上方)和串通情形上。
- 待确认区里只有 62% 是好结果:噪音偏多,要结合查标阶段的处理体验再定。
- 资格误抽:「本项目不接受进口产品 / 分包」被当成资格条件。
- 项目信息:
accept_imported、sme_only各 7/10。 - 重复条目:同一要求在公告、须知、审查表各抽一条,查标阶段要按语义合并。
6. 下一步建议(专项优化时)
6.1 找样本
收集时按下面的组成来,先全部放进留出集,再从中划出一部分作为开发集,不要反过来:
| 类别 | 份数 | 要点 |
|---|---|---|
| 江苏政府采购 IT 类 | 4 | 含 1 份非苏采云平台、1 份竞争性磋商、1 份竞争性谈判或询价 |
| 外省政府采购 IT 类 | 3~4 | 不同范本的省份(例如浙江「政采云」、广东、北京),优先选章节写法不同的 |
| 招标投标体系 | 2 | 国企或工程类信息化项目(江苏省公共资源交易网「工程建设」栏目等) |
| 扫描件 PDF | 1~2 | 盖章扫描的招标文件,用于 OCR(S5)和标注识别 |
| 补遗 / 更正公告 | 1 | 带原文件和更正内容 |
获取方式和版权处理沿用 samples/tenders/README.md:原文件和抽取文本不进 git,只提交清单和 fetch.sh。
6.2 优化的流程
- 划分:样本分开发集和留出集(留出集至少 10 份,§6.1 每类至少 1 份);
- 标注:留出集人工标注实质性条款和资格条件;标注规范沿用
evals/gold/GUIDELINES.md,先补上招标投标体系和扫描件的口径; - 改代码:只看开发集;每条新规则都配一个样本外的反例测试;提示词例子不取自留出集;
- 评分:冻结代码后在留出集上只跑一次,按 §5 P0 第 3 条拆列报告,不裁定;
- 决定:留出集分数没达标的,回到开发集找原因,不在留出集上改。
6.3 先做哪几件
- P0:评分脚本拆列、10 份现有样本的实质性条款人工复核(工作量最小、能立刻看清真实水平);
- P1 第 1、3、6 条:★ 节改待确认、
INVALID收紧、章识别补写法(误判代价最高的三条); - 收集样本、建留出集(§6.1),再开始下一轮优化。
7. 相关文件
| 文件 | 内容 |
|---|---|
docs/architecture/extract-eval.md |
评测方法、修复前后的结果、改动清单(§7) |
docs/decisions.md |
M1(只用 Flash)、Q1–Q4(实质性条款的口径) |
evals/README.md、evals/gold/GUIDELINES.md |
评测工具用法、标注规范 |
server/src/bid_doctor/checklist/extract.py |
抽取、校验、合并、兜底 |
server/src/bid_doctor/document/pipeline/structure.py |
章、表后说明、★ 节、上级条款 |
server/src/bid_doctor/document/pipeline/text_layer.py |
切句(按单元格) |
evals/score.py |
评分;ok() 里两条「按定义算对」的规则见 §4.2 |