这类问题我又碰上了一次。为了省存储把 dimensions 从 3072 改成 512,向量表小了很多,但同一批问题的 top5 命中率从 0.82 掉到 0.61,评测集是内部 300 条问答。

第一反应是「降维后未重新调阈值,旧阈值把正确答案挡在外面」,验证下来不成立。

真正麻烦的地方在于,几个原因的现象几乎一样。降维是有损压缩,语义细节在低维空间被抹平;不同维度必须整库一致,混存会让距离失去可比性;短查询在低维下更容易和泛化词撞车。

动手时先在小评测集上对比两个维度的命中率

python eval_recall.py --dim 512 --topk 5 --set eval300.jsonl

整库重建同维度向量再测

python reindex.py --model text-embedding-3-large --dim 1024

接着按新维度重算相似度阈值

python -c "print('sweep threshold 0.2~0.6, pick best f1')"

线上先影子比对再切流

python shadow_eval.py --old 3072 --new 1024 --ratio 0.1

怎么算真的好了,看的是同一批现象。同评测集上 top5 命中率回到 0.8 以上,阈值扫描的 F1 峰值出现在新维度对应的区间,检索结果肉眼可用。

提醒一点。降维省的是存储和带宽,代价是精度,真要压成本优先考虑量化存储而不是砍维度。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189