|
|
@@ -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,
|