记录一下那天晚上的排查过程。Qdrant 1.13 单机跑在 Docker 里,Python 客户端 1.13.0,往一个带 sparse 向量的 collection upsert 两千条,其中三百多条回 400,原文是 Validation error in JSON body: [sparse_vector.indices: Sparse vector must have unique indices]。dense 那一路一直正常,改成单条写入也报同样的错。
刚开始盯着「词表映射用了哈希,不同词落到了同一个下标」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。分词结果里同一个词被加了两次,indices 出现重复。还有一种是合并两路稀疏结果时直接拼接,没有去重。
不容易想到的是,批量构造时 indices 和 values 的长度对错了位。
单独校验一条数据的 indices 是否唯一
python -c "import json;d=json.load(open('one.json'));i=d['indices'];print(len(i),len(set(i)))"
构造稀疏向量时用字典累加权重,再转成两个数组
python build_sparse.py --input chunk.txt --out sparse.json --dedup
然后确认 collection 的 sparse 配置确实存在
python -c "from qdrant_client import QdrantClient;c=QdrantClient('localhost',6333);print(c.get_collection('docs').config.params.sparse_vectors)"
剩下的就是按批重新写入,先只带 id 与 sparse 缩小排查面
python upsert_sparse.py --batch 200 --collection docs
别只看报错消失,验证要多做一步。upsert 返回 status ok,collection 的 points_count 与输入条数一致,按关键词查询能命中新写入的文档。
提醒一点。稀疏向量只在建表时声明过 sparse 配置的 collection 上生效,漏了声明写入会被当成非法字段。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
