AI 从招标公告里抽字段,准不准怎么测?我逐条核对了 60 份公告

环保水务招投标数据准确率评估做法复盘

结论先说: 评估 AI 抽取字段,要分开看两个数:抽出来的对不对(精确率),该抽的有没有抽到(召回率)。我让 Codex 按这个方法逐条对照原文核对了 60 份北京公共资源交易平台的公告:第一轮发现程序几乎从不抽错,但采购单位漏掉了将近一半;补上公告里的几种写法后,两批样本的采购单位召回率都到了 100%。

为什么要做这件事

我想在水务系统里加两个新视角:企业画像(一家公司在北京中了哪些标)和采购单位画像(某个甲方怎么采购、常找谁)。这些都建立在从公告里准确抽出“采购单位、中标单位、金额、工期、所在区”等字段的基础上。字段不准,画像就是空中楼阁。

方法:先冻结结果,再对原文

  1. 分层抽样:合同公示、中标结果或候选公示、招标公告各抽 10 份,固定随机种子,保证可以复现,也不能挑“好抽”的样本;
  2. 先冻结程序结果:程序抽完后把结果存档,之后不再改;
  3. 逐字段对照原文:每份公告先核对 13 个字段,后补入独立的合同估算价字段,每个字段归为“抽对了、抽错了、漏抽了、原文本身没有”四类之一;
  4. 分别计算精确率和召回率。

“原文本身没有”单独列出来很重要。比如候选人公示本来就没有中标金额,程序空着是对的,不能算漏抽。

第一轮结果:不乱填,但漏得多

第一批 30 份公告的 13 个字段中,没有已抽取的值被核对为错误。但采购单位的召回率只有 55%,工期 82%,品类 87%。

翻看漏抽的公告,原因很一致:程序只认“采购人”这类写法,而北京工程类公告写的是“招标人为”“招 标 人”(中间带空格)、“发包人”“建设单位名称”。这不是模型能力的问题,是对公告写法不够了解。

补规则之后

  • 采购单位补上各种写法,两批样本召回率分别从 55% 和 47% 提到 100%,全量 3260 份公告的覆盖率从 48% 提到 87%;
  • 候选人公示里的工期在表格中,改为按第一候选人所在行去读,召回率提到 100%;
  • 补上监理、检测、设备材料、代建的品类识别。

修正后,两批样本中有可评估正例的字段精确率均为 100%;预算、限价没有正例,不能计算准确率。第二批原先的品类精确率为 91.7%,修正后升至 100%。没有为了提高召回而放松判断。

两个意外发现

这两批抽样没有可核对的“预算”和“最高限价”正例。 每批 30 份,两项都是 0 个;不能据此推断北京工程公告总体都不写这两项。公告里常见的是“合同估算价”。如果把估算价、总投资或建安费当成预算填进去,数字看起来很全,其实口径全错了。现在“合同估算价”单独成为一个字段,和预算、限价分开存。

所在区宁可空着,也不能猜。 有的公告只写“密云水库上游”“京密引水渠密云段”,这类地名可能跨区,不能硬归到某个区。也不能用采购人的办公地址或开标地点去推断工程在哪。

但“溪翁庄镇”这种乡镇名只属于一个区(密云区),查官方行政区划就能确定。我引入了北京市民政局公布的乡镇街道表(343 条),把这类地名换算成区县,并标注“地名推断”,和“原文明确”区分开。重名的街道(比如两个区都有的八里庄街道)仍然不推断。

也要说清楚局限

  • 核对由 Codex 对照原文逐条完成,不是人类双审,也不是独立盲测;
  • 每批只有 30 份,预算、限价没有正例,无法评估这两项;
  • 样本上 100% 不代表总体 100%,只能说明方法和规则方向是对的。

你能拿走什么

  1. 精确率和召回率分开算。 “不乱填”和“不漏填”是两种能力。
  2. 先冻结程序结果,再核对原文。 避免边看边改、自己给自己打高分。
  3. “原文没有”单独一类,不算漏抽。
  4. 漏抽多半是不了解行业写法,补规则往往比换模型更有效。
  5. 口径比覆盖率重要。 估算价不是预算,开标地点不是工程所在地。
  6. 宁可空着,也不要猜。 能用官方资料确定的才推断,并标明是推断。

相关作品:北京环保水务产业智能系统