记录一下那天晚上的排查过程。Qdrant 1.12 的集合 faq 建了 dense 和 sparse 两个命名向量,没有默认向量,用 qdrant-client 调 search 时只传了 vector 数组,接口回 400,原文是 Wrong input: Not existing vector name error: default,换成 curl 也一样,索引状态是 green。
刚开始盯着「稀疏向量必须用 SparseVector 结构,直接给 float 数组会被当成稠密向量」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。集合只声明了命名向量,不传 using 时服务端会去找名为 default 的向量。少数情况下是把 query_points 的 using 参数漏写,SDK 回退到默认向量名。
不容易想到的是,多路检索时两路共用了同一个参数对象,后一路覆盖了前一路的 using。
先列出集合里真实的向量名
curl -s http://localhost:6333/collections/faq | jq '.result.config.params.vectors | keys, .result.config.params.sparse_vectors | keys'
随后用 curl 明确带上 dense 这个名字
curl -s -X POST 'http://localhost:6333/collections/faq/points/search' -H 'Content-Type: application/json' -d '{"vector":{"name":"dense","vector":[0.1,0.2,0.3]},"limit":5,"with_payload":true}' | jq '.result[0].score'
稀疏那一路按 indices 加 values 的格式传
curl -s -X POST 'http://localhost:6333/collections/faq/points/search' -H 'Content-Type: application/json' -d '{"vector":{"name":"sparse","vector":{"indices":[3,17],"values":[0.42,0.18]}},"limit":5}' | jq '.result | length'
剩下的就是在客户端把 using 写成显式参数再跑一次
python -c "from qdrant_client import QdrantClient;c=QdrantClient('localhost',6333);r=c.query_points('faq',query=[0.1,0.2,0.3],using='dense',limit=5);print(len(r.points))"
怎么算真的好了,看的是同一批现象。两路检索都返回结果,dense 与 sparse 的得分分别落在各自区间,融合后的列表里不再出现 default 相关报错。
这里还有个坑。命名向量的集合没有隐式默认向量,任何一次调用都要说明用哪一路,两路融合时把 using 和向量成对封装能少踩一次。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
