From b923e63bcde8148f92dbe6cc2f978f126f2ec174 Mon Sep 17 00:00:00 2001 From: lacerate551 <128470311+lacerate551@users.noreply.github.com> Date: Tue, 9 Jun 2026 13:32:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(knowledge):=20list=5Fcollections=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8=E4=BF=9D=E6=8A=A4=E4=B8=8E?= =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE=E9=87=8D=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 遍历集合时 try/except 捕获 ChromaDB 异常(NotFoundError/InternalError), 跳过失效集合并自动清理元数据,防止 /collections 500 2. 每次调用从磁盘重载 kb_metadata.json,确保多 worker 进程间状态一致, 修复 GUNICORN_WORKERS>1 时返回数量波动问题 --- knowledge/collection.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/knowledge/collection.py b/knowledge/collection.py index ae06685..26b3ee1 100644 --- a/knowledge/collection.py +++ b/knowledge/collection.py @@ -348,6 +348,8 @@ class CollectionMixin: - department: 所属部门 - description: 描述 """ + # 从磁盘重新加载元数据,确保多 worker 进程间状态一致 + self._metadata = self._load_metadata() result = [] # 扫描 base_path 下的所有子目录作为向量库 @@ -382,16 +384,31 @@ class CollectionMixin: self._save_metadata() + stale_collections = [] + for name, info in self._metadata.get("collections", {}).items(): - collection = self.get_collection(name) - result.append(CollectionInfo( - name=name, - display_name=info.get("display_name", name), - document_count=collection.count() if collection else 0, - created_at=info.get("created_at", ""), - department=info.get("department", ""), - description=info.get("description", "") - )) + try: + collection = self.get_collection(name) + result.append(CollectionInfo( + name=name, + display_name=info.get("display_name", name), + document_count=collection.count() if collection else 0, + created_at=info.get("created_at", ""), + department=info.get("department", ""), + description=info.get("description", "") + )) + except Exception as e: + logger.warning( + f"跳过异常向量库 '{name}': {e},可能是 ChromaDB 数据目录已丢失" + ) + stale_collections.append(name) + + # 清理元数据中指向已失效集合的条目 + if stale_collections: + for name in stale_collections: + self._metadata.get("collections", {}).pop(name, None) + logger.info(f"清理失效向量库元数据: {name}") + self._save_metadata() return result