重跑十次都错过的东西,被从序列里翻了出来

一、漏检只有三种成因,每一种在工程数据里都对得上号
据公开报道,被讨论的那项发现的规模量级是二十多万个序列簇,并且同一批数据被重复执行多次都没有被察觉。这两个数字在本篇只作参照,不构成任何结论依据。把这件事从领域里摘出来看,漏检的成因是可以穷举的,而且就三种。
| 成因 | 表现 | 工程数据里的对应样子 |
|---|---|---|
| 目标未定义 | 查询清单里根本没有这一项,于是它永远“不存在” | 埋点只定义了点击、转化、退出,从没定义“页面卡住但没报错”,这类状态在数据里为零 |
| 口径过窄 | 检索条件按已知特征写,与已知不符的一律落不进来 | 风控规则用已知作弊模式的特征集合,没进特征工程的行为完全不可见 |
| 阈值过高 | 弱信号被当作噪声过滤掉,只留最像的那批 | 异常检测把门槛调到“只报最确定的”,被切掉的长尾样本往往正是新型缺陷 |
三种成因的责任人不一样。目标未定义要问产品与业务口径的制定者;口径过窄要问做规则与特征的那几位;阈值过高通常是某个为了压误报而调参的决定。把它们统称“数据不够好”,等于把三个可修的口子都说成不可修。
二、查询由假设生成,假设由文献生成
这是最硬的一层盲区,也是这件事真正可迁移的部分。我们写下的每一条匹配条件,都是从既有结论里归纳出来的:之所以知道要找什么,是因为过去有人描述过。条件一旦成型,它天然找不到与自己不符的东西——它甚至不会把那些样本标成“异常”,而是直接不产生任何记录。
这件事在工程里每天都在发生。一个日志分析项目,全部关键词来自事故复盘文档,那它的产出上限就是这些文档已经知道的东西。一个质检模型,判定项来自历史缺陷库,那么历史上没出现过的缺陷形态,它只能给出“未分类”,而“未分类”往往不进任何报表。
一个简单可用的自检:翻开规则库,逐条追问“这一条是从哪份既有材料里来的”。如果所有条件都能追到既有文档,那这套检索的产出必然落在文档的覆盖范围内。这不是模型能力问题,是查询集合的构造方式决定的。要突破覆盖,只能往查询集合里加“不来自任何结论”的项——也就是下面那件没有目标的事。
三、把“没匹配到”做成一等对象:一张表、一条告警、一次扫描
把盲区从感慨变成可测,只需要两个动作。
第一个动作是给未匹配项单独建一张表和一条告警。这张表不是临时导出,而是与正式结果表同级的落库对象,至少要有这些字段:样本标识、进入时间、当前累计量、占总量比例、末次量级跳变的时间点、责任人。告警条件不写绝对量,写占比突变——未匹配项的比例在短期内抬升,往往意味着输入分布变了,而这是任何按已知特征写的规则最先失灵的信号。多数团队的现状是:这张表存在,但没有告警,也没有责任人,于是它只是一个没人打开的目录。
第二个动作是定期做无目标扫描:不预设要找什么,只把聚类结果报出来,让人去看有哪些组是以前没有名字的。这一层有落地限制,三条都得满足,否则扫描只是批量生产噪声。
- 规模要控。每次扫描产出的候选组数量,必须控制在判定人真能看完的量级;看完不了的结果和没有结果等价。
- 频次要定。太频繁等于没有频率,两次扫描之间没有足够的输入变化,产出只会重复。
- 判定人要有。每一批候选组要有指定的人给出结论,结论进表;没有指定判定人的扫描,做完就散。
这两张东西要长在一起才起作用:未匹配表负责持续积累,无目标扫描负责周期性回头看。只有前者,量会一直涨而没人解释;只有后者,每次都是从零看起,看不见趋势。落地时给未匹配表补两条约束就够——同一批样本重复进入只更新计数、不新增行;每一条被判定人解释过的样本,结论要写回表里,并明确移入正式分组或留档,不许原地消失。
四、重复执行排除的是偶然性,不是盲区
据公开报道里那句“同样的数据被重跑多次都没发现”,方法学含义很干净:重复执行同一套查询,能排除的是偶然性——随机种子带来的波动、抽样带来的抖动、脚本一次没跑全;它排除不了盲区,因为十次跑的是同一个查询集合。可复现与无遗漏是两件不同的事,前者是稳定性,后者是覆盖面。
工程里同样的误读非常普遍。回归测试连跑十遍全绿,只证明这套断言自洽,不证明断言覆盖了要防的缺陷;一次事故复盘里说“这个场景早就测过”,测过的多半是同一批假设下的用例。两类活动要分开列,产出物也不同:稳定性活动的产出是失败率与方差,覆盖面活动的产出是“哪些状态从来没有任何一条断言碰过”。后一句才对应盲区。
五、模型在这一类任务上的贡献是分层的,前两层被严重低估
把贡献按可靠程度分三层,顺序不要颠倒。
第一层是聚类与压缩:把海量个体压成可枚举的组,让“看完全部”第一次成为可能。这一层不需要任何创造性,需要的是稳定的距离度量与能解释的分组。第二层是给出可疑子集并说明为什么可疑:按偏离度、稀有度、与已知组的距离排序,并附上可核对的理由。第三层才是提出机制假设。
前两层的价值被低估,恰恰因为它们不够戏剧化——它们不要求模型“创新”,只要求它把人的注意力重新分配到少数样本上。而第三层风险最高,必须有人接住,否则假说会直接进到结论里。
也正因为如此,不该把这一类成果表述成机器自主完成。真正促成发现的,是有人把这一项加进了查询目标,以及有人愿意看那一堆没有名字的东西。模型做的是把“看完”这件事变得可能,判断仍然是人做的,责任也留在人这边。
六、新东西怎么核,以及工业侧怎么用
任何“过去没被描述过”的结果,从线索升为结论要过四项,缺一项只能称线索。
- 能回到原始材料:从结论一路追到最初的个体样本,中间每一次聚合都可展开。
- 能给出可判定的分组依据:别人拿同一套依据能分出同一批,而不是靠相似度感觉。
- 能在保留集上验证:留出没有参与分组的那部分数据做对照。
- 能被第三方复算:方法、数据版本与参数写得足够别人重跑。
这套结构搬到我们自己的领域几乎不用改。缺陷检测、异常识别、用户流失预警,都有同一个盲区:规则按已知模式写,未知模式一律落到“未分类”里。而“未分类”那一堆的容量,正是最有价值的信号——它变大,说明世界在你看不见的地方变了。
可以直接交给客户的一张自查表只有四问:现有规则里有多少条是“匹配到即报警”;有没有一个专门放“没匹配到”的去处;这个去处的量有多大、占总量比例是多少;谁在看它、多久看一次。四问答不上来的系统,谈不上漏检归因能力。
洹拓把这一条做成流程上的硬环节:每次分析结束,固定留一节报告未分类项的量、若干样例与三档可能解释——已知模式的新组合、测量口径发生了变化、确实是一种新情况。三档都要写,不许只挑一个。这一节看着像收尾,实际是下一次挖掘唯一可能带来意外增量的入口。
发现问题需要的是查询的多样性,不是查询的次数。