把人工经验写成脚本需求,例外情况不能写成“特殊情况另行处理”,而要给出可判定的触发条件、替代动作和记录方式。做法是:先拿你手里一份已经人工处理过的页面或资料当样本,把当时的判断拆成“正常规则”和“例外分支”,再为每个例外写明判定字段、阈值来源、无法判定时的动作。这样脚本执行后,例外不会被静默吞掉,而是进入待确认清单,供你决定是补规则还是继续人工。
选一个你亲手改过的页面,例如一篇产品说明。不要先写脚本,先写下当时改了什么:标题里替换了哪个词、正文删了哪一段、内链指向哪个页面。然后逐条问:这个判断依赖什么可见信息?是字段缺失、数值超范围,还是两个来源互相冲突?把答案写成条件句,正常规则和例外就自然分开了。
假设你处理的是标题长度,人工经验是“过长就压缩”。脚本需求里必须补上:长度按什么口径计算,是字符数还是显示宽度;压缩时优先删哪部分,是修饰词还是品牌词;压缩后如果语义发生变化,是否回退。缺少这三项,脚本只能机械截断,规模越大,误伤越多。
一条合格的例外描述,至少要让执行者知道什么时候触发、触发后做什么、做完记在哪里、什么情况下停下来问人。可以按下面四项逐条检查:
这四项里最容易漏的是停止条件。没有它,脚本会把例外当正常数据一路跑完,你拿到的结果无法区分“规则生效”和“规则失效”。
以你手里一份含标题、摘要、正文和来源链接的资料为例,人工经验可能是“摘要与正文首段重复时,重写摘要”。转成脚本需求可以这样写:
这里第4步就是例外分支,第5步是停止条件。它们把“人工能判断但脚本不知道”的部分显式保留下来,而不是让脚本猜。
个别样本上有效的规则,放大后出现例外,常见原因不是规则本身错,而是样本恰好避开了边界。可区分的信号有几类:
这些信号只能说明“需要检查”,不能单独证明某次改动有效或无效。一次改动前后的比较,还要考虑季节、搜索需求变化和数据采集口径差异;请求量或抓取量归零,也可能是采集中断、过滤规则变化或统计口径调整,不必然是处理正确的证据。
脚本跑完后,先看例外标记的分布,而不是先看整体结果。如果例外集中在某一类资料,优先补这一类规则;如果例外分散且原因各异,说明当前还不适合全量自动化,应先缩小处理范围。每次调整阈值或替代动作后,只在一小批上重跑,并与人工判断逐条对照,确认例外描述确实覆盖了原先靠经验处理的场景,再决定是否扩大范围。
把例外写清楚的目的,不是让脚本替你做所有判断,而是让脚本在不能判断时停下来,把决定权交回给你。