Просмотр исходного кода

v0.0.4-功能优化
- 更新config.ini.template

WangXuMing 2 месяцев назад
Родитель
Сommit
17c7e94f31

+ 65 - 100
config/config.ini.template

@@ -1,72 +1,75 @@
-# LQ Agent Platform 配置文件
+# LQ Agent Platform 配置文件模板
+# 说明: 复制此文件为 config.ini 并根据实际环境修改配置值
 
 
 [model]
-# 模型类型选择: gemini, deepseek, doubao, qwen
-MODEL_TYPE=gemini
+MODEL_TYPE=lq_qwen3_8b
 
 # Embedding模型类型选择: lq_qwen3_8b_emd, siliconflow_embed
 EMBEDDING_MODEL_TYPE=lq_qwen3_8b_emd
 
-# Rerank模型类型选择: bge, qwen3
-RERANK_MODEL_TYPE=bge
+# Rerank模型类型选择: bge_rerank_model, lq_rerank_model, silicoflow_rerank_model
+RERANK_MODEL_TYPE=lq_rerank_model
 
 
 
-# ==================== 模型配置 ====================
-
 [gemini]
-# Gemini 模型配置
 GEMINI_SERVER_URL=https://generativelanguage.googleapis.com/v1beta/openai/
 GEMINI_MODEL_ID=gemini-2.0-flash
 GEMINI_API_KEY=AIzaSyBwcjYoxci4QM1mqIaVcbIf_zmsrN9yuWE
 
 [deepseek]
-# DeepSeek 模型配置
 DEEPSEEK_SERVER_URL=https://api.deepseek.com
 DEEPSEEK_MODEL_ID=deepseek-chat
 DEEPSEEK_API_KEY=sk-9fe722389bac47e9ab30cf45b32eb736
 
 [doubao]
-# 豆包 模型配置
 DOUBAO_SERVER_URL=https://ark.cn-beijing.volces.com/api/v3/
 DOUBAO_MODEL_ID=doubao-seed-1-6-flash-250715
 DOUBAO_API_KEY=c98686df-506f-432c-98de-32e571a8e916
 
+
 [qwen]
-# Qwen 模型配置
 QWEN_SERVER_URL=https://api-inference.modelscope.cn/v1/
 QWEN_MODEL_ID=Qwen/Qwen3-4B
 QWEN_API_KEY=ms-9ad4a379-d592-4acd-b92c-8bac08a4a045
 
 
+[ai_review]
+# 调试模式配置
+MAX_REVIEW_UNITS=1
+REVIEW_MODE=first
+# REVIEW_MODE=all/random/first
 
-# ==================== 本地模型配置 ====================
 
-[lq_qwen3_8b]
-# 本地 Qwen3-8B 模型配置
-QWEN_LOCAL_1_5B_SERVER_URL=http://192.168.91.253:9002/v1
-QWEN_LOCAL_1_5B_MODEL_ID=Qwen3-8B
-QWEN_LOCAL_1_5B_API_KEY=dummy
+[app]
+APP_CODE=lq-agent
+APP_SECRET=sx-73d32556-605e-11f0-9dd8-acde48001122
 
-[lq_qwen3_4b]
-# 本地 Qwen3-4B 模型配置
-QWEN_LOCAL_1_5B_SERVER_URL=http://192.168.91.253:9001/v1
-QWEN_LOCAL_1_5B_MODEL_ID=Qwen3-4B
-QWEN_LOCAL_1_5B_API_KEY=dummy
 
-[lq_qwen3_8B_lora]
-# 本地 Qwen3-8B LoRA 模型配置
-LQ_QWEN3_8B_LQ_LORA_SERVER_URL=http://192.168.91.253:9006/v1
-LQ_QWEN3_8B_LQ_LORA_MODEL_ID=Qwen3-8B-lq-lora
-LQ_QWEN3_8B_LQ_LORA_API_KEY=dummy
+[launch]
+HOST = 0.0.0.0
+LAUNCH_PORT = 8002
+
+[redis]
+REDIS_URL=redis://127.0.0.1:6379/0
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_DB=0
+REDIS_PASSWORD=123456
+REDIS_MAX_CONNECTIONS=50
 
+[log]
+LOG_FILE_PATH=logs
+LOG_FILE_MAX_MB=10
+LOG_BACKUP_COUNT=5
+CONSOLE_OUTPUT=True
 
+[user_lists]
+USERS=['user-001']
 
-# ==================== 第三方API配置 ====================
 
 [siliconflow]
-# 硅基流动 API 配置
 SLCF_MODEL_SERVER_URL=https://api.siliconflow.cn/v1
 SLCF_API_KEY=sk-npqfinszhdvnwvensnjmlqtihgevehqiyfwunedxnefkmrud
 SLCF_CHAT_MODEL_ID=test-model
@@ -81,34 +84,42 @@ SLCF_EMBED_API_KEY=sk-lgumiafjofmfzbbjusplckaijbtlcnvmugydteqpljvejsel
 SLCF_EMBED_MODEL_ID=Qwen/Qwen3-Embedding-8B
 SLCF_EMBED_DIMENSIONS=4096
 
+[lq_qwen3_8b]
+QWEN_LOCAL_1_5B_SERVER_URL=http://192.168.91.253:9002/v1
+QWEN_LOCAL_1_5B_MODEL_ID=Qwen3-8B
+QWEN_LOCAL_1_5B_API_KEY=dummy
 
+[lq_qwen3_4b]
+QWEN_LOCAL_1_5B_SERVER_URL=http://192.168.91.253:9001/v1
+QWEN_LOCAL_1_5B_MODEL_ID=Qwen3-4B
+QWEN_LOCAL_1_5B_API_KEY=dummy
 
-# ==================== 应用配置 ====================
-
-[app]
-# 应用代码和密钥
-APP_CODE=lq-agent
-APP_SECRET=sx-73d32556-605e-11f0-9dd8-acde48001122
-
-
-
-# ==================== 启动配置 ====================
-
-[launch]
-HOST=0.0.0.0
-LAUNCH_PORT=8002
-
+# 本地部署的Qwen3-Reranker-8B配置
+[lq_rerank_model]
+LQ_RERANKER_SERVER_URL=http://192.168.91.253:9004/v1/rerank
+LQ_RERANKER_MODEL=Qwen3-Reranker-8B
+LQ_RERANKER_API_KEY=dummy
+LQ_RERANKER_TOP_N=10
+
+# 硅基流动API的Qwen3-Reranker-8B配置
+[silicoflow_rerank_model]
+SILICOFLOW_RERANKER_API_URL=https://api.siliconflow.cn/v1/rerank
+SILICOFLOW_RERANKER_API_KEY=sk-lgumiafjofmfzbbjusplckaijbtlcnvmugydteqpljvejsel
+SILICOFLOW_RERANKER_MODEL=Qwen/Qwen3-Reranker-8B
+
+# BGE Reranker配置
+[bge_rerank_model]
+BGE_RERANKER_SERVER_URL=http://192.168.91.253:9004/rerank
+BGE_RERANKER_MODEL=BAAI/bge-reranker-v2-m3
+BGE_RERANKER_API_KEY=dummy
+BGE_RERANKER_TOP_N=10
 
+[lq_qwen3_8B_lora]
+LQ_QWEN3_8B_LQ_LORA_SERVER_URL=http://192.168.91.253:9006/v1
+LQ_QWEN3_8B_LQ_LORA_MODEL_ID=Qwen3-8B-lq-lora
+LQ_QWEN3_8B_LQ_LORA_API_KEY=dummy
 
-# ==================== 数据库配置 ====================
 
-[redis]
-REDIS_URL=redis://127.0.0.1:6379/0
-REDIS_HOST=127.0.0.1
-REDIS_PORT=6379
-REDIS_DB=0
-REDIS_PASSWORD=123456
-REDIS_MAX_CONNECTIONS=50
 
 [mysql]
 MYSQL_HOST=192.168.92.61
@@ -120,6 +131,7 @@ MYSQL_MIN_SIZE=1
 MYSQL_MAX_SIZE=5
 MYSQL_AUTO_COMMIT=True
 
+
 [pgvector]
 PGVECTOR_HOST=124.223.140.149
 PGVECTOR_PORT=7432
@@ -127,6 +139,7 @@ PGVECTOR_DB=vector_db
 PGVECTOR_USER=vector_user
 PGVECTOR_PASSWORD=pg16@123
 
+
 [milvus]
 MILVUS_HOST=192.168.92.61
 MILVUS_PORT=19530
@@ -136,57 +149,9 @@ MILVUS_USER=
 MILVUS_PASSWORD=
 
 
-
-# ==================== RAG 检索配置 ====================
-
 [hybrid_search]
 # 混合检索权重配置
 DENSE_WEIGHT=0.3
 SPARSE_WEIGHT=0.7
 
-[retrieval]
-# 召回配置
-
-
 
-# ==================== 重排序模型配置 ====================
-
-[rerank_model]
-# BGE Reranker 配置(本地部署)
-BGE_RERANKER_SERVER_RUL=http://192.168.91.253:9005/v1/rerank
-BGE_RERANKER_MODEL_ID=BAAI/bge-reranker-v2-m3
-BGE_RERANKER_API_KEY=dummy
-BGE_RERANKER_TOP_N=10
-
-[rerank_model_qwen]
-# Qwen3-Reranker-8B 配置(硅基流动API)
-QWEN_RERANKER_API_URL=https://api.siliconflow.cn/v1/rerank
-QWEN_RERANKER_API_KEY=sk-npqfinszhdvnwvensnjmlqtihgevehqiyfwunedxnefkmrud
-QWEN_RERANKER_MODEL=Qwen/Qwen3-Reranker-8B
-
-
-
-# ==================== AI审查配置 ====================
-
-[ai_review]
-# 调试模式配置
-MAX_REVIEW_UNITS=1
-REVIEW_MODE=first
-# REVIEW_MODE=all/random/first
-
-
-
-# ==================== 日志配置 ====================
-
-[log]
-LOG_FILE_PATH=logs
-LOG_FILE_MAX_MB=10
-LOG_BACKUP_COUNT=5
-CONSOLE_OUTPUT=True
-
-
-
-# ==================== 用户配置 ====================
-
-[user_lists]
-USERS=['user-001']

+ 5 - 1
core/base/task_models.py

@@ -38,7 +38,7 @@ class TaskFileInfo:
         self.review_config = file_info.get('review_config', [])
         self.project_plan_type = file_info.get('project_plan_type', '')
         self.tendency_review_role = file_info.get('tendency_review_role', '')
-
+        self.test_designation_chunk_flag = file_info.get('test_designation_chunk_flag', '')
         # 时间戳信息
         self.launched_at = file_info.get('launched_at', 0)
 
@@ -63,6 +63,10 @@ class TaskFileInfo:
         """获取倾向性审查角色"""
         return self.tendency_review_role
 
+    def get_test_designation_chunk_flag(self) -> str:
+        """获取测试定位标志符"""
+        return self.test_designation_chunk_flag
+
     def has_review_type(self, review_type: str) -> bool:
         """检查是否包含指定的审查类型"""
         return review_type in self.review_config

+ 2 - 2
core/construction_review/component/document_processor.py

@@ -549,8 +549,8 @@ class DocumentProcessor:
                 # 处理原始大纲,按章节层级结构化 - 复用doc_worker的逻辑
                 result['outline'] = self._create_outline_from_toc(raw_content.get('toc_info', {}))
 
-            # with open(rf"temp\document_temp\文档切分预处理结果.json", 'w', encoding='utf-8') as f:
-            #     json.dump(result, f, ensure_ascii=False, indent=4)
+            with open(rf"temp\document_temp\文档切分预处理结果.json", 'w', encoding='utf-8') as f:
+                json.dump(result, f, ensure_ascii=False, indent=4)
             return result
 
         except Exception as e:

+ 82 - 7
core/construction_review/workflows/ai_review_workflow.py

@@ -154,12 +154,13 @@ class AIReviewWorkflow:
         workflow.set_entry_point("start")
         workflow.add_edge("start", "initialize_progress")
         workflow.add_edge("initialize_progress", "ai_review")
-        workflow.add_edge("ai_review", "save_results")
+        # 删除默认边,由条件边控制路由
+        # workflow.add_edge("ai_review", "save_results")
         workflow.add_edge("save_results", "complete")
         workflow.add_edge("complete", END)
         workflow.add_edge("error_handler", END)
 
-        # 添加条件边(错误处理)
+        # 添加条件边(错误处理)- 替代默认边
         workflow.add_conditional_edges(
             "ai_review",
             self.inter_tool._check_ai_review_result,
@@ -268,9 +269,23 @@ class AIReviewWorkflow:
         """
         try:
             logger.info(f"AI审查节点开始执行,任务ID: {self.task_info.callback_task_id}")
+            test_designation_chunk_flag = self.task_info.get_test_designation_chunk_flag()
+            logger.info(f"测试定位标志: {test_designation_chunk_flag}")
 
             # 1. 准备审查单元数据
-            review_chunks, total_units = await self.core_fun._prepare_review_units(state)
+            review_chunks, total_units = await self.core_fun._prepare_review_units(state, test_designation_chunk_flag)
+
+            # 检查指定测试章节是否未找到
+            if test_designation_chunk_flag is not None and not review_chunks:
+                error_msg = f"AI审查测试失败:未找到指定审查标志「{test_designation_chunk_flag}」。请修改指定审查标识字段串,建议去除前后符号等(如书名号《》、括号()等),使用更简洁的关键词重新尝试。"
+                logger.error(f"🔴 {error_msg}")
+                return {
+                    "current_stage": "ai_review",
+                    "error_message": error_msg,
+                    "status": "failed",
+                    "messages": [AIMessage(content=error_msg)]
+                }
+
             logger.info(f"准备审查单元完成,总单元数: {total_units}, 实际审查: {len(review_chunks)}")
 
             if not review_chunks:
@@ -534,7 +549,7 @@ class AIReviewWorkflow:
                 stage_name="AI审查",
                 current=50,
                 status="failed",
-                message=f"AI审查失败: {state['error_message']}",
+                message=f"{state['error_message']}",
                 overall_task_status="failed",
                 event_type="error"
             )
@@ -729,15 +744,35 @@ class AIReviewCoreFun:
 
 
 
-    async def _prepare_review_units(self, state: AIReviewState) -> tuple:
+    async def _prepare_review_units(self, state: AIReviewState, test_designation_chunk_flag) -> tuple:
         """准备审查单元数据 (增加清理旧进度缓存)"""
         try:
             # 筛选要审查的单元
             all_chunks = state['structured_content']['chunks']
-            # 筛除编制依据章节 state['structured_content']['chunks']['chapter_classification'] != "Basis"
+            # 筛除编制依据章节
             clearned_chunks = self._remove_basis_chunks(all_chunks)
-            review_chunks = self._filter_review_units(clearned_chunks)
+
+            # 判断是否需要筛选指定测试章节
+            if test_designation_chunk_flag is not None:
+                # 用户指定了测试章节,进行筛选
+                logger.info(f"开始筛选指定测试章节: {test_designation_chunk_flag}")
+                designation_test_chunk = self._designation_test_chunks(clearned_chunks, test_designation_chunk_flag)
+
+                if not designation_test_chunk:
+                    # 指定了测试章节但未找到,返回空列表
+                    logger.warning(f"未找到包含关键字 '{test_designation_chunk_flag}' 的测试章节,建议去除前后符号(如《》())使用简洁关键词")
+                    review_chunks = []
+                else:
+                    # 找到指定测试章节
+                    logger.info(f"找到 {len(designation_test_chunk)} 个指定测试章节")
+                    review_chunks = designation_test_chunk
+            else:
+                # 未指定测试章节,使用正常筛选流程
+                logger.info(f"未指定测试章节,使用正常筛选流程")
+                review_chunks = self._filter_review_units(clearned_chunks)
+
             total_units = len(review_chunks)
+            logger.info(f"最终审查单元数量: {total_units}")
 
             # 【修复 3】: 任务开始前,清理 Redis 中的旧计数,防止进度条计算错误
             try:
@@ -791,6 +826,46 @@ class AIReviewCoreFun:
             logger.error(f"筛除编制依据章节失败: {str(e)}")
             # 出错时返回原始列表
             return chunks
+    def _designation_test_chunks(self, chunks: List[Dict[str, Any]],test_designation_chunk_flag:str) -> List[Dict[str, Any]]:
+        """筛选设计测试章节
+        
+        Args:
+            chunks: 所有章节chunks列表
+
+        Returns:
+            List[Dict[str, Any]]: 筛选后的chunks列表
+
+        Note:
+            根据 chapter_classification 字段筛选,排除值为 "designation_test" 的章节
+
+        Raises:
+            Exception: 筛选失败
+        
+        """
+        try: 
+            designation_chunks = []
+            filtered_count = 0
+
+            logger.info(f"开始筛选设计测试章节")
+            for chunk in chunks:
+                content = chunk.get('content', '')
+                section_label = chunk.get('section_label', '未知章节')
+                logger.info(f"正在处理章节: {section_label}")
+                if test_designation_chunk_flag in content or test_designation_chunk_flag in section_label:
+                    logger.info(f"已命中指定测试章节: {chunk.get('section_label', '未知章节')}")
+                    designation_chunks.append(chunk)
+                else:
+                    filtered_count += 1
+                    logger.debug(f"跳过章节: {chunk.get('section_label', '未知章节')}")
+                if not designation_chunks:
+                    logger.info(f"未找到指定测试章节,请修改关键字尝试!")
+
+            return designation_chunks
+                     
+        except Exception as e:
+            logger.error(f"筛选设计测试章节失败: {str(e)}")
+            # 出错时返回原始列表
+            return chunks
 
     async def _review_single_unit(self, unit_content: Dict[str, Any], unit_index: int,
                                   total_units: int, state: AIReviewState) -> ReviewResult:

+ 7 - 0
views/construction_review/launch_review.py

@@ -88,6 +88,11 @@ class LaunchReviewRequest(BaseModel):
         description="工程方案类型: 01_pf_Found_Rotary_Drill(旋挖钻机、冲击钻机成孔桩), 02_pf_Dig_Manual_Pile(人工挖孔桩), 03_bd_Sub_Cyl_Pier(圆柱墩、系梁、盖梁), 04_bd_Sub_Rect_Turn(矩形墩采用翻模工艺、系梁、盖梁), 05_bd_High_Rect_Slide(矩形墩采用爬模工艺、系梁、盖梁), 06_bu_Pre_SS_Beam(简支梁预制、运输及架桥机安装), 07_bu_Erect_Truck_TBeam(汽车式起重机安装T梁), 08_bu_Cast_Col_Support(梁柱式支架), 09_bu_Cast_Full_Support(满堂式支架), 10_bu_Cast_Cant_Trolley(挂篮), 11_se_Elev_Lift_Proj(起重吊装工程), 12_se_Tower_Crane_Proj(起重吊装设备安装), 13_o_Height_Work_Op(高空作业)"
     )
 
+    test_designation_chunk_flag: Optional[str] = Field(  # 标注为可选字符串
+        None,  
+        description="测试定位标志符,用于指定特定审查片段(可选字段)"
+    )
+
     class Config:
         extra = "forbid"  # 禁止额外的字段
 
@@ -189,6 +194,7 @@ async def launch_review_sse(request_data: LaunchReviewRequest):
     review_config = request_data.review_config
     project_plan_type = request_data.project_plan_type
     tendency_review_role = request_data.tendency_review_role
+    test_designation_chunk_flag = request_data.test_designation_chunk_flag
 
     logger.info(f"收到审查启动SSE请求: callback_task_id={callback_task_id}, user_id={user_id}, tendency_review_role={tendency_review_role}")
 
@@ -274,6 +280,7 @@ async def launch_review_sse(request_data: LaunchReviewRequest):
                     'review_config': review_config,
                     'project_plan_type': project_plan_type,
                     'tendency_review_role': tendency_review_role,
+                    'test_designation_chunk_flag': test_designation_chunk_flag,
                     'launched_at': int(time.time()),
                     'callback_task_id': callback_task_id  # 确保使用当前正确的callback_task_id
                 })