|
@@ -769,7 +769,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
chapter_classification = 'chunk_id'
|
|
chapter_classification = 'chunk_id'
|
|
|
content = 'chunk_id'
|
|
content = 'chunk_id'
|
|
|
|
|
|
|
|
- logger.debug(f"开始执行 {name} 审查,trace_id: {trace_id_idx}, chunk_id: {chunk_id}, chapter_classification: {chapter_classification}")
|
|
|
|
|
|
|
+ logger.info(f"开始执行 {name} 审查,trace_id: {trace_id_idx}, chunk_id: {chunk_id}, chapter_classification: {chapter_classification}")
|
|
|
|
|
|
|
|
# 检查必要字段
|
|
# 检查必要字段
|
|
|
if not chapter_classification:
|
|
if not chapter_classification:
|
|
@@ -787,22 +787,22 @@ class AIReviewEngine(BaseReviewer):
|
|
|
prompt_config_path = base_dir / 'config' / 'prompt.yaml'
|
|
prompt_config_path = base_dir / 'config' / 'prompt.yaml'
|
|
|
api_config_path = base_dir / 'config' / 'llm_api.yaml'
|
|
api_config_path = base_dir / 'config' / 'llm_api.yaml'
|
|
|
|
|
|
|
|
- logger.debug("=" * 60)
|
|
|
|
|
- logger.debug("文件要点审查模块")
|
|
|
|
|
- logger.debug("=" * 60)
|
|
|
|
|
|
|
+ logger.info("=" * 60)
|
|
|
|
|
+ logger.info("文件要点审查模块")
|
|
|
|
|
+ logger.info("=" * 60)
|
|
|
|
|
|
|
|
# 1. 加载数据
|
|
# 1. 加载数据
|
|
|
- logger.debug("\n[1/5] 加载规范文件...")
|
|
|
|
|
|
|
+ logger.info("\n[1/5] 加载规范文件...")
|
|
|
data_loader = CSVDataLoader()
|
|
data_loader = CSVDataLoader()
|
|
|
specification = data_loader.load_specification(str(csv_path))
|
|
specification = data_loader.load_specification(str(csv_path))
|
|
|
- logger.debug(f" 加载完成,共 {len(specification)} 个标签类别")
|
|
|
|
|
|
|
+ logger.info(f" 加载完成,共 {len(specification)} 个标签类别")
|
|
|
|
|
|
|
|
- logger.debug("\n[2/5] 加载文档数据...")
|
|
|
|
|
|
|
+ logger.info("\n[2/5] 加载文档数据...")
|
|
|
documents = review_content
|
|
documents = review_content
|
|
|
- logger.debug(f" 加载完成,共 {len(documents)} 个文档块")
|
|
|
|
|
|
|
+ logger.info(f" 加载完成,共 {len(documents)} 个文档块")
|
|
|
|
|
|
|
|
# 2. 初始化组件
|
|
# 2. 初始化组件
|
|
|
- logger.debug("\n[3/5] 初始化组件...")
|
|
|
|
|
|
|
+ logger.info("\n[3/5] 初始化组件...")
|
|
|
prompt_builder = PromptBuilder(str(prompt_config_path))
|
|
prompt_builder = PromptBuilder(str(prompt_config_path))
|
|
|
llm_client = LLMClient(str(api_config_path))
|
|
llm_client = LLMClient(str(api_config_path))
|
|
|
result_processor = ResultProcessor()
|
|
result_processor = ResultProcessor()
|
|
@@ -817,35 +817,35 @@ class AIReviewEngine(BaseReviewer):
|
|
|
result_processor=result_processor,
|
|
result_processor=result_processor,
|
|
|
max_concurrent=concurrent_workers
|
|
max_concurrent=concurrent_workers
|
|
|
)
|
|
)
|
|
|
- logger.debug(" 组件初始化完成")
|
|
|
|
|
|
|
+ logger.info(" 组件初始化完成")
|
|
|
|
|
|
|
|
start_time = time.time()
|
|
start_time = time.time()
|
|
|
# 3. 执行审查
|
|
# 3. 执行审查
|
|
|
- logger.debug("\n[4/5] 开始执行审查...")
|
|
|
|
|
- logger.debug(f" 使用模型: {llm_client.model_type}")
|
|
|
|
|
- logger.debug(f" 最大并发数: {concurrent_workers}")
|
|
|
|
|
|
|
+ logger.info("\n[4/5] 开始执行审查...")
|
|
|
|
|
+ logger.info(f" 使用模型: {llm_client.model_type}")
|
|
|
|
|
+ logger.info(f" 最大并发数: {concurrent_workers}")
|
|
|
|
|
|
|
|
review_results = await review_pipeline.review(documents, specification)
|
|
review_results = await review_pipeline.review(documents, specification)
|
|
|
|
|
|
|
|
# 统计结果
|
|
# 统计结果
|
|
|
success_count = sum(1 for r in review_results if isinstance(r.get('review_result', {}), dict) and 'error' not in r.get('review_result', {}))
|
|
success_count = sum(1 for r in review_results if isinstance(r.get('review_result', {}), dict) and 'error' not in r.get('review_result', {}))
|
|
|
error_count = len(review_results) - success_count
|
|
error_count = len(review_results) - success_count
|
|
|
- logger.debug(f"\n 审查完成: 成功 {success_count} 个, 失败 {error_count} 个")
|
|
|
|
|
|
|
+ logger.info(f"\n 审查完成: 成功 {success_count} 个, 失败 {error_count} 个")
|
|
|
|
|
|
|
|
|
|
|
|
|
# 6. 使用结果解析处理组件,生成规范覆盖汇总表
|
|
# 6. 使用结果解析处理组件,生成规范覆盖汇总表
|
|
|
- logger.debug("\n[5/5] 生成规范要点覆盖汇总表...")
|
|
|
|
|
|
|
+ logger.info("\n[5/5] 生成规范要点覆盖汇总表...")
|
|
|
analyzer = ResultAnalyzer(str(csv_path))
|
|
analyzer = ResultAnalyzer(str(csv_path))
|
|
|
processed_results = analyzer.process_results(review_results)
|
|
processed_results = analyzer.process_results(review_results)
|
|
|
spec_summary_csv_path = base_dir / 'output' / 'spec_review_summary.csv'
|
|
spec_summary_csv_path = base_dir / 'output' / 'spec_review_summary.csv'
|
|
|
summary_rows = analyzer.build_spec_summary(processed_results)
|
|
summary_rows = analyzer.build_spec_summary(processed_results)
|
|
|
- logger.debug(f" 规范覆盖汇总结果已保存至: {spec_summary_csv_path}")
|
|
|
|
|
|
|
+ logger.info(f" 规范覆盖汇总结果已保存至: {spec_summary_csv_path}")
|
|
|
|
|
|
|
|
# 生成缺失要点 JSON 列表,便于前端消费
|
|
# 生成缺失要点 JSON 列表,便于前端消费
|
|
|
missing_issue_json_path = Path(r'temp\document_temp') / 'spec_review_missing_issues.json'
|
|
missing_issue_json_path = Path(r'temp\document_temp') / 'spec_review_missing_issues.json'
|
|
|
missing_issue_list = analyzer.build_missing_issue_list(summary_rows)
|
|
missing_issue_list = analyzer.build_missing_issue_list(summary_rows)
|
|
|
write_json(missing_issue_list, str(missing_issue_json_path))
|
|
write_json(missing_issue_list, str(missing_issue_json_path))
|
|
|
- logger.debug(f" 缺失要点 JSON 已保存至: {missing_issue_json_path}")
|
|
|
|
|
|
|
+ logger.info(f" 缺失要点 JSON 已保存至: {missing_issue_json_path}")
|
|
|
cost_time = time.time() - start_time
|
|
cost_time = time.time() - start_time
|
|
|
|
|
|
|
|
# 构建details字段,包含审查结果
|
|
# 构建details字段,包含审查结果
|
|
@@ -858,6 +858,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
# 'checked_items': len(review_result),
|
|
# 'checked_items': len(review_result),
|
|
|
# 'response': review_result[0] if review_result else {},
|
|
# 'response': review_result[0] if review_result else {},
|
|
|
# }
|
|
# }
|
|
|
|
|
+
|
|
|
result_list = []
|
|
result_list = []
|
|
|
for index, missing_issue in enumerate(missing_issue_list):
|
|
for index, missing_issue in enumerate(missing_issue_list):
|
|
|
details = {
|
|
details = {
|
|
@@ -878,7 +879,8 @@ class AIReviewEngine(BaseReviewer):
|
|
|
error_message=None,
|
|
error_message=None,
|
|
|
execution_time=cost_time
|
|
execution_time=cost_time
|
|
|
)
|
|
)
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ # 将ReviewResult对象转换为字典格式
|
|
|
result_dict = {"details":result.details,"success":result.success,"error_message":result.error_message,"execution_time":result.execution_time}
|
|
result_dict = {"details":result.details,"success":result.success,"error_message":result.error_message,"execution_time":result.execution_time}
|
|
|
result_list.append(result_dict)
|
|
result_list.append(result_dict)
|
|
|
with open('temp/completeness_check_result_1.json','w',encoding='utf-8') as f:
|
|
with open('temp/completeness_check_result_1.json','w',encoding='utf-8') as f:
|
|
@@ -904,7 +906,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
state_dict = json.loads(state)
|
|
state_dict = json.loads(state)
|
|
|
except (json.JSONDecodeError, AttributeError):
|
|
except (json.JSONDecodeError, AttributeError):
|
|
|
pass
|
|
pass
|
|
|
-
|
|
|
|
|
|
|
+ # 更新进度
|
|
|
if state_dict and state_dict.get("progress_manager"):
|
|
if state_dict and state_dict.get("progress_manager"):
|
|
|
asyncio.create_task(
|
|
asyncio.create_task(
|
|
|
state_dict["progress_manager"].update_stage_progress(
|
|
state_dict["progress_manager"].update_stage_progress(
|
|
@@ -917,7 +919,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
event_type="processing"
|
|
event_type="processing"
|
|
|
)
|
|
)
|
|
|
)
|
|
)
|
|
|
- logger.debug(f"{name} 审查完成 (chunk_id: {chunk_id}_{index}), 耗时: {result.execution_time:.2f}s")
|
|
|
|
|
|
|
+ logger.info(f"{name} 审查完成 (chunk_id: {chunk_id}_{index}), 耗时: {result.execution_time:.2f}s")
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
'completeness_review_result': result_list
|
|
'completeness_review_result': result_list
|
|
@@ -1051,7 +1053,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
if entity_query:
|
|
if entity_query:
|
|
|
logger.info(f"[非参数审查] 使用实体查询条文: {entity_query[:100]}...")
|
|
logger.info(f"[非参数审查] 使用实体查询条文: {entity_query[:100]}...")
|
|
|
combined_content = f"【实体查询条文】\n{entity_query}\n\n【待审查内容】\n{review_content}"
|
|
combined_content = f"【实体查询条文】\n{entity_query}\n\n【待审查内容】\n{review_content}"
|
|
|
- logger.debug(f"[非参数审查] 组合后内容长度: {len(combined_content)} (原内容: {len(review_content)}, 查询条文: {len(entity_query)})")
|
|
|
|
|
|
|
+ logger.info(f"[非参数审查] 组合后内容长度: {len(combined_content)} (原内容: {len(review_content)}, 查询条文: {len(entity_query)})")
|
|
|
else:
|
|
else:
|
|
|
combined_content = review_content
|
|
combined_content = review_content
|
|
|
|
|
|
|
@@ -1085,7 +1087,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
if entity_query:
|
|
if entity_query:
|
|
|
logger.info(f"[参数审查] 使用实体查询条文: {entity_query[:100]}...")
|
|
logger.info(f"[参数审查] 使用实体查询条文: {entity_query[:100]}...")
|
|
|
combined_content = f"【实体查询条文】\n{entity_query}\n\n【待审查内容】\n{review_content}"
|
|
combined_content = f"【实体查询条文】\n{entity_query}\n\n【待审查内容】\n{review_content}"
|
|
|
- logger.debug(f"[参数审查] 组合后内容长度: {len(combined_content)} (原内容: {len(review_content)}, 查询条文: {len(entity_query)})")
|
|
|
|
|
|
|
+ logger.info(f"[参数审查] 组合后内容长度: {len(combined_content)} (原内容: {len(review_content)}, 查询条文: {len(entity_query)})")
|
|
|
else:
|
|
else:
|
|
|
combined_content = review_content
|
|
combined_content = review_content
|
|
|
|
|
|