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 || ''
}