{"record":{"id":"21c57ff547347de7","repo":"Tencent/WeKnora","slug":"failed-to-delete-chunk-vectors-w","errorCode":null,"errorMessage":"failed to delete chunk vectors: %w","messagePattern":"failed to delete chunk vectors: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/application/service/knowledge_faq_import.go","lineNumber":1424,"sourceCode":"\t\t\tfaqKnowledge.ID,\n\t\t\tpayload.Entries,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to calculate replace operations: %w\", err)\n\t\t}\n\n\t\t// 删除需要删除的chunks（包括需要更新的旧chunks）\n\t\tif len(chunksToDelete) > 0 {\n\t\t\tchunkIDsToDelete := make([]string, 0, len(chunksToDelete))\n\t\t\tfor _, chunk := range chunksToDelete {\n\t\t\t\tchunkIDsToDelete = append(chunkIDsToDelete, chunk.ID)\n\t\t\t}\n\t\t\tif err := s.chunkRepo.DeleteChunks(ctx, tenantID, chunkIDsToDelete); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete chunks: %w\", err)\n\t\t\t}\n\t\t\t// 删除索引\n\t\t\tif err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete chunk vectors: %w\", err)\n\t\t\t}\n\t\t\tlogger.Infof(ctx, \"FAQ import task %s: deleted %d chunks (including updates)\", taskID, len(chunksToDelete))\n\t\t}\n\t} else {\n\t\t// Append 模式（智能合并）：标准问已存在的条目走 merge ops，其余作为新建。\n\t\tvar mergeOps []faqMergeOperation\n\t\tentriesToProcess, mergeOps, skippedCount, err = s.calculateAppendOperations(ctx, tenantID, kb.ID, payload.Entries)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to calculate append operations: %w\", err)\n\t\t}\n\n\t\tif len(mergeOps) > 0 {\n\t\t\tmergedCount, mergeErr := s.executeFAQMergeOperations(ctx, taskID, kb, faqKnowledge, embeddingModel, indexMode, mergeOps, progress)\n\t\t\tif mergeErr != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to execute merge operations: %w\", mergeErr)\n\t\t\t}\n\t\t\tlogger.Infof(ctx, \"FAQ import task %s: merged %d entries\", taskID, mergedCount)\n\t\t\tprogress.MergedCount = mergedCount","sourceCodeStart":1406,"sourceCodeEnd":1442,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/application/service/knowledge_faq_import.go#L1406-L1442","documentation":"executeFAQImport wraps errors from deleteFAQChunkVectors when removing the vector index entries for deleted FAQ chunks. This runs after the DB delete succeeded, so a failure leaves orphaned vectors in the vector store with no corresponding DB chunks. The cause is the vector-store/service error preserved by %w.","triggerScenarios":"Replace-mode import with chunksToDelete non-empty; deleteFAQChunkVectors fails due to vector DB (e.g., Milvus/Qdrant) unavailability, authentication errors, network timeouts, or missing collection/index for the knowledge base.","commonSituations":"Vector database outage or restart; collection dropped or renamed while FAQ knowledge references it; wrong vector-store credentials in env config; embedding model changed so vectors live in a different collection.","solutions":["Check vector-store connectivity, credentials, and that the target collection exists","Inspect the wrapped cause to distinguish auth vs network vs not-found errors","Manually reconcile/delete orphaned vectors for the affected knowledge base","Retry the import; add cleanup of orphaned vectors if the DB delete already succeeded"],"exampleFix":"// before\nif err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {\n\treturn fmt.Errorf(\"failed to delete chunk vectors: %w\", err)\n}\n// after\nif err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {\n\tlogger.Errorf(ctx, \"orphaned vectors possible for kb=%s: %v\", kb.ID, err)\n\treturn fmt.Errorf(\"failed to delete chunk vectors: %w\", err)\n}","handlingStrategy":"fallback","validationCode":"// Preflight: verify the vector collection/index is reachable before replace import\nif err := vectorStore.Ping(ctx); err != nil {\n\treturn fmt.Errorf(\"vector store unavailable, postpone import: %w\", err)\n}\nif exists, _ := vectorStore.CollectionExists(ctx, collectionFor(kb)); !exists {\n\treturn fmt.Errorf(\"vector collection for kb %s missing\", kb.ID)\n}","typeGuard":null,"tryCatchPattern":"err := runReplaceImport(ctx, req)\nif err != nil && strings.Contains(err.Error(), \"failed to delete chunk vectors\") {\n\t// DB rows already deleted: schedule orphan-vector cleanup, don't fail the task silently\n\tscheduleOrphanVectorCleanup(kb)\n\treturn err\n}\nreturn err","preventionTips":["Recreate the vector collection if the embedding model for the KB changed","Monitor vector-store health and credentials alongside the DB","Implement a periodic reconciliation job deleting vectors without DB chunks","Order operations to tolerate vector cleanup failure with compensating cleanup"],"tags":["vector-store","faq-import","indexing"],"backgroundTag":"vector-deletion-failed","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}