Tencent/WeKnora · error

failed to delete chunk vectors: %w

Error message

failed to delete chunk vectors: %w

What it means

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.

Source

Thrown at internal/application/service/knowledge_faq_import.go:1424

			faqKnowledge.ID,
			payload.Entries,
		)
		if err != nil {
			return fmt.Errorf("failed to calculate replace operations: %w", err)
		}

		// 删除需要删除的chunks(包括需要更新的旧chunks)
		if len(chunksToDelete) > 0 {
			chunkIDsToDelete := make([]string, 0, len(chunksToDelete))
			for _, chunk := range chunksToDelete {
				chunkIDsToDelete = append(chunkIDsToDelete, chunk.ID)
			}
			if err := s.chunkRepo.DeleteChunks(ctx, tenantID, chunkIDsToDelete); err != nil {
				return fmt.Errorf("failed to delete chunks: %w", err)
			}
			// 删除索引
			if err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {
				return fmt.Errorf("failed to delete chunk vectors: %w", err)
			}
			logger.Infof(ctx, "FAQ import task %s: deleted %d chunks (including updates)", taskID, len(chunksToDelete))
		}
	} else {
		// Append 模式(智能合并):标准问已存在的条目走 merge ops,其余作为新建。
		var mergeOps []faqMergeOperation
		entriesToProcess, mergeOps, skippedCount, err = s.calculateAppendOperations(ctx, tenantID, kb.ID, payload.Entries)
		if err != nil {
			return fmt.Errorf("failed to calculate append operations: %w", err)
		}

		if len(mergeOps) > 0 {
			mergedCount, mergeErr := s.executeFAQMergeOperations(ctx, taskID, kb, faqKnowledge, embeddingModel, indexMode, mergeOps, progress)
			if mergeErr != nil {
				return fmt.Errorf("failed to execute merge operations: %w", mergeErr)
			}
			logger.Infof(ctx, "FAQ import task %s: merged %d entries", taskID, mergedCount)
			progress.MergedCount = mergedCount

View on GitHub (pinned to 988cbb0330)

Solutions

  1. Check vector-store connectivity, credentials, and that the target collection exists
  2. Inspect the wrapped cause to distinguish auth vs network vs not-found errors
  3. Manually reconcile/delete orphaned vectors for the affected knowledge base
  4. Retry the import; add cleanup of orphaned vectors if the DB delete already succeeded

Example fix

// before
if err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {
	return fmt.Errorf("failed to delete chunk vectors: %w", err)
}
// after
if err := s.deleteFAQChunkVectors(ctx, kb, faqKnowledge, chunksToDelete); err != nil {
	logger.Errorf(ctx, "orphaned vectors possible for kb=%s: %v", kb.ID, err)
	return fmt.Errorf("failed to delete chunk vectors: %w", err)
}
Defensive patterns

Strategy: fallback

Validate before calling

// Preflight: verify the vector collection/index is reachable before replace import
if err := vectorStore.Ping(ctx); err != nil {
	return fmt.Errorf("vector store unavailable, postpone import: %w", err)
}
if exists, _ := vectorStore.CollectionExists(ctx, collectionFor(kb)); !exists {
	return fmt.Errorf("vector collection for kb %s missing", kb.ID)
}

Try / catch

err := runReplaceImport(ctx, req)
if err != nil && strings.Contains(err.Error(), "failed to delete chunk vectors") {
	// DB rows already deleted: schedule orphan-vector cleanup, don't fail the task silently
	scheduleOrphanVectorCleanup(kb)
	return err
}
return err

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/21c57ff547347de7. Report an issue: GitHub.