Skip to content

Commit 164640a

Browse files
committed
fix: 改进知识库模块初始化和检索错误处理
1 parent a3fba97 commit 164640a

2 files changed

Lines changed: 22 additions & 13 deletions

File tree

astrbot/core/knowledge_base/kb_mgr.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import traceback
21
from pathlib import Path
32

43
from astrbot.core import logger
@@ -56,8 +55,7 @@ async def initialize(self) -> None:
5655
logger.error(f"知识库模块导入失败: {e}")
5756
logger.warning("请确保已安装所需依赖: pypdf, aiofiles, Pillow, rank-bm25")
5857
except Exception as e:
59-
logger.error(f"知识库模块初始化失败: {e}")
60-
logger.error(traceback.format_exc())
58+
logger.error(f"知识库模块初始化失败: {e}", exc_info=True)
6159

6260
async def _init_kb_database(self) -> None:
6361
self.kb_db = KBSQLiteDatabase(DB_PATH.as_posix())
@@ -80,8 +78,10 @@ async def load_kbs(self) -> None:
8078
await kb_helper.initialize()
8179
except Exception as e:
8280
kb_helper.init_error = str(e)
83-
logger.error(f"知识库 {record.kb_name}({record.kb_id}) 初始化失败: {e}")
84-
logger.error(traceback.format_exc())
81+
logger.error(
82+
f"知识库 {record.kb_name}({record.kb_id}) 初始化失败: {e}",
83+
exc_info=True,
84+
)
8585
self.kb_insts[record.kb_id] = kb_helper
8686

8787
async def create_kb(
@@ -210,12 +210,14 @@ async def update_kb(
210210

211211
# re-initialize to pick up provider changes
212212
try:
213+
await kb_helper.terminate()
213214
await kb_helper.initialize()
214215
kb_helper.init_error = None
215216
except Exception as e:
216217
kb_helper.init_error = str(e)
217-
logger.error(f"知识库 {kb.kb_name}({kb.kb_id}) 重新初始化失败: {e}")
218-
logger.error(traceback.format_exc())
218+
logger.error(
219+
f"知识库 {kb.kb_name}({kb.kb_id}) 重新初始化失败: {e}", exc_info=True
220+
)
219221

220222
return kb_helper
221223

@@ -229,16 +231,21 @@ async def retrieve(
229231
"""从指定知识库中检索相关内容"""
230232
kb_ids = []
231233
kb_id_helper_map = {}
234+
unavailable_kbs = []
232235
for kb_name in kb_names:
233236
if kb_helper := await self.get_kb_by_name(kb_name):
234237
if kb_helper.init_error:
235-
logger.error(f"知识库 {kb_name} 不可用: {kb_helper.init_error}")
236-
raise ValueError(
237-
f"知识库 {kb_name} 不可用: {kb_helper.init_error}",
238-
)
238+
unavailable_kbs.append((kb_name, kb_helper.init_error))
239+
logger.warning(f"知识库 {kb_name} 不可用: {kb_helper.init_error}")
240+
continue
239241
kb_ids.append(kb_helper.kb.kb_id)
240242
kb_id_helper_map[kb_helper.kb.kb_id] = kb_helper
241243

244+
# all requested KBs are unavailable
245+
if not kb_ids and unavailable_kbs:
246+
errors = "; ".join(f"{n}: {e}" for n, e in unavailable_kbs)
247+
raise ValueError(f"所有请求的知识库均不可用: {errors}")
248+
242249
if not kb_ids:
243250
return {}
244251

astrbot/core/knowledge_base/retrieval/manager.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,10 @@ async def _dense_retrieve(
232232

233233
all_results.extend(vec_results)
234234
except Exception as e:
235-
logger.error(f"知识库 {kb_id} 稠密检索失败: {e}")
236-
raise RuntimeError(f"知识库 {kb_id} 稠密检索失败: {e}") from e
235+
logger.error(f"知识库 {kb_id} 稠密检索失败: {e}", exc_info=True)
236+
if len(kb_ids) == 1:
237+
raise RuntimeError(f"知识库 {kb_id} 稠密检索失败: {e}") from e
238+
# multi-KB: skip the faulty KB and continue
237239

238240
# 按相似度排序并返回 top_k
239241
all_results.sort(key=lambda x: x.similarity, reverse=True)

0 commit comments

Comments
 (0)