结论先行:如果功能开关只改变前端展示、不改变估值输入字段,那么版本状态可以只记录开关名、取值、生效时间和页面快照;但如果开关会改变参与估值的字段、权重或数据源,就必须把开关状态与估值参数一起冻结成可复算的版本记录。否则,同一域名在不同时间得到的结果差异,无法判断是市场变化还是开关切换造成的。
记录版本状态的第一步不是写日志,而是给每个开关归类。展示层开关只控制模块显隐、文案替换或排序,例如是否显示历史成交参考。计算层开关会改变进入估值模型的变量,例如是否纳入某类后缀的样本、是否启用某个权重调整。
两者的记录要求不同。展示层开关只需记录开关标识、布尔值、生效时间戳和页面渲染结果,便于复查当时访客看到什么。计算层开关则要额外记录它影响了哪些字段、影响前后的取值,以及该次估值所用的参数集合。判断依据很简单:关掉这个开关后,重新跑一遍估值,结果是否变化。会变化,就按计算层处理。
可行的做法是把开关状态并入估值参数快照,而不是单独建一套开关日志。每次估值产出时,同时写入以下内容:
这样做的实际动作是:当发现某域名估值异常时,先用版本标识取出当时的开关清单和参数快照,再在隔离环境里用相同参数复算。如果复算结果与记录一致,说明差异来自参数或数据;如果不一致,才需要检查代码或数据源是否在记录之外发生了变动。这一步的结果决定了下一步是查数据还是查代码。
上述方法在少量样本上通常成立,但规模化后会出现一个反例:开关之间存在隐式依赖。例如开关 A 控制是否纳入某类样本,开关 B 控制权重归一化方式。单独记录 A 和 B 的取值,看似完整,但当 A 关闭时 B 的归一化逻辑可能走另一条分支,而这条分支并未体现在开关清单里。
此时版本记录虽然齐全,复算却对不上。原因不是记录缺失,而是记录粒度停留在开关层,没有覆盖开关组合触发的代码路径。判断信号是:同一组开关取值,在不同时间复算结果不同,且参数快照完全一致。遇到这种情况,继续增加开关字段没有意义,需要把记录粒度下沉到实际生效的计算分支标识。
具体动作是在估值逻辑中为每条实际执行的计算路径分配稳定标识,并在版本记录中写入该标识,而不仅是开关取值。这样即使开关组合复杂,复算时也能确认是否走了同一条路径。代价是每次调整计算分支都要维护标识映射,属于额外维护成本。
是否值得下沉,取决于开关组合数量。组合少、依赖简单时,开关清单加参数快照足够;组合多、存在交叉依赖时,分支标识更可靠。这个取舍没有统一答案,但可以用一个假设例子说明比较方法:假设有 3 个计算层开关,若两两之间存在依赖,实际路径可能远多于 3 条;此时只记录开关取值,复算失败的概率会明显上升,分支标识的维护成本就更可能被抵消。
先盘点所有开关,标记哪些会改变估值结果。对计算层开关,立即在版本记录中加入参数快照和生效时间;对展示层开关,保留页面快照即可。运行一段时间后,抽查若干版本标识做复算,若出现参数一致但结果不同的情况,再考虑引入分支标识。
需要说明适用条件:这套记录方式解决的是同一套估值逻辑内部的版本追溯,不解决数据源本身变更带来的差异。如果上游样本数据被替换而版本记录只保存了参数,复算仍可能对不上,此时要把数据源版本一并纳入快照。边界清楚之后,记录才有可复查的价值。