批量替换前是否值得构造反例样本,取决于替换规则能否用一句话说清边界。如果规则只涉及一个确定字符串、且该字符串在任何语境下都不该保留,可以直接进入小范围替换验证;如果规则依赖上下文、同形异义或位置关系,就必须先构造反例样本,否则替换范围越广,误伤越难回退。
把待替换内容分成两种:无条件替换和条件替换。无条件替换指目标字符串出现即应被替换,例如把某个旧型号编号统一改成新型号编号,只要编号本身没有歧义。条件替换指同一字符串在不同位置含义不同,例如“苹果”在水果品类页和品牌页指向不同对象,或者某个词在标题中该改、在正文引用中不该改。
只有条件替换才需要反例样本。判断方法很简单:写出替换规则后,问自己“有没有一种合理语境,其中这个字符串不该被替换”。如果答案是否定的,反例样本的价值有限,重点应放在替换后的抽样复核;如果答案是肯定的,先别动全量,先找反例。
反例不是随机抽样,而是主动寻找会让规则失效的样本。可以从三个来源入手。
每个来源至少保留一个应当被替换的正例和一个不应被替换的反例,形成对照。这样做的目的是让替换脚本或人工操作在遇到反例时能停下来,而不是一路执行到底。
假设某站点要把产品页中的旧编号“A12”统一替换为新编号“B34”。表面上这是无条件替换,但构造反例时发现:部分页面正文里“A12”出现在引用旧标准或历史型号的句子中,替换后会改变原意。此时规则应改为:只在产品参数表字段内替换,正文引用不动。
这个假设说明,反例样本的作用不是否定替换,而是把替换范围从“全站”收窄到“字段”。收窄后,下一步动作是先在字段级样本上执行替换,再检查参数表与正文引用是否仍然一致。如果字段替换后正文引用出现指向矛盾,说明还需要补充一条规则处理引用关系,而不是继续扩大替换范围。
反例样本准备好后,不要直接全量执行。先选一组同时包含正例和反例的页面做替换,观察三类结果:正例是否正确改变,反例是否被排除,边界组合是否产生新问题。如果反例被误替换,说明规则描述不够具体,应回到规则层修改,而不是在结果层逐个修补。
小范围替换的结果会直接影响下一步:正例和反例都符合预期,才考虑扩大范围;反例被误伤,则先补充排除条件;正例未被替换,则检查匹配方式是否过严。每一步都以样本结果为依据,而不是以“替换数量”为依据。
替换完成后,如果要比较改动前后的表现,需要把季节、搜索需求变化和数据采集差异纳入考虑。同一组页面在替换前后流量变化,可能来自需求波动,而不一定来自文本替换本身。因此比较时应尽量选择需求相对稳定的时间段,或把替换组与未替换组放在同一时间窗口内对照。一次改动前后的差异不能单独证明替换正确,只能作为下一步是否继续调整的参考。