标题: [Bug][数据一致性] 删除知识库文件时 Milvus 向量删除失败被吞,已删除文件的内容仍可被检索
正文:
问题
backend/package/yuxi/knowledge/implementations/milvus.py 的 delete_file_chunks_only(约 1234 行)删除文件时,先删除 PostgreSQL 中的 chunks(chunk_repo.delete_by_file_id),后调 _delete_file_chunks_from_milvus 删除 Milvus 向量——而后者整个包在 try/except 里,失败只 logger.error:
await chunk_repo.delete_by_file_id(file_id)
collection = await self._get_milvus_collection(kb_id)
if collection:
try:
await self._delete_file_chunks_from_milvus(collection, file_id)
except Exception as e:
logger.error(f"Error checking file existence in Milvus: {e}")
若此时 Milvus 不可用/删除失败:PG 的 chunks 和文件记录已删除,但向量仍残留在 Milvus。而检索链路(aquery 纯向量检索)不校验 file_id 是否仍存在于 PG,结果就是——
文件已从知识库删除,其内容仍会出现在后续检索结果中,且无对账/清理机制自愈。
建议
- 调整删除顺序并改为"先删向量、后删 PG"(向量删除是删除是否成功的判定点),或使用"标记删除/墓碑"方案:PG 删除后,检索时校验 file_id 仍存在;
- Milvus 删除失败不应静默吞掉:至少抛错让上层把文件状态置为删除失败、可重试;或进入补偿队列重试;
- 增加定期对账任务(比对 PG file_id 与 Milvus 中残留向量)清理孤儿向量。
标题: [Bug][数据一致性] 删除知识库文件时 Milvus 向量删除失败被吞,已删除文件的内容仍可被检索
正文:
问题
backend/package/yuxi/knowledge/implementations/milvus.py的delete_file_chunks_only(约 1234 行)删除文件时,先删除 PostgreSQL 中的 chunks(chunk_repo.delete_by_file_id),后调_delete_file_chunks_from_milvus删除 Milvus 向量——而后者整个包在try/except里,失败只logger.error:若此时 Milvus 不可用/删除失败:PG 的 chunks 和文件记录已删除,但向量仍残留在 Milvus。而检索链路(
aquery纯向量检索)不校验file_id是否仍存在于 PG,结果就是——文件已从知识库删除,其内容仍会出现在后续检索结果中,且无对账/清理机制自愈。
建议