Redis 缓存问答结果,key 是问题的 md5,模型从 gpt-4o 换成 gpt-4.1 后同一问题仍返回旧模型答案,灰度期间两版答案混着出。
一开始怀疑是「缓存没有 TTL 或者 TTL 过长」,查了一圈,方向不对。
原因不止一个,得分开看。key 里没有模型名与版本。少数情况下是prompt 模板改了但 key 没变。
不容易想到的是,灰度流量共用同一个命名空间。
动手时先抽样看现有的 key 形态
redis-cli --scan --pattern 'qa:*' | head -5
key 里补模型与模板版本
python -c "import hashlib;print('qa:gpt-4.1:v7:'+hashlib.md5(b'hi').hexdigest())"
灰度用独立前缀
python -c "print('qa:canary:gpt-4.1:v7:')"
末了换模型后确认首条未命中
python -c "import redis;r=redis.Redis();print(r.exists('qa:gpt-4.1:v7:x'))"
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
恢复的判定其实很直接。换模型后首条请求未命中缓存,答案带新模型特征,灰度与全量互不污染。
容易忽略的是,缓存键是所有影响输出的输入的摘要,少一个维度就等于把两版结果混在一起。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
