diff --git a/api/app/routers/knowledge.py b/api/app/routers/knowledge.py index ee43f02..bda6abb 100644 --- a/api/app/routers/knowledge.py +++ b/api/app/routers/knowledge.py @@ -309,7 +309,10 @@ def delete_document(kb_id: str, doc_id: str, db: Session = Depends(get_db)): # ============ Search ============ @router.post("/search") def search_knowledge_base(query: KnowledgeSearchQuery): - return search_knowledge(kb_id=query.kb_id, query=query.query, n_results=query.nResults) + try: + return search_knowledge(kb_id=query.kb_id, query=query.query, n_results=query.nResults) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc # ============ Stats ============ diff --git a/api/app/vector_store.py b/api/app/vector_store.py index 418484a..9b9c350 100644 --- a/api/app/vector_store.py +++ b/api/app/vector_store.py @@ -64,6 +64,8 @@ class VectorStore: ): """添加文档片段到向量库""" collection = self.get_collection(kb_id) + if collection is None: + raise ValueError(f"Knowledge collection not found for kb_id={kb_id}") if ids is None: ids = [f"chunk-{i}" for i in range(len(documents))] @@ -93,6 +95,11 @@ class VectorStore: ) -> Dict: """检索相似文档""" collection = self.get_collection(kb_id) + if collection is None: + raise ValueError( + f"Knowledge collection not found for kb_id={kb_id}. " + "Please ensure the knowledge base exists and documents are indexed." + ) # 生成查询向量 query_embedding = embedding_service.embed_query(query) @@ -108,6 +115,8 @@ class VectorStore: def get_stats(self, kb_id: str) -> Dict: """获取向量库统计""" collection = self.get_collection(kb_id) + if collection is None: + raise ValueError(f"Knowledge collection not found for kb_id={kb_id}") return { "count": collection.count(), "kb_id": kb_id @@ -116,11 +125,15 @@ class VectorStore: def delete_documents(self, kb_id: str, ids: List[str]): """删除指定文档片段""" collection = self.get_collection(kb_id) + if collection is None: + return collection.delete(ids=ids) def delete_by_metadata(self, kb_id: str, document_id: str): """根据文档 ID 删除所有片段""" collection = self.get_collection(kb_id) + if collection is None: + return results = collection.get(where={"document_id": document_id}) if results["ids"]: collection.delete(ids=results["ids"]) @@ -244,9 +257,6 @@ embedding_service = EmbeddingService() def search_knowledge(kb_id: str, query: str, n_results: int = 5) -> Dict: """知识库检索""" - # 生成查询向量 - query_vector = embedding_service.embed_query(query) - # 检索 results = vector_store.search( kb_id=kb_id, diff --git a/web/pages/KnowledgeBase.tsx b/web/pages/KnowledgeBase.tsx index efddc76..4814ef6 100644 --- a/web/pages/KnowledgeBase.tsx +++ b/web/pages/KnowledgeBase.tsx @@ -525,6 +525,8 @@ const KnowledgeBaseDetail: React.FC<{ 文档名称 大小 + 索引状态 + 分片数 上传时间 操作 @@ -536,6 +538,12 @@ const KnowledgeBaseDetail: React.FC<{ {doc.name} {doc.size} + + + {doc.status === 'completed' ? '已索引' : doc.status === 'failed' ? '失败' : doc.status === 'processing' ? '处理中' : '待处理'} + + + {doc.chunkCount ?? 0} {doc.uploadDate}