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 补不上这部分精度。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189