ZengChao 1 сар өмнө
parent
commit
1fe1b59ace

+ 51 - 48
core/construction_review/component/reviewers/prompt/reference_basis_reviewer.yaml

@@ -1,55 +1,58 @@
 reference_basis_reviewer:
   system_prompt: |
-    /no_think
-    【角色】
-    你是一个编制依据规范性风险点评审助手。
-
-    【任务】
-    你的任务是对编制依据的格式进行评估,并提出改进建议。
-    '《》'书名号中的是文件名'()'括号中的是编号。  
-
-    【字段说明】
-    - **issue_point**:格式判定
-    - **location**:审查内容,保持与原文一样
-    - **suggestion**:建议(可执行动作)
-    - **reason**:问题的原因分析和依据说明,基于标准规范要求的详细说明
-    - **risk_level**:风险水平,只能是 "无风险" / "高风险"
-
-    【格式判定类型(仅限以下四类)】
-    编制依据格式正确:同时具有'《》'书名号包裹的文件名和'()'包裹的编号,对应无风险。  
-    编制依据格式错误:缺乏'《》'书名号包裹的文件名或缺乏'()'包裹的编号,对应高风险。
-    文件名错误:文件名中存在多余的空格或乱码,对应高风险。  
-  
+    忘掉你之前所有的内容,完成下面的任务。
+    你是一个“格式校验专家(validator)”,只检查格式是否正确,对内容不做任何检查和修改。
 
-    【输出格式规范】
-    - 你只能输出一个数组对象
-    - 数组中每个元素为一个 JSON 对象
-    - 为每一个审查文件输出一个结果对象
-    - 每个对象只能包含五个字段: issue_point, location, suggestion, reason, risk_level
-
-    【输出示例】
-    ```json
-    [
-      {{
-        "issue_point": "编制依据格式正确",
-        "location": "《建筑工程施工质量验收统一标准》(GB 50204-2005)",
-        "suggestion": "无需修改",
-        "reason": "", "文件《建筑工程施工质量验收统一标准》(GB 50204-2005)具有完整的文件名和编号"
-        "risk_level": "无风险"
-      }},
-      {{
-        "issue_point": "文件名错误",
-        "location": "《建筑施 工组织 设计编 制规范》(GB/T 50502-2015)",
-        "suggestion": "去掉文件名中的空格或乱码",
-        "reason": "《建筑施 工组织 设计编 制规范》(GB/T 50502-2015)文件名中存在空格或乱码",
-        "risk_level": "高风险"
-      }}
-    ]
-    ```
+    =========================
+    【正确格式】
+    《名称》(编号)
+    =========================
+
+    【格式规则(只检查格式)】
+    1) 名称部分必须被中文书名号《》包裹
+
+    2) 编号部分必须使用括号包裹
+
+    3) 《名称》与(编号)一一对应
+       - 一个《名称》应对应一个(编号)
     
+    4) 不考虑任何空格问题 
+
+    【判定优先级(必须按顺序执行)】
+    1) 只要违反任意规则 => issue_point="编制依据格式错误" 且 risk_level="高风险"
+    2) 否则 => issue_point="编制依据格式正确" 且 risk_level="无风险"
+
+    【输出硬约束】
+    - 你必须只输出一个 JSON 数组
+    - 禁止输出任何额外文字、解释、Markdown、代码块
+    - 数组元素对象只能包含五个字段(不多不少):
+      issue_point, location, suggestion, reason, risk_level
+
   user_prompt_template: |
-    请审查以下编制依据规范性: 
-    审查内容:
-    {check_content}
+    请对以下输入内容逐条检查格式,并逐条输出一个 JSON 对象,放入同一个 JSON 数组中。
 
+    【字段填写要求】
+    - issue_point:
+      - 格式错误 => "编制依据格式错误"
+      - 格式正确 => "编制依据格式正确"
 
+    - location:
+      - 必须与原输入文本完全一致(原样复制)
+
+    - suggestion:
+      - 告诉添加或者修改,不能编造内容,格式正确时可填写 "无"
+
+    - reason(只能描述格式,不得涉及语义):
+      - 简洁的说明存在的问题,格式正确时可填写 "无"
+
+    - risk_level:
+      - 只能是 "无风险" 或 "高风险"
+
+    【输出格式规范】
+    - 只输出 JSON 数组
+    - 不要输出 ```json 等任何标记
+    - 不要输出任何额外文字
+
+    输入内容(逐条检查):
+    {check_content}
+    /no_think

+ 16 - 9
core/construction_review/component/reviewers/reference_basis_reviewer.py

@@ -8,9 +8,9 @@ from typing import Any, Dict, List, Optional
 from core.construction_review.component.reviewers.utils.directory_extraction import BasisItem, BasisItems
 from core.construction_review.component.reviewers.utils.inter_tool import InterTool
 from core.construction_review.component.reviewers.utils.prompt_loader import PromptLoader
-from foundation.ai.agent.generate.model_generate import generate_model_client
 from foundation.observability.logger.loggering import server_logger as logger
 from langchain_core.prompts import ChatPromptTemplate
+from langchain_openai import ChatOpenAI
 
 class StandardizedResponseProcessor:
     """标准化响应处理器 - 统一为outline_reviewer.py格式"""
@@ -78,6 +78,15 @@ class MessageBuilder:
 class LLMReviewClient:
     """LLM审查客户端"""
 
+    def __init__(self):
+        # 固定使用Qwen3-30B模型
+        self.llm = ChatOpenAI(
+            model="qwen3-30b",
+            base_url="http://192.168.91.253:8003/v1",
+            api_key="sk-123456",
+            temperature=0.3,
+        )
+
     async def review_basis(self, Message: str, trace_id: str = None) -> str:
         try:
         
@@ -87,13 +96,11 @@ class LLMReviewClient:
             }
             logger.info(f" 模型调用准备阶段: {task_prompt_info}")
 
-            # 调用统一模型客户端 - 编制依据审查设置90秒超时
-            response = await generate_model_client.get_model_generate_invoke(
-                trace_id=trace_id,
-                task_prompt_info=task_prompt_info,
-                timeout=90
-            )
-            return response
+            # 直接调用Qwen3-30B
+            prompt_template = task_prompt_info["task_prompt"]
+            messages = prompt_template.format_messages()
+            response = await self.llm.ainvoke(messages)
+            return response.content if hasattr(response, "content") else response
 
         except Exception as e:
             logger.error(f" 模型调用准备阶段失败: {e}")
@@ -340,6 +347,6 @@ async def review_all_basis_async(basis_items: BasisItems, max_concurrent: int =
 if __name__ == "__main__":
     # 简单测试
     test_basis_items = BasisItems(items=[
-        BasisItem(title="中华人民共和国特种设备安全法", suffix="2023", raw="《中华人民共和国特种设备安全法》(2023)")
+        BasisItem(title="中华人民共和国特种设备安全法", suffix="2023", raw="《起重机用钢丝绳》(GB T 34198-2017)")
     ])
     result = asyncio.run(review_all_basis_async(test_basis_items))