Qdrant 1.10 把 search 接口换成 query_points,带上 score_threshold 和 limit 后结果顺序和以前不一样,最相关的那条排到第三,客户端按第一条做答案引用就错了。

一开始怀疑是「score_threshold 在带 filter 时语义不同」,查了一圈,方向不对。

原因不止一个,得分开看。query_points 返回结构里 points 与 search 的 result 字段不同。另一种情况是请求里用 query 还是 query_text 取决于版本,写错会走默认。

另外,客户端二次排序用了 payload 里的字段而不是 score。

上来先打印返回里的 score 顺序

curl -X POST http://localhost:6333/collections/kb/points/query -H 'Content-Type: application/json' -d @query.json | jq '.result.points[].score'

然后核对请求字段是否符合该版本

curl -X POST http://localhost:6333/collections/kb/points/query -d '{"query":[0.1,0.2],"limit":5,"with_payload":true}'

随后按 score 显式排序后再取引用

python rerank_by_score.py --order desc --top 1

剩下的就是对比新旧接口的返回顺序

python compare_api.py --collection kb --top 5

那几天正好在做别的变更,先把时间线对齐才敢动手。

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

改完先别撤,确认这几项。新旧接口返回的顺序一致,score 单调递减,引用指向最相关的那条。

换接口时字段名和返回结构都会变,先比一次原始 score 顺序,比看业务结果更直接。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189