把向量模型从 text-embedding-3-small 换成 bge-m3 后只改了写入侧,历史数据还是旧向量,检索结果里新旧混排,召回率从 0.82 掉到 0.55。
一开始怀疑是「查询用的是新模型,老文档还用旧空间」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。集合里同时存在两种维度和语义空间的向量。另一种情况是写入侧切换没有版本标记,无法区分来源。
另外,没有做全量重建就切了线上流量。
第一件事是查集合里向量的维度分布
python -c "import json;d=json.load(open('coll.json'));print(set(v['dim'] for v in d))"
新建集合写入全量新向量
python reindex.py --src docs/ --model bge-m3 --collection faq_v2
再往下用同一批查询对比新旧集合召回
python recall_eval.py --sets faq_v1,faq_v2 --queries q_200.jsonl
末了切别名指向新集合并保留回滚入口
python alias_switch.py --alias faq --to faq_v2
别只看报错消失,验证要多做一步。新集合召回率到 0.84,查询延迟没有明显变化,别名切回旧集合只需一条命令。
这里还有个坑。换向量模型等于换了一整个语义空间,必须全量重建;用别名切换而不是改代码里的集合名,回滚才来得及。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
