From 2fc77aed1526ab32a9e3ecec160a9a9079f79adc Mon Sep 17 00:00:00 2001 From: lxfight <1686540385@qq.com> Date: Mon, 20 Oct 2025 22:23:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E6=A3=80=E7=B4=A2=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A0=B9=E6=8D=AE=E7=9F=A5=E8=AF=86=E5=BA=93=20ID=20?= =?UTF-8?q?=E5=88=97=E5=87=BA=E7=9B=B8=E5=85=B3=E4=BC=9A=E8=AF=9D=EF=BC=9B?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E7=95=8C=E9=9D=A2=E5=92=8C?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../knowledge_base/kb_manager_lifecycle.py | 7 +- astrbot/dashboard/routes/knowledge_base.py | 49 ++++ .../zh-CN/features/knowledge-base/detail.json | 47 +++- .../src/views/knowledge-base/KBDetail.vue | 12 +- .../components/RetrievalTab.vue | 243 +++++++++++++++++ .../knowledge-base/components/SessionsTab.vue | 245 ++++-------------- 6 files changed, 391 insertions(+), 212 deletions(-) create mode 100644 dashboard/src/views/knowledge-base/components/RetrievalTab.vue diff --git a/astrbot/core/knowledge_base/kb_manager_lifecycle.py b/astrbot/core/knowledge_base/kb_manager_lifecycle.py index 161872b4a..97ed80437 100644 --- a/astrbot/core/knowledge_base/kb_manager_lifecycle.py +++ b/astrbot/core/knowledge_base/kb_manager_lifecycle.py @@ -238,10 +238,13 @@ class KnowledgeBaseManager: ) if len(embedding_providers) > 1 and not configured_provider_id: - logger.warning( + provider = embedding_providers[0] + provider_id = provider.meta().id + logger.info( f"检测到 {len(embedding_providers)} 个 Embedding Provider," - f"但未指定使用哪个,将默认使用第一个" + f"未在配置文件中指定 embedding_provider_id,将使用第一个: {provider_id}" ) + return provider provider = embedding_providers[0] provider_id = provider.meta().id diff --git a/astrbot/dashboard/routes/knowledge_base.py b/astrbot/dashboard/routes/knowledge_base.py index 729d98059..53b10d59a 100644 --- a/astrbot/dashboard/routes/knowledge_base.py +++ b/astrbot/dashboard/routes/knowledge_base.py @@ -57,6 +57,7 @@ class KnowledgeBaseRoute(Route): "/kb/session/config/set": ("POST", self.set_session_config), "/kb/session/config/delete": ("POST", self.delete_session_config), "/kb/session/config/list": ("GET", self.list_session_configs), + "/kb/session/config/list_by_kb": ("GET", self.list_sessions_by_kb), } self.register_routes() @@ -1241,3 +1242,51 @@ class KnowledgeBaseRoute(Route): logger.error(f"获取会话配置列表失败: {e}") logger.error(traceback.format_exc()) return Response().error(f"获取会话配置列表失败: {str(e)}").__dict__ + + async def list_sessions_by_kb(self): + """获取使用特定知识库的会话列表 + + Query 参数: + - kb_id: 知识库 ID (必填) + """ + try: + kb_db = self.kb_db if self.kb_db else self._get_kb_manager() and self.kb_db + kb_id = request.args.get("kb_id") + + if not kb_id: + return Response().error("缺少参数 kb_id").__dict__ + + # 获取所有会话配置 + configs = await kb_db.list_all_session_configs(offset=0, limit=1000) + + import json + + # 筛选包含该知识库的会话 + session_list = [] + for config in configs: + kb_ids = json.loads(config.kb_ids) + if kb_id in kb_ids: + session_dict = { + "config_id": config.config_id, + "scope": config.scope, + "scope_id": config.scope_id, + "kb_ids": kb_ids, + "top_k": config.top_k, + "enable_rerank": config.enable_rerank, + "created_at": config.created_at.isoformat(), + "updated_at": config.updated_at.isoformat(), + } + session_list.append(session_dict) + + return ( + Response() + .ok({"sessions": session_list, "total": len(session_list), "kb_id": kb_id}) + .__dict__ + ) + + except ValueError as e: + return Response().error(str(e)).__dict__ + except Exception as e: + logger.error(f"获取知识库会话列表失败: {e}") + logger.error(traceback.format_exc()) + return Response().error(f"获取知识库会话列表失败: {str(e)}").__dict__ diff --git a/dashboard/src/i18n/locales/zh-CN/features/knowledge-base/detail.json b/dashboard/src/i18n/locales/zh-CN/features/knowledge-base/detail.json index 93407e66a..7cbc3be74 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/knowledge-base/detail.json +++ b/dashboard/src/i18n/locales/zh-CN/features/knowledge-base/detail.json @@ -4,7 +4,8 @@ "tabs": { "overview": "概览", "documents": "文档管理", - "sessions": "会话配置", + "retrieval": "知识库检索", + "sessions": "使用会话", "settings": "设置" }, "overview": { @@ -57,24 +58,44 @@ "fileRequired": "请选择要上传的文件" }, "sessions": { - "title": "会话配置", - "subtitle": "配置哪些会话可以使用此知识库", - "empty": "暂无会话配置", - "add": "添加配置", + "title": "使用该知识库的会话", + "subtitle": "以下会话正在使用此知识库", + "empty": "暂无会话使用此知识库", + "refresh": "刷新", "scope": "范围", - "scopeId": "标识", + "scopeId": "会话标识", "topK": "返回结果数", "enableRerank": "启用重排序", "actions": "操作", - "edit": "编辑", - "delete": "删除", "scopeSession": "会话级别", "scopePlatform": "平台级别", - "deleteConfirm": "确定要删除此配置吗?", - "addSuccess": "配置添加成功", - "addFailed": "配置添加失败", - "deleteSuccess": "配置删除成功", - "deleteFailed": "配置删除失败" + "viewInSessionManagement": "在会话管理中查看", + "goToSessionManagement": "前往会话管理", + "loadFailed": "加载会话列表失败" + }, + "retrieval": { + "title": "知识库检索", + "subtitle": "使用稠密检索和稀疏检索测试知识库内容", + "query": "检索查询", + "queryPlaceholder": "输入要检索的内容...", + "search": "检索", + "searching": "检索中...", + "results": "检索结果", + "noResults": "没有找到相关内容", + "tryDifferentQuery": "尝试使用不同的查询词", + "settings": "检索设置", + "topK": "返回结果数量", + "topKHint": "最多返回多少条检索结果", + "enableRerank": "启用重排序", + "enableRerankHint": "使用重排序模型提高检索质量", + "score": "相关度分数", + "document": "所属文档", + "chunk": "文本块 #{index}", + "content": "内容", + "charCount": "{count} 字符", + "searchSuccess": "检索完成,找到 {count} 条结果", + "searchFailed": "检索失败", + "queryRequired": "请输入检索查询" }, "settings": { "title": "知识库设置", diff --git a/dashboard/src/views/knowledge-base/KBDetail.vue b/dashboard/src/views/knowledge-base/KBDetail.vue index 5a167342d..610083614 100644 --- a/dashboard/src/views/knowledge-base/KBDetail.vue +++ b/dashboard/src/views/knowledge-base/KBDetail.vue @@ -36,6 +36,10 @@ {{ t('tabs.documents') }} {{ kb.doc_count || 0 }} + + mdi-magnify + {{ t('tabs.retrieval') }} + mdi-account-multiple {{ t('tabs.sessions') }} @@ -157,7 +161,12 @@ - + + + + + + @@ -182,6 +191,7 @@ import { useRoute } from 'vue-router' import axios from 'axios' import { useModuleI18n } from '@/i18n/composables' import DocumentsTab from './components/DocumentsTab.vue' +import RetrievalTab from './components/RetrievalTab.vue' import SessionsTab from './components/SessionsTab.vue' import SettingsTab from './components/SettingsTab.vue' diff --git a/dashboard/src/views/knowledge-base/components/RetrievalTab.vue b/dashboard/src/views/knowledge-base/components/RetrievalTab.vue new file mode 100644 index 000000000..f041d94f1 --- /dev/null +++ b/dashboard/src/views/knowledge-base/components/RetrievalTab.vue @@ -0,0 +1,243 @@ + + + + {{ t('retrieval.title') }} + + {{ t('retrieval.subtitle') }} + + + + + + + + + + + + + {{ t('retrieval.settings') }} + + + + + + + + + + + {{ loading ? t('retrieval.searching') : t('retrieval.search') }} + + + + + + + + + {{ t('retrieval.results') }} + + {{ results.length }} {{ t('retrieval.results') }} + + + + + + + + + #{{ index + 1 }} + + + {{ t('retrieval.chunk', { index: result.chunk_index }) }} + + + + {{ t('retrieval.score') }}: {{ result.score.toFixed(4) }} + + + + + + + + + mdi-file-document + {{ result.doc_name }} + + + mdi-text + {{ t('retrieval.charCount', { count: result.char_count }) }} + + + + + {{ result.content }} + + + + + + + + mdi-text-box-search-outline + {{ t('retrieval.noResults') }} + {{ t('retrieval.tryDifferentQuery') }} + + + + + + + + {{ snackbar.text }} + + + + + + + diff --git a/dashboard/src/views/knowledge-base/components/SessionsTab.vue b/dashboard/src/views/knowledge-base/components/SessionsTab.vue index 29cbcfa1e..8cc4a3a33 100644 --- a/dashboard/src/views/knowledge-base/components/SessionsTab.vue +++ b/dashboard/src/views/knowledge-base/components/SessionsTab.vue @@ -5,13 +5,13 @@ {{ t('sessions.title') }} - {{ t('sessions.add') }} + {{ t('sessions.refresh') }} @@ -41,11 +41,12 @@ @@ -53,99 +54,21 @@ mdi-account-multiple-outline {{ t('sessions.empty') }} + + {{ t('sessions.goToSessionManagement') }} + - - - - - {{ t('sessions.add') }} - - - - - - - - - - - - - - - - - - - - - - - 取消 - - 添加 - - - - - - - - - 确认删除 - - - {{ t('sessions.deleteConfirm') }} - - - - - 取消 - - 删除 - - - - - {{ snackbar.text }} @@ -155,10 +78,12 @@
{{ t('retrieval.noResults') }}
{{ t('retrieval.tryDifferentQuery') }}
{{ t('sessions.empty') }}
{{ t('sessions.deleteConfirm') }}