构造反例样本的目的,是在执行替换之前先找出“不该被替换”的文本。做法是从待替换范围中抽取少量条目,人为加入边界情况,逐条判断替换后语义是否被破坏;只要反例样本里出现误伤,就说明匹配规则还不够窄,应先收紧规则再全量执行。
同样叫批量替换,处理旧内容与处理旧系统字段的取舍完全不同。可以用一个简单条件区分:替换对象是给人读的自然语言,还是给程序读的结构化字段。
判断依据不是文本长短,而是替换后是否需要人工复核语义。需要复核的,按自然语言场景处理;不需要的,按结构化字段场景处理。选错场景会让反例样本要么过松、要么过严。
假设要把旧合作方名称替换为新名称,但保留历史公告中的原始署名。可以这样构造反例样本:
实际动作是先只对反例样本执行一次替换,逐条对照预期。如果引号内的旧名称也被改掉,说明匹配规则缺少上下文约束,下一步应改为按位置或按句式限定,而不是直接全量替换。这个动作的结果直接决定后续是放宽还是收紧规则。
需要注意,替换前后做效果比较时,要考虑季节与搜索需求本身的波动,不能把某次流量变化单独归因于这次替换。
当旧值是新值的一部分,或新值包含旧值时,容易发生连锁误改。构造反例样本时可以人为制造这类重叠:
例如把状态标识 old 替换为 active,若匹配按子串进行,older、old_flag 也会被改动。反例样本中出现这类条目,就说明必须改用全词或精确匹配,再重新跑一遍样本。这一步的结果决定能否进入全量执行。
样本通过不等于全量安全。执行前应记录替换范围、匹配规则和样本清单,执行后按同一批反例再抽查一次。如果抽查发现新的误伤,说明样本覆盖不足,应补充反例而不是直接回滚全部改动。
例外情况是:当替换对象本身就是要整体废弃的旧内容,且已确认无保留价值时,可以不构造语义反例,只保留结构化字段的子串检查。是否属于这种情况,应以“替换后是否还需要人工复核含义”为准,而不是以内容新旧为准。