From a05868cc457a5c1a9b3f14159948db4e04669d03 Mon Sep 17 00:00:00 2001 From: lxfight <1686540385@qq.com> Date: Mon, 20 Oct 2025 22:38:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E7=AE=A1=E7=90=86=E5=99=A8=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=87=8D=E6=8E=92=E5=BA=8F=E6=A8=A1=E5=9E=8B=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E5=95=86=EF=BC=8C=E8=B0=83=E6=95=B4=E7=9B=B8=E5=85=B3=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E9=BB=98=E8=AE=A4=E9=85=8D=E7=BD=AE=E5=92=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../knowledge_base/kb_manager_lifecycle.py | 1 + astrbot/core/knowledge_base/manager.py | 22 +++++++++++++++++-- astrbot/core/knowledge_base/models.py | 2 +- .../components/RetrievalTab.vue | 5 ++++- .../knowledge-base/components/SessionsTab.vue | 9 ++++---- .../knowledge-base/components/SettingsTab.vue | 10 +++++++-- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/astrbot/core/knowledge_base/kb_manager_lifecycle.py b/astrbot/core/knowledge_base/kb_manager_lifecycle.py index 97ed80437..0768874fa 100644 --- a/astrbot/core/knowledge_base/kb_manager_lifecycle.py +++ b/astrbot/core/knowledge_base/kb_manager_lifecycle.py @@ -177,6 +177,7 @@ class KnowledgeBaseManager: storage_path=files_path, parsers=parsers, chunker=chunker, + provider_manager=self.provider_manager, ) async def _init_retrieval_manager(self): diff --git a/astrbot/core/knowledge_base/manager.py b/astrbot/core/knowledge_base/manager.py index 497f64ac7..c4d31ba45 100644 --- a/astrbot/core/knowledge_base/manager.py +++ b/astrbot/core/knowledge_base/manager.py @@ -34,6 +34,7 @@ class KBManager: storage_path: str, parsers: dict[str, BaseParser], chunker: BaseChunker, + provider_manager=None, ): self.db = db self.vec_db = vec_db @@ -42,6 +43,7 @@ class KBManager: self.files_path = self.storage_path / "files" self.parsers = parsers self.chunker = chunker + self.provider_manager = provider_manager # 确保目录存在 self.media_path.mkdir(parents=True, exist_ok=True) @@ -63,7 +65,23 @@ class KBManager: top_m_final: Optional[int] = None, enable_rerank: Optional[bool] = None, ) -> KnowledgeBase: - """创建知识库""" + """创建知识库 + + Args: + enable_rerank: 是否启用重排序。 + - 如果明确传入 True/False,则使用该值 + - 如果为 None,则根据是否有可用的 rerank provider 自动决定 + """ + # 智能决定 enable_rerank 的默认值 + if enable_rerank is None: + # 检查是否有可用的 rerank provider + has_rerank_provider = ( + self.provider_manager + and hasattr(self.provider_manager, 'rerank_provider_insts') + and len(self.provider_manager.rerank_provider_insts) > 0 + ) + enable_rerank = has_rerank_provider + kb = KnowledgeBase( kb_name=kb_name, description=description, @@ -75,7 +93,7 @@ class KBManager: top_k_dense=top_k_dense if top_k_dense is not None else 50, top_k_sparse=top_k_sparse if top_k_sparse is not None else 50, top_m_final=top_m_final if top_m_final is not None else 5, - enable_rerank=enable_rerank if enable_rerank is not None else True, + enable_rerank=enable_rerank, ) async with self.db.get_db() as session: session.add(kb) diff --git a/astrbot/core/knowledge_base/models.py b/astrbot/core/knowledge_base/models.py index 28adbaa0d..6ec77ad93 100644 --- a/astrbot/core/knowledge_base/models.py +++ b/astrbot/core/knowledge_base/models.py @@ -49,7 +49,7 @@ class KnowledgeBase(SQLModel, table=True): top_k_dense: Optional[int] = Field(default=50, nullable=True) top_k_sparse: Optional[int] = Field(default=50, nullable=True) top_m_final: Optional[int] = Field(default=5, nullable=True) - enable_rerank: Optional[bool] = Field(default=True, nullable=True) + enable_rerank: Optional[bool] = Field(default=False, nullable=True) created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) updated_at: datetime = Field( default_factory=lambda: datetime.now(timezone.utc), diff --git a/dashboard/src/views/knowledge-base/components/RetrievalTab.vue b/dashboard/src/views/knowledge-base/components/RetrievalTab.vue index f041d94f1..2bc5e6346 100644 --- a/dashboard/src/views/knowledge-base/components/RetrievalTab.vue +++ b/dashboard/src/views/knowledge-base/components/RetrievalTab.vue @@ -45,6 +45,9 @@ density="compact" persistent-hint /> + + 如果没有配置重排序模型提供商,将跳过重排序步骤 + @@ -147,7 +150,7 @@ const props = defineProps<{ const loading = ref(false) const query = ref('') const topK = ref(5) -const enableRerank = ref(true) +const enableRerank = ref(false) const results = ref([]) const hasSearched = ref(false) diff --git a/dashboard/src/views/knowledge-base/components/SessionsTab.vue b/dashboard/src/views/knowledge-base/components/SessionsTab.vue index 8cc4a3a33..c5c0e56e9 100644 --- a/dashboard/src/views/knowledge-base/components/SessionsTab.vue +++ b/dashboard/src/views/knowledge-base/components/SessionsTab.vue @@ -117,20 +117,19 @@ const headers = [ // 加载使用该知识库的会话 const loadSessions = async () => { loading.value = true - console.log('[SessionsTab] 开始加载会话列表, kb_id:', props.kbId) + try { const url = '/api/kb/session/config/list_by_kb' const params = { kb_id: props.kbId } - console.log('[SessionsTab] 请求URL:', url, '参数:', params) + const response = await axios.get(url, { params }) - console.log('[SessionsTab] 响应状态:', response.status) - console.log('[SessionsTab] 响应数据:', response.data) + if (response.data.status === 'ok') { sessions.value = response.data.data.sessions - console.log('[SessionsTab] 成功加载会话列表, 数量:', sessions.value.length) + } else { console.error('[SessionsTab] API返回错误:', response.data.message) showSnackbar(response.data.message || t('sessions.loadFailed'), 'error') diff --git a/dashboard/src/views/knowledge-base/components/SettingsTab.vue b/dashboard/src/views/knowledge-base/components/SettingsTab.vue index 7eba48d02..e0f10936f 100644 --- a/dashboard/src/views/knowledge-base/components/SettingsTab.vue +++ b/dashboard/src/views/knowledge-base/components/SettingsTab.vue @@ -68,8 +68,14 @@ + + 当前没有可用的重排序模型提供商,请先在提供商管理中添加支持 rerank 的模型 + @@ -211,7 +217,7 @@ const formData = ref({ top_k_dense: 50, top_k_sparse: 50, top_m_final: 5, - enable_rerank: true, + enable_rerank: false, embedding_provider_id: '', rerank_provider_id: '' }) @@ -225,7 +231,7 @@ watch(() => props.kb, (kb) => { top_k_dense: kb.top_k_dense || 50, top_k_sparse: kb.top_k_sparse || 50, top_m_final: kb.top_m_final || 5, - enable_rerank: kb.enable_rerank !== false, + enable_rerank: kb.enable_rerank === true, embedding_provider_id: kb.embedding_provider_id || '', rerank_provider_id: kb.rerank_provider_id || '' }