Qdrant upsert报Not existing vector name,核对向量名称配置
对照集合配置、写入名称与查询空间,区分未命名与命名向量,按服务版本保留旧数据安排迁移。
向Qdrant写入向量时出现 Not existing vector name,先比较集合配置里的向量名称和请求中的名称。创建集合使用单个 VectorParams,适配器写入时却指定 custom_vector,两端就没有使用同一份命名约定。
这类报错与向量维度不匹配分别检查。名称对齐后,向量长度、距离类型和embedding模型仍需要符合目标空间,不能把改一个名称当作整个索引已经正确。
单向量配置与命名配置长得不同
未命名的单向量集合,vectors 直接描述空间参数。下例只是配置形状,不是针对现有集合的修改命令:
{
"vectors": {
"size": 768,
"distance": "Cosine"
}
}
命名向量集合则多一层名称映射:
{
"vectors": {
"custom_vector": {
"size": 768,
"distance": "Cosine"
}
}
}
768只是示例长度,应按真实模型调整。custom_vector 也不是Qdrant预留名称;使用哪个名称,应由集合契约和应用配置决定。custom-vector、custom_vector 和大小写不同的名字不能互换。
排查时读取实际连接目标的集合信息,比较 config.params.vectors,再查看本次upsert序列化后的 vector 字段。不要只读创建脚本:脚本可能没有作用于当前服务地址、集合名或适配器实际使用的集合。
把写入和查询放到同一个空间
对命名集合,写入点的 vector 是名称到向量的映射。未命名集合则使用单个向量。适配器设置 vector_name="custom_vector" 后,集合中也必须存在这个名称。
如果旧集合本来就是未命名空间,并且要继续使用里面的向量,应按所用客户端与适配器版本选择其支持的未命名方式。不要为了消除错误,在业务代码里随便加一个默认名称;空名称如何表达也应核对实际接口,而不是把某个版本的配置复制到所有客户端。
查询同样要选中目标空间。当前Query API用 using 指定命名向量,适配器可能使用 vector_name。旧服务是否支持该查询接口需要单独核对。写入成功却查询了另一空间,仍会得到错误或不符合预期的结果。
名称正确而长度不同,可以接着检查embedding维度与模型配置。两个模型恰好都是768维,也不代表它们编码出的向量可以混用。
已有集合是否需要重建
先确认服务版本。Qdrant从1.18.0起支持向已有集合添加命名向量空间,新增入口是 PUT /collections/{collection_name}/vectors/{vector_name}。不能把较早版本需要重新建集合的处理,套到所有现行版本。
添加空间只建立配置,不会自动给旧点计算新的embedding。切换查询前,要为需要检索的点写入新空间的向量,并核对模型、点ID和缺失向量情况。保留旧空间与可恢复数据,再按明确范围迁移;不要先删除集合或删除旧向量空间。删除空间会影响其配置和关联向量数据。
若服务版本不支持添加,或者准备更换模型,新建一个不同名称的集合更容易隔离迁移。保留旧索引,写入并核对新集合后再切换应用。给旧向量补零、截断长度,不能完成模型迁移。
回查要从实际服务进程进行:集合配置、写入名称和查询空间一致,选定点的向量长度正确,代表性查询返回业务预期文档。如果堆栈发生在检索器包装类而非Qdrant响应,可以转查VectorStore与Retriever的对象层次,避免在错误层面反复重建数据库。


