Browse Source

-dev:更新了新的语义逻辑审查、词句语法审查的审查流程逻辑以及优化了部分提示词。

Diamond_ore 6 days ago
parent
commit
2240ff2c98

+ 1 - 1
.gitignore

@@ -3,7 +3,7 @@
 __pycache__/
 *.py[cod]
 *$py.class
-
+logs
 
 
 # C extensions

+ 18 - 13
core/construction_review/component/ai_review_engine.py

@@ -675,26 +675,31 @@ class AIReviewEngine(BaseReviewer):
             trace_id_idx: 追踪ID索引
             review_content: 审查内容
             review_references: 审查参考信息
-            stage_name: 阶段名称
+            review_location_label: 审查位置标签
             state: 状态字典
-            current_progress: 当前进度
+            stage_name: 阶段名称
 
         Returns:
-            Dict[str, Any]: 语法检查结果
+            ReviewResult: 语法检查结果
         """
+        from core.construction_review.component.reviewers.grammar_check import grammar_check_reviewer
+        
+        # 构造trace_id
         reviewer_type = Stage.BASIC.value['reviewer_type']
         prompt_name = Stage.BASIC.value['grammar']
-        trace_id = prompt_name+trace_id_idx
-        
-        # 使用文本切割工具将长文本切分为150-250字的片段
-        text_segments = split_text(review_content, min_length=150, target_length=250)
+        trace_id = prompt_name + trace_id_idx
         
-        # TODO: 这里可以对每个片段进行分批审查
-        # 目前先使用原始的完整内容进行审查
-        # 后续可以遍历 text_segments 进行分段审查并汇总结果
+        # 调用语法检查审查模块
+        result = await grammar_check_reviewer.check_grammar(
+            trace_id=trace_id,
+            review_content=review_content,
+            review_references=review_references,
+            review_location_label=review_location_label,
+            state=state,
+            stage_name=stage_name
+        )
         
-        return await self.review("sensitive_word_check", trace_id, reviewer_type, prompt_name, review_content, review_references,
-                               None, review_location_label, state, stage_name)
+        return result
 
     
 
@@ -735,7 +740,7 @@ class AIReviewEngine(BaseReviewer):
         
         
         ### TODO: 使用review模块,并传入指定模型名称lq-Qwen3-30B,修改底层review接口模块,层层传参直至底层。修改底层model_generate模块,支持初始化多种模型,支持根据传入模型名称参数调用指定模型。
-        
+        # 在review内复刻使用上面的语义逻辑审查模块
         pass
         # reviewer_type = Stage.BASIC.value['reviewer_type']
         # prompt_name = Stage.BASIC.value['semantic']

+ 191 - 0
core/construction_review/component/reviewers/grammar_check.py

@@ -0,0 +1,191 @@
+"""
+语法检查模块
+使用自定义OpenAI兼容API进行语法检查
+"""
+
+import time
+import asyncio
+from typing import Dict, Any
+from openai import AsyncOpenAI
+from core.construction_review.component.reviewers.base_reviewer import ReviewResult
+from core.construction_review.component.reviewers.utils.prompt_loader import prompt_loader
+from foundation.observability.logger.loggering import server_logger as logger
+
+
+# 模型配置信息
+# 暂时写死,未来从配置文件读取
+GRAMMAR_CHECK_MODEL_CONFIG = {
+    "base_url": "http://192.168.91.253:8003/v1",
+    "api_key": "sk-123456",
+    "model": "qwen3-30b",
+    "temperature": 0.7,
+    "max_tokens": 2000
+}
+
+
+class GrammarCheckReviewer:
+    """语法检查审查器"""
+    
+    def __init__(self):
+        """初始化语法检查审查器"""
+        self.client = AsyncOpenAI(
+            base_url=GRAMMAR_CHECK_MODEL_CONFIG["base_url"],
+            api_key=GRAMMAR_CHECK_MODEL_CONFIG["api_key"]
+        )
+        self.model = GRAMMAR_CHECK_MODEL_CONFIG["model"]
+        self.temperature = GRAMMAR_CHECK_MODEL_CONFIG["temperature"]
+        self.max_tokens = GRAMMAR_CHECK_MODEL_CONFIG["max_tokens"]
+        
+    async def check_grammar(
+        self, 
+        trace_id: str,
+        review_content: str, 
+        review_references: str = "",
+        review_location_label: str = "",
+        state: Dict[str, Any] = None,
+        stage_name: str = None
+    ) -> ReviewResult:
+        """
+        执行语法检查
+        
+        Args:
+            trace_id: 追踪ID
+            review_content: 待审查内容
+            review_references: 审查参考信息
+            review_location_label: 审查位置标签
+            state: 状态字典(包含progress_manager和callback_task_id)
+            stage_name: 阶段名称
+            
+        Returns:
+            ReviewResult: 审查结果对象
+        """
+        start_time = time.time()
+        
+        try:
+            logger.info(f"开始语法检查,trace_id: {trace_id}, 内容长度: {len(review_content)}")
+            
+            # 构造提示词参数
+            prompt_kwargs = {}
+            prompt_kwargs["review_content"] = review_content
+            prompt_kwargs["review_references"] = review_references or ""
+            
+            # 获取提示词模板
+            prompt_template = prompt_loader.get_prompt_template(
+                "basic", 
+                "grammar_check", 
+                **prompt_kwargs
+            )
+            
+            # 格式化提示词消息
+            messages = prompt_template.format_messages()
+            
+            # 转换为OpenAI API格式
+            api_messages = []
+            for msg in messages:
+                if hasattr(msg, 'type'):
+                    role = msg.type if msg.type in ['system', 'user', 'assistant'] else 'user'
+                else:
+                    role = 'user'
+                api_messages.append({
+                    "role": role,
+                    "content": msg.content
+                })
+            
+            logger.info(f"调用语法检查模型: {self.model}")
+            
+            # 调用OpenAI兼容API
+            response = await self.client.chat.completions.create(
+                model=self.model,
+                messages=api_messages,
+                temperature=self.temperature,
+                max_tokens=self.max_tokens
+            )
+            
+            # 提取模型响应
+            model_response = response.choices[0].message.content
+            
+            logger.info(f"语法检查模型响应成功,响应长度: {len(model_response)}")
+            
+            # 计算执行时间
+            execution_time = time.time() - start_time
+            
+            # 构造审查结果
+            result = ReviewResult(
+                success=True,
+                details={
+                    "name": "grammar_check",
+                    "response": model_response
+                },
+                error_message=None,
+                execution_time=execution_time
+            )
+            
+            # 推送审查完成信息
+            if state and state.get("progress_manager"):
+                review_result_data = {
+                    'name': 'grammar_check',
+                    'success': result.success,
+                    'details': result.details,
+                    'error_message': result.error_message,
+                    'execution_time': result.execution_time,
+                    'timestamp': time.time()
+                }
+                
+                asyncio.create_task(
+                    state["progress_manager"].update_stage_progress(
+                        callback_task_id=state["callback_task_id"],
+                        stage_name=stage_name,
+                        current=None,
+                        status="processing",
+                        message=f"grammar_check 审查完成,耗时: {result.execution_time:.2f}s",
+                        issues=[review_result_data],
+                        event_type="processing"
+                    )
+                )
+                
+            logger.info(f"grammar_check 审查完成,耗时: {result.execution_time:.2f}s")
+            
+            return result
+            
+        except Exception as e:
+            execution_time = time.time() - start_time
+            error_msg = f"语法检查失败: {str(e)}"
+            logger.error(error_msg, exc_info=True)
+            
+            # 返回失败结果
+            result = ReviewResult(
+                success=False,
+                details={"name": "grammar_check"},
+                error_message=error_msg,
+                execution_time=execution_time
+            )
+            
+            # 推送失败信息
+            if state and state.get("progress_manager"):
+                review_result_data = {
+                    'name': 'grammar_check',
+                    'success': False,
+                    'details': result.details,
+                    'error_message': error_msg,
+                    'execution_time': execution_time,
+                    'timestamp': time.time()
+                }
+                
+                asyncio.create_task(
+                    state["progress_manager"].update_stage_progress(
+                        callback_task_id=state["callback_task_id"],
+                        stage_name=stage_name,
+                        current=None,
+                        status="processing",
+                        message=f"grammar_check 审查失败: {error_msg}",
+                        issues=[review_result_data],
+                        event_type="processing"
+                    )
+                )
+            
+            return result
+
+
+# 全局单例实例
+grammar_check_reviewer = GrammarCheckReviewer()
+

+ 2 - 1
core/construction_review/component/reviewers/prompt/basic_reviewers.yaml

@@ -99,12 +99,13 @@ semantic_logic_check:
        示例:"当温度低于5℃时,可正常施工"(违背常识)(仅审查违背常识,不要过多的去干预实际的施工参数、施工性能)
        示例:"力求技术先进......保守施工,不可使用新技术"
 
+    4. **口语化审查** - 口语化表达不符合规范,施工方案应是严肃、规范的,不得出现口语化表达
     
     # 工作流程 (Workflow)
     
     步骤1:通读全文,理解整体语境和专业背景
     步骤2:识别关键陈述、条件判断、因果关系
-    步骤3:检查是否存在上述类明确的逻辑问题
+    步骤3:检查是否存在上述类明确的逻辑问题
     步骤4:对于疑似问题,进行二次验证:
            - 是否确实存在逻辑冲突?
            - 是否可能是上下文理解不足导致的误判?

+ 1 - 0
core/construction_review/component/reviewers/semantic_logic.py

@@ -13,6 +13,7 @@ from foundation.observability.logger.loggering import server_logger as logger
 
 
 # 模型配置信息
+# 暂时写死,未来从配置文件读取
 SEMANTIC_LOGIC_MODEL_CONFIG = {
     "base_url": "http://192.168.91.253:8003/v1",
     "api_key": "sk-123456",