{"record":{"id":"09ea965c4575ec2e","repo":"jd-opensource/joyagent-jdgenie","slug":"vectorsize","errorCode":null,"errorMessage":"向量集合大小与元数据集合大小不一致，vectorSize：","messagePattern":"向量集合大小与元数据集合大小不一致，vectorSize：","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"genie-backend/src/main/java/com/jd/genie/service/QdrantService.java","lineNumber":147,"sourceCode":"    public void deleteByFilterSync(String collectionName, Points.Filter filter) throws ExecutionException, InterruptedException {\n        client.deleteAsync(collectionName, filter).get();\n    }\n\n    public Points.UpdateResult upsertVectors(String collectionName, List<List<Float>> vectors, List<Map<String, JsonWithInt.Value>> payloads) throws ExecutionException, InterruptedException {\n        if (StringUtils.isBlank(collectionName)) {\n            throw new RuntimeException(\"集合名为空！\");\n        }\n\n        if (CollectionUtils.isEmpty(vectors)) {\n            throw new RuntimeException(\"向量集合为空！\");\n        }\n\n        if (CollectionUtils.isEmpty(payloads)) {\n            throw new RuntimeException(\"元数据集合为空！\");\n        }\n\n        if (vectors.size() != payloads.size()) {\n            throw new RuntimeException(\"向量集合大小与元数据集合大小不一致，vectorSize：\" + vectors.size() + \"，payloadSize：\" + payloads.size());\n        }\n\n        List<Points.PointStruct> pointStructList = new ArrayList<>();\n        for (int i = 0; i < vectors.size(); i++) {\n            Points.PointStruct pointStruct = Points.PointStruct.newBuilder()\n                    .setId(id(UUID.randomUUID()))\n                    .setVectors(vectors(vectors.get(i)))\n                    .putAllPayload(payloads.get(i))\n                    .build();\n            pointStructList.add(pointStruct);\n        }\n\n        return client.upsertAsync(collectionName, pointStructList).get();\n    }\n\n    public Points.UpdateResult upsertVectors(String collectionName, List<String> idList, List<List<Float>> vectors, List<Map<String, JsonWithInt.Value>> payloads) throws ExecutionException, InterruptedException {\n        if (StringUtils.isBlank(collectionName)) {\n            throw new RuntimeException(\"集合名为空！\");","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/jd-opensource/joyagent-jdgenie/blob/2417e0b8b636d941ad5fb14c59b20dddfef5375d/genie-backend/src/main/java/com/jd/genie/service/QdrantService.java#L129-L165","documentation":"upsertVectors requires vectors.size() == payloads.size() so each point gets exactly one payload; a size mismatch means index pairing would corrupt data, so it throws RuntimeException with both sizes (\"向量集合大小与元数据集合大小不一致，vectorSize:...payloadSize:...\").","triggerScenarios":"Calling upsertVectors where vectors and payloads lists have different lengths — typically one list was filtered/deduplicated independently, or a partial failure caused one list to lose items.","commonSituations":"Filtering vectors (e.g. dropping bad embeddings) without filtering payloads in step; duplicate handling removing items from only one list; off-by-one or async ordering bugs in batch assembly.","solutions":["Ensure vectors and payloads are built in the same loop so they stay index-aligned","Filter both lists together (e.g. as pairs) rather than independently","Log both sizes and diff the sources when they diverge"],"exampleFix":"// before\nvectors = vectors.stream().filter(v -> v.size() == dim).collect(toList());\npayloads = buildPayloads(allRecords); // built from original list\nqdrantService.upsertVectors(collection, vectors, payloads);\n// after\nList<VectorWithPayload> pairs = items.stream()\n    .filter(i -> i.vector.size() == dim)\n    .collect(toList());\nqdrantService.upsertVectors(collection,\n    pairs.stream().map(p -> p.vector).collect(toList()),\n    pairs.stream().map(p -> p.payload).collect(toList()));","handlingStrategy":"validation","validationCode":"if (vectors.size() != payloads.size()) {\n    throw new IllegalStateException(\"vector/payload size mismatch: \" + vectors.size() + \" vs \" + payloads.size());\n}","typeGuard":null,"tryCatchPattern":"try {\n    qdrantService.upsertVectors(collectionName, vectors, payloads);\n} catch (RuntimeException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"向量集合大小与元数据集合大小不一致\")) {\n        log.error(\"batch misaligned: {}\", e.getMessage());\n    } else throw e;\n}","preventionTips":["Always derive vectors and payloads from one shared list of items","Filter as pairs so sizes can never diverge","Assert list equality of sizes in batch-building unit tests"],"tags":["java","qdrant","vector-database","validation"],"backgroundTag":"empty-required-field","analyzedSha":"2417e0b8b636d941ad5fb14c59b20dddfef5375d","analyzedAt":"2026-09-08T11:28:19.414Z","contentChangedAt":"2026-09-08T11:28:19.414Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}