瀏覽代碼

v0.0.4-功能优化
- 适配outline_reviewer.py响应字段
- 优化文档切分逻辑

WangXuMing 3 月之前
父節點
當前提交
d739970bc5

+ 96 - 0
core/construction_review/component/reviewers/prep_basis_reviewer.py

@@ -29,6 +29,7 @@ try:
     from foundation.ai.models.model_handler import model_handler as mh
     from foundation.ai.agent.generate.model_generate import generate_model_client
     from core.construction_review.component.reviewers.utils.prompt_loader import prompt_loader
+    from core.construction_review.component.reviewers.utils.inter_tool import InterTool
     from foundation.observability.logger.loggering import server_logger as logger
 except ImportError as e:
     logger.warning(f"Warning: 无法导入依赖: {e}")
@@ -37,6 +38,7 @@ except ImportError as e:
     generate_model_client = None
     prompt_loader = None
     logger = None
+    InterTool = None
 
 
 class TextProcessor:
@@ -108,6 +110,54 @@ class ResultFormatter:
         return out
 
 
+class StandardizedResponseProcessor:
+    """标准化响应处理器 - 统一为outline_reviewer.py格式"""
+
+    def __init__(self):
+        if InterTool:
+            self.inter_tool = InterTool()
+        else:
+            self.inter_tool = None
+
+    def process_llm_response(self, response_text: str, check_name: str = "编制依据检查") -> List[Dict[str, Any]]:
+        """
+        处理LLM响应,返回标准格式
+
+        Args:
+            response_text: LLM原始响应文本
+            check_name: 检查项名称
+
+        Returns:
+            List[Dict]: 标准格式的审查结果列表
+        """
+        if not self.inter_tool:
+            logger.warning("InterTool未初始化,返回空结果")
+            return []
+
+        try:
+            # 使用inter_tool提取JSON数据
+            json_data = self.inter_tool._extract_json_data(response_text)
+            parsed_result = []
+
+            if json_data and isinstance(json_data, list):
+                for item in json_data:
+                    parsed_result.append(self.inter_tool._create_issue_item(item, check_name))
+            elif json_data and isinstance(json_data, dict):
+                parsed_result.append(self.inter_tool._create_issue_item(json_data, check_name))
+
+            return parsed_result
+
+        except Exception as e:
+            logger.error(f"处理LLM响应失败: {str(e)}")
+            # 返回一个错误条目
+            return [{
+                "check_item": check_name,
+                "check_result": {"error": str(e)},
+                "exist_issue": True,
+                "risk_info": {"risk_level": "medium"}
+            }]
+
+
 class MessageBuilder:
     """消息构建工具类"""
 
@@ -376,6 +426,7 @@ class BasisReviewService:
         self.llm_client = LLMReviewClient()
         self.text_processor = TextProcessor()
         self.result_formatter = ResultFormatter()
+        self.response_processor = StandardizedResponseProcessor()  # 新增标准化处理器
         # 确保使用最新的prompt_loader实例
         from core.construction_review.component.reviewers.utils.prompt_loader import PromptLoader
         fresh_prompt_loader = PromptLoader()
@@ -448,6 +499,51 @@ class BasisReviewService:
                 return [{"name": name, "is_standard": False, "status": "", "meg": f"批次处理失败: {str(e)}"}
                         for name in basis_items]
 
+    async def review_batch_standardized(self,
+        basis_items: List[str],
+        collection_name: str = "already_basis",
+        filters: Optional[Dict[str, Any]] = None,
+        min_score: float = 0.3,
+        top_k_each: int = 3,
+    ) -> List[Dict[str, Any]]:
+        """
+        异步批次审查(返回outline_reviewer.py标准格式)
+
+        Returns:
+            List[Dict]: 标准格式审查结果,包含check_item, check_result, exist_issue, risk_info
+        """
+        basis_items = [x for x in (basis_items or []) if isinstance(x, str) and x.strip()]
+        if not basis_items:
+            return []
+
+        async with self._semaphore:
+            try:
+                # 构建提示词模板和用户内容(不使用搜索结果,简化处理)
+                prompt_template = self.message_builder.get_prompt_template()
+                combined_content = "\n".join([f"{i+1}. {item}" for i, item in enumerate(basis_items)])
+
+                user_content = f"请审查以下编制依据:\n{combined_content}"
+                trace_id = f"prep_basis_standardized_{int(time.time())}"
+                llm_out = await self.llm_client.review_basis(prompt_template, user_content, trace_id)
+
+                # 使用标准化处理器处理响应
+                standardized_result = self.response_processor.process_llm_response(llm_out, "编制依据规范性检查")
+
+                # 统计问题数量
+                issue_count = sum(1 for item in standardized_result if item.get('exist_issue', False))
+                logger.info(f"编制依据批次审查完成:总计 {len(basis_items)} 项,发现问题 {issue_count} 项")
+
+                return standardized_result
+
+            except Exception as e:
+                logger.error(f" 标准化批次处理失败: {e}")
+                return [{
+                    "check_item": "编制依据规范性检查",
+                    "check_result": {"error": str(e), "basis_items": basis_items},
+                    "exist_issue": True,
+                    "risk_info": {"risk_level": "high"}
+                }]
+
     async def _async_search_basis(
         self,
         basis: str,

+ 58 - 60
core/construction_review/component/reviewers/prompt/prep_basis_reviewers.yaml

@@ -1,79 +1,77 @@
-# 编制依据审查提示词
+# ============================================================
+# 编制依据审查提示词模板
+# ============================================================
 
-# 编制依据状态检查
+# 编制依据规范性审查器
 basis_status_check:
   system_prompt: |
-    你是一个专业的编制依据审查AI助手
+    你是一个专业的编制依据规范性审查专家。你的任务是对照国家规范要求,对施工组织设计中的编制依据进行全面、细致的规范性审查
 
-    你的任务是分析施工组织设计中的编制依据,识别标准规范引用,并评估其完整性和有效性。
+    审查原则:
+    1. **完整性审查**:逐一核对标准规范引用的完整性,确保重要的国家标准、行业标准都已包含
+    2. **规范性检查**:检查标准引用格式是否符合规范要求,包含完整的标准号和标准名称
+    3. **有效性验证**:确保引用的标准在有效期内,未使用已废止的标准
 
-    输入格式:
-    - raw_text:编制依据的原始文本内容
-    - candidates:可能的标准规范候选列表,最多返回3个,使用简称"SM:XXX"
+  user_prompt_template: |
+    【任务说明】
+    请对以下施工组织设计的编制依据进行规范性审查,确保标准引用的完整性和有效性。
 
-    处理流程:
-    1. 解析raw_text中的标准规范引用
-    2. 与candidates进行匹配验证
-    3. 评估每个引用的状态和完整性
+    【编制依据内容】
+    {review_content}
 
-    输出要求:
-    1) is_standard:判断raw_text中的引用是否为有效标准规范
-       - 是有效的国家标准、行业标准、地方标准
-       - 格式规范,包含标准号和标准名称
-       - 在有效期内,未废止
-    2) status:评估candidates中的标准与raw_text的匹配程度,完全匹配、部分匹配、不匹配
-    3) msg:评估意见和建议
-       - 如果存在问题,说明具体问题
-       - 如果需要补充,列出缺失的重要标准
-       - 如果格式不规范,给出修改建议
+    【审查要求】
 
-    注意事项:
-    - 输出必须是有效的JSON格式,包含items数组
-    - 输出格式严格按照以下模板,每个item包含三个字段:
-      {{"is_standard": true/false, "status": "", "meg": ""}}
-    - 状态码含义:true表示符合要求,false表示需要修改,null表示不确定
+    ## 审查标准
+    - **完整性检查**:逐一核对是否包含必要的国家标准、行业标准、地方标准等
+    - **格式规范性**:检查标准引用格式是否正确,应包含标准编号和标准名称
+    - **有效性验证**:确认引用标准是否为现行有效版本
 
-  user_prompt_template: |
-    请审查以下施工组织设计的编制依据内容:
+    ## 判定标准
+    - **✔ 符合要求**:标准引用格式规范、内容完整、在有效期内
+    - **⚠ 部分符合**:标准引用基本符合要求,但存在格式问题或轻微缺失
+    - **✘ 不符合要求**:标准引用存在严重错误、缺失重要标准或引用已废止标准
 
-    待审查内容:
-    {review_content}
+    【输出格式规范】
 
-    输出要求:请按照指定JSON格式输出审查结果,每个item包含三个字段:
+    ## 格式要求
+    如果未发现明显的规范性问题,请输出:无明显问题
+    如果发现问题,请按以下格式输出:
+    使用 JSON 数组格式输出审查结果,每个元素对应一个标准引用或问题项。
+    location字段直接输出原字段内容,不得猜测
+
+    ## 字段说明
+    - **issue_point**:问题标题描述,包含具体问题点和判定结果,格式为"符号 + 简要结论"
+      - ✔ 表示符合要求
+      - ⚠ 表示部分符合或需要注意
+      - ✘ 表示不符合要求
+    - **location**:当前问题对应的原始标准引用内容及位置,以及其语境上下文
+    - **suggestion**:具体的修改建议内容,包括在编制依据中找到的具体位置、存在的问题描述、整改建议
+    - **reason**:问题的原因分析和依据说明,基于标准规范要求的详细说明
+    - **risk_level**:风险等级分类(高风险[不符合要求]/中风险[部分符合]/无风险[符合要求])
+
+    ## 注意事项
+    - JSON 格式必须严格规范,可被标准 JSON 解析器解析
+    - location字段应提供足够详细的信息,便于定位具体的标准引用
+    - 对于缺失的重要标准,应在建议中明确指出需要补充的具体标准名称和编号
+    
+    ## 输出示例
     ```json
     [
       {{
-        "is_standard": true,
-        "status": "完整",
-        "meg": "编制依据齐全,标准规范引用正确,符合要求"
+        "issue_point": "GB 50204-2015 引用规范 ✔ 符合要求",
+        "location": "《建筑工程施工质量验收统一标准》(GB 50204-2015)",
+        "suggestion": "标准引用格式规范,包含完整的标准编号和标准名称,符合要求",
+        "reason": "依据国家标准编写规范,标准引用应包含标准编号和标准名称,该引用格式正确",
+        "risk_level": "无风险"
+      }},
+      {{
+        "issue_point": "缺少安全技术规范 ✘ 不符合要求",
+        "location": "编制依据中缺少相关安全技术规范标准",
+        "suggestion": "建议补充《建筑施工安全检查标准》(JGJ 59-2011)等安全技术规范",
+        "reason": "依据施工组织设计编制规范,应包含相关的安全技术标准",
+        "risk_level": "高风险"
       }}
     ]
     ```
 
-# 批量编制依据解析
-batch_basis_parsing:
-  system_prompt: |
-    你是一个专业的标准规范识别AI助手,负责从施工组织设计文本中提取和解析编制依据。
 
-    识别范围:
-    - 国家标准(GB)、行业标准(JGJ)、地方标准(DB)、企业标准(QB)
-    - 技术规范、规程、标准图集等
-
-    解析要求:
-    - 提取完整的标准编号和标准名称
-    - 识别标准的发布年份和版本号
-    - 判断标准的有效性(是否现行有效)
-    - 识别重复或过时的标准引用
-
-  user_prompt_template: |
-    请从以下施工组织设计内容中提取编制依据:
-
-    待解析内容:
-    {review_content}
-
-    输出要求:请按照标准格式列出所有识别到的编制依据:
-    ```
-    1. 标准名称:标准编号及版本号,如GB/T 26470-2011
-    2. 标准名称:标准编号及版本号,如GB/T 3811-2008
-    ...
-    ```