问题出现得很突然,日志倒是留得挺全。把检索模型从 bge-small-zh 换成 bge-m3,只改了查询侧的 encode 调用,库里的向量还是 512 维,检索结果语义完全不相关,接口没有报错。

刚开始盯着「两个模型的归一化方式不同」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。索引维度没有按新模型重建。还有一种是同一个集合里混着两个模型生成的向量。

另外,距离度量与新模型的训练方式不匹配。

第一件事是查索引声明的维度和实际向量长度

python check_index_dim.py --collection kb

新建集合,用新模型全量重灌

python reindex.py --model bge-m3 --collection kb_v2

双写一段时间,对比两套召回结果

python dual_recall.py --collections kb,kb_v2 --sample 200

等前面都确认过,再切换别名前抽查 30 条问题的命中情况

python eval_recall.py --collection kb_v2 --sample 30

改完先别撤,确认这几项。查询返回的相关块与问题语义一致,索引维度是 1024,别名切换后旧集合不再被读取。

容易忽略的是,查询和入库必须用同一个模型与同一套归一化参数,换模型等于换了一套坐标,哪怕维度碰巧相同也不能混用。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189