Demo 惊艳,上线翻车
有一类 AI 任务,做 demo 时最容易让人误判:把非结构化文本转成结构化字段。
从一份检验报告里抽出十几项异常指标,从一份合同里抽出关键条款和金额,从一段问诊记录里抽出主诉、现病史、用药。跑几个例子,字段一个个填得整整齐齐,所有人都觉得这事成了。
然后拉一个整体准确率出来,90%,看起来可以上线了。但真正负责的人会犹豫:这个 90% 到底意味着什么,凭它敢上线吗?答案是:不敢。
整体分,会骗人
整体准确率之所以靠不住,是因为它做了两次平均。第一次在字段之间:好抽的字段把分数拉高,难抽的字段被稀释。第二次在样本之间:简单样本多,又把整体分托起来。
两次平均叠加,结果就是:整体 90%,完全可能意味着某个必填字段错了 10%。 而一个系统能不能上线,从来不取决于平均分,取决于最差的那个必填字段。
字段间平均
样本间平均
某个必填字段实际错 10%,但它在整体分里被高分字段和简单样本一起稀释,平均之后看起来"总体不错"。
"看起来对",才最危险
更麻烦的是,有一类错误能骗过所有粗粒度的检查,却在上线后第一个爆雷。设想一张表格,抽取时整列数值往下错位了一格。每个单元格单独看都是合法的数字,整段文本的相似度也照样很高,粗看完全正常。但下游只要拿这些数字做计算,结论就全错了,而且错得悄无声息。
| 项目 | 正确值 | 抽取值(错位) | 单看是否合法 |
|---|---|---|---|
| 项目 A | 1,200 | — (空) | ✓ 合法 |
| 项目 B | 3,450 | 1,200 | ✓ 合法 |
| 项目 C | 980 | 3,450 | ✓ 合法 |
| 合计 | 5,630 | 980 | ✗ 下游全错 |
每个格子都是合法数字,相似度照样通过,但每一行的对应关系全错。能骗过聚合指标的错误,正是上线后最先出事的那一批。
不同字段,要用不同的尺子
字段级评估的核心动作,是承认一件事:不同类型的字段,根本不能用同一把尺子去量"算对"。 把字段按类型拆开,各用各的判定函数。
| 字段类型 | 判定函数 | 例 |
|---|---|---|
| 枚举 / ID 型 | 精确匹配 | 科室、单据号、诊断编码 |
| 数值 / 日期型 | 容差窗口 | 金额、剂量、检验值 |
| 自由文本型 | 语义 / 宽松匹配 | 主诉、条款摘要 |
| 表格 / 行项目 | 逐行对齐后比对 | 明细、检验项列表 |
| 跨字段逻辑 | 一致性校验 | 净额 + 税额 = 总额 |
从能生成到可上线,中间这条链路
从 demo 到生产,差的不是模型能力,是评估能力。靠人眼扫几个例子的"感觉还行",在上千条规模上必然失效,因为它抓不到藏在长尾里的失败模式。把"能生成"变成"敢上线",要走完一条链路。
错误分析
捞一两百条真实输出逐条看、逐条记,把失败归类、量化主因。别上来就套通用的"幻觉分""有用性分",它们常常掩盖你这个场景真正的病。
字段级 golden set
让专家审核一组样本固定下来,作为质量闸门,每个新版本上线前必须通过。
回归测试
把每一次生产事故都变成一条永久回归用例。下次再犯,直接被拦在部署之前。
阈值闸门
关键字段设硬阈值,达不到就 block 上线,而不是"差不多就行"。
低置信人审
模型对自己没把握的字段,路由给人工复核,而不是硬着头皮填一个。
能生成不算数,能复现地达标才算
结构化抽取的上线门槛,不在模型能不能生成出字段,而在你能不能证明每一个关键字段都稳定达标。
字段级 Eval 的本质,是给抽取写单元测试:不同字段配不同的判定函数,每个生产事故沉淀成回归用例,关键字段卡死阈值,没把握的交给人。
整体分让你"感觉能上线",字段分才让你"敢上线"。能生成不算数,能复现地达标,才算上线。