直接回答:例外情况不能只写成“其他情况另行处理”,而要写成可判定的条件、可观察的信号和明确的默认动作。人工经验里那些“看情况”的判断,一旦进入脚本需求,就必须变成字段、阈值、优先级和兜底逻辑,否则脚本只能执行最常见的那条路径,遇到边界样本时要么静默跳过,要么做出与人工判断相反的动作。下面用一个假设情境把决策过程写清楚。
假设你负责一个已有稳定流量的内容站,人工排查排名波动时积累了一套经验:先看目标页是否还能正常访问,再看标题与摘要是否被改写,最后判断是不是内容本身不再匹配搜索意图。现在要把这套经验写成脚本需求,让脚本每天输出一份待处理清单。
变化发生在这里:过去人工排查时,你面对的是几十个重点页面;改成脚本后,覆盖范围扩大到全站。原先靠经验跳过的页面,现在都会被脚本纳入判断。此时如果例外情况没有写清,脚本会把大量正常页面标成异常,清单失去可操作性。
因此第一个决策不是“要不要自动化”,而是“哪些前提变化后,脚本的判断分支必须与人工经验不同”。
人工经验里的例外,通常可以拆成三类。写需求时分别处理,比笼统写一句“特殊情况人工确认”更有用。
例如脚本要读取页面标题,但目标页返回的内容里没有可解析的标题节点。人工遇到这种情况会先怀疑抓取不完整,而不是直接判定标题被删。脚本需求里应写成:当标题字段为空且页面主体内容也明显偏少时,标记为“待复核”,不进入“标题异常”分支。这样后续动作不同:前者去检查访问与渲染,后者才去改标题。
人工判断时,你会同时看到访问正常、标题正常、但摘要被替换。经验告诉你先处理摘要。脚本需求里如果只罗列条件而不写优先级,输出顺序可能完全相反。建议写成有序判断:先排除访问失败,再判断标题,最后判断摘要;同一页面命中多个条件时,只输出优先级最高的那个标签。
例如某些页面本来就是聚合页或专题页,标题结构与其他页面不同。人工知道这是有意为之,脚本却会把它当异常。需求里应写明:带特定模板标识或路径特征的页面,跳过标题结构判断,只保留访问检查。
写脚本需求时,把例外写成“如果……那么……否则……”的形式,能减少实现方的猜测。下面是一个假设的伪代码片段,只用于说明描述方式:
if 页面无法访问: 标记为访问异常,停止后续判断
elif 页面属于已登记的特殊模板: 只记录访问状态,跳过标题与摘要判断
elif 标题字段为空 and 主体内容偏少: 标记为待复核,不标记为标题异常
else: 按标题、摘要顺序判断,命中即输出对应标签
这样写的好处是:每个例外都有明确的进入条件和退出动作,脚本不会在边界样本上自行发挥。实际动作是把这段判断逻辑交给实现方后,先跑一批已知正常的页面,观察是否被误标;如果误标集中在某一类模板,就回到需求里补上该类模板的跳过条件,而不是去改判断阈值。
脚本上线后,前提仍可能变化。以下变化出现时,原先写好的例外需要重新确认,而不是继续沿用:
判断是否需要调整,不能只看清单条数变多或变少。清单变短可能是例外条件写得太宽,把真实异常也跳过了;清单变长可能是模板变化导致误标。两种解释都成立时,先抽样核对被跳过和被标记的页面,再决定改条件还是改阈值。
如果调整例外条件后,你想比较调整前后的清单差异,要注意季节和搜索需求变化本身也会影响页面表现,数据采集时间点不同也会带来差异。一次改动前后的对比,不能单独证明例外条件写对了。更稳妥的做法是:固定一批已知正常和已知异常的页面作为核对样本,先看脚本对这批样本的判断是否符合预期,再去看全站清单的变化。样本判断对了,才进入下一步扩大范围;样本判断错了,先改需求描述,不要急着调阈值。
把人工经验写成脚本需求,关键不在于把经验写得多完整,而在于把每个“看情况”落实到可判定的条件、明确的优先级和清楚的兜底动作。例外描述得越具体,脚本越接近人工判断,后续复核成本也越低。