diff --git a/server/routers/knowledge_router.py b/server/routers/knowledge_router.py index 65057788..1f535ab0 100644 --- a/server/routers/knowledge_router.py +++ b/server/routers/knowledge_router.py @@ -134,12 +134,22 @@ async def update_database_info( name: str = Body(...), description: str = Body(...), llm_info: dict = Body(None), + additional_params: dict = Body({}), # Now accepts a dict current_user: User = Depends(get_admin_user), ): """更新知识库信息""" - logger.debug(f"Update database {db_id} info: {name}, {description}, llm_info: {llm_info}") + logger.debug( + f"Update database {db_id} info: {name}, {description}, llm_info: {llm_info}, " + f"additional_params: {additional_params}" + ) try: - database = await knowledge_base.update_database(db_id, name, description, llm_info) + database = await knowledge_base.update_database( + db_id, + name, + description, + llm_info, + additional_params=additional_params, # Pass the dict to the manager + ) return {"message": "更新成功", "database": database} except Exception as e: logger.error(f"更新数据库失败 {e}, {traceback.format_exc()}") diff --git a/src/knowledge/manager.py b/src/knowledge/manager.py index e46c6ca6..210b2be8 100644 --- a/src/knowledge/manager.py +++ b/src/knowledge/manager.py @@ -246,12 +246,16 @@ class KnowledgeBaseManager: db_id = db_info["db_id"] async with self._metadata_lock: + # 准备 additional_params,包含 auto_generate_questions + saved_params = kwargs.copy() + saved_params["auto_generate_questions"] = False + self.global_databases_meta[db_id] = { "name": database_name, "description": description, "kb_type": kb_type, "created_at": utc_isoformat(), - "additional_params": kwargs.copy(), + "additional_params": saved_params, } self._save_global_metadata() @@ -303,9 +307,13 @@ class KnowledgeBaseManager: # 添加全局元数据中的additional_params信息 if db_info and db_id in self.global_databases_meta: global_meta = self.global_databases_meta[db_id] - additional_params = global_meta.get("additional_params", {}) - if additional_params: - db_info["additional_params"] = additional_params + additional_params = global_meta.get("additional_params", {}).copy() + + # 确保 auto_generate_questions 存在,默认为 False + if "auto_generate_questions" not in additional_params: + additional_params["auto_generate_questions"] = False + + db_info["additional_params"] = additional_params return db_info except KBNotFoundError: @@ -371,7 +379,9 @@ class KnowledgeBaseManager: return False - async def update_database(self, db_id: str, name: str, description: str, llm_info: dict = None) -> dict: + async def update_database( + self, db_id: str, name: str, description: str, llm_info: dict = None, additional_params: dict | None = None + ) -> dict: """更新数据库""" kb_instance = self._get_kb_for_database(db_id) result = kb_instance.update_database(db_id, name, description, llm_info) @@ -380,6 +390,16 @@ class KnowledgeBaseManager: if db_id in self.global_databases_meta: self.global_databases_meta[db_id]["name"] = name self.global_databases_meta[db_id]["description"] = description + + # 合并现有的 additional_params 和新的 additional_params + existing_additional_params = self.global_databases_meta[db_id].get("additional_params", {}) + if additional_params: + existing_additional_params.update(additional_params) + self.global_databases_meta[db_id]["additional_params"] = existing_additional_params + + # 清理旧的 top-level key (如果存在) + self.global_databases_meta[db_id].pop("auto_generate_questions", None) + self._save_global_metadata() return result diff --git a/web/src/components/KnowledgeBaseCard.vue b/web/src/components/KnowledgeBaseCard.vue index 0df1a187..20d23d88 100644 --- a/web/src/components/KnowledgeBaseCard.vue +++ b/web/src/components/KnowledgeBaseCard.vue @@ -66,6 +66,12 @@ + + + + 上传文件后自动生成测试问题 + + { editForm.name = database.value.name || ''; editForm.description = database.value.description || ''; + editForm.auto_generate_questions = database.value.additional_params?.auto_generate_questions || false; + // 如果是 LightRAG 类型,加载当前的 LLM 配置 if (database.value.kb_type === 'lightrag') { const llmInfo = database.value.llm_info || {}; @@ -170,7 +179,10 @@ const handleEditSubmit = () => { editFormRef.value.validate().then(async () => { const updateData = { name: editForm.name, - description: editForm.description + description: editForm.description, + additional_params: { + auto_generate_questions: editForm.auto_generate_questions + } }; // 如果是 LightRAG 类型,包含 llm_info diff --git a/web/src/components/QuerySection.vue b/web/src/components/QuerySection.vue index 0253b56d..d1e1fb32 100644 --- a/web/src/components/QuerySection.vue +++ b/web/src/components/QuerySection.vue @@ -14,18 +14,29 @@ />
- 示例: +
+ + + 示例: + + +
{{ generatingQuestions ? 'AI生成中...' : '加载中...' }}
- + - + - 添加文件后自动生成 + 暂无问题,请点击左侧按钮生成
@@ -136,6 +147,7 @@ import { message } from 'ant-design-vue'; import { queryApi } from '@/apis/knowledge_api'; import { SearchOutlined, + ReloadOutlined, } from '@ant-design/icons-vue'; const store = useDatabaseStore(); @@ -170,7 +182,7 @@ let exampleCarouselInterval = null; // 加载示例问题 const loadSampleQuestions = async () => { if (!store.database?.db_id) return; - + try { loadingQuestions.value = true; const data = await queryApi.getSampleQuestions(store.database.db_id); @@ -202,7 +214,7 @@ const clearQuestions = () => { // 生成示例问题 const generateSampleQuestions = async (silent = false) => { if (!store.database?.db_id) return; - + try { generatingQuestions.value = true; const data = await queryApi.generateSampleQuestions(store.database.db_id, 10); @@ -311,10 +323,10 @@ const onQuery = async () => { onMounted(async () => { // 加载查询参数 store.loadQueryParams(); - + // 加载示例问题 await loadSampleQuestions(); - + // 如果有示例问题,启动轮播 if (queryExamples.value.length > 0) { startExampleCarousel(); @@ -583,10 +595,21 @@ defineExpose({ flex-wrap: wrap; } -.examples-label { - font-size: 12px; +.examples-label-btn { color: var(--gray-500); - white-space: nowrap; + font-size: 12px; + display: flex; + align-items: center; + margin-left: -8px; + + &:hover { + color: var(--main-color); + background-color: var(--gray-100); + } + + .anticon { /* Target Ant Design icons directly */ + font-size: 10px; /* Make icon smaller */ + } } .examples-container { @@ -607,8 +630,13 @@ defineExpose({ text-align: left; white-space: normal; height: auto; - padding: 4px 8px; + padding: 0; font-size: 12px; + color: var(--gray-500); + + &:hover { + color: var(--main-color); + } } .fade-enter-active, diff --git a/web/src/views/DataBaseInfoView.vue b/web/src/views/DataBaseInfoView.vue index 51fee778..00789d3d 100644 --- a/web/src/views/DataBaseInfoView.vue +++ b/web/src/views/DataBaseInfoView.vue @@ -214,15 +214,24 @@ watch( setTimeout(async () => { console.log('文件数量变化,检查是否需要生成问题,querySectionRef:', querySectionRef.value); if (querySectionRef.value) { - console.log('开始重新生成问题...'); - await querySectionRef.value.generateSampleQuestions(true); + // 检查是否开启了自动生成问题 + if (database.value.additional_params?.auto_generate_questions) { + console.log('开始重新生成问题...'); + await querySectionRef.value.generateSampleQuestions(true); + } else { + console.log('自动生成问题已关闭,跳过生成'); + } } else { console.warn('querySectionRef 未准备好,稍后重试'); // 如果组件还没准备好,再等一会儿 setTimeout(async () => { if (querySectionRef.value) { - console.log('延迟后开始生成问题...'); - await querySectionRef.value.generateSampleQuestions(true); + if (database.value.additional_params?.auto_generate_questions) { + console.log('延迟后开始生成问题...'); + await querySectionRef.value.generateSampleQuestions(true); + } else { + console.log('自动生成问题已关闭,跳过生成'); + } } }, 2000); }