Qdrant 1.12.1 用 docker 起单节点,50 万条 1536 维向量,collection 开了 int8 标量量化,recall@10 从 0.94 掉到 0.62,把量化关掉就恢复,机器资源没变。
把日志和配置对完,能解释这个现象的基本就这几处。开了量化但没开 rescore,候选集直接按量化距离返回;oversampling 用默认 1.0,量化误差没有被更多候选稀释;向量本身未归一化,int8 截断后方向偏差被放大;查询侧和写入侧用了不同 distance,分数尺度对不上。
上来先确认 collection 的量化与 rescore 配置
curl -s localhost:6333/collections/docs | jq '.result.config.quantization_config'
接着看集合实际点数与维度
python -c "from qdrant_client import QdrantClient;c=QdrantClient('localhost');print(c.count('docs'))"
然后检索请求里加 rescore 与 oversampling
python search.py --collection docs --rescore --oversampling 3.0
等前面都确认过,再用同一份标注集重算召回
python eval_recall.py --gt gt.jsonl --pred pred.jsonl --k 10
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
改完先别撤,确认这几项。recall@10 回到 0.93 以上,单次查询 P99 只多了 6 毫秒,量化配置保持不变。
这里还有个坑。量化的收益在内存,代价要用 rescore 补回来,只调 limit 补不上这部分精度。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
