print_review_results.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """
  2. 输出实际审查结果 — 将 RAG 管线的真实检索内容写入可读文件
  3. """
  4. import sys, os, json
  5. project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  6. if project_root not in sys.path:
  7. sys.path.insert(0, project_root)
  8. from utils_test.RAG_Pipeline_Test.test_data import TEST_SAMPLES
  9. from utils_test.RAG_Pipeline_Test.rag_pipeline_runner import RAGPipelineRunner
  10. def main():
  11. runner = RAGPipelineRunner()
  12. output_lines = []
  13. # 选取 3 个代表性样本深入分析
  14. target_ids = ["safety_Monitoring", "technology_Operations", "safety_Emergency"]
  15. samples = [s for s in TEST_SAMPLES if s["chunk_id"] in target_ids]
  16. for sample in samples:
  17. chunk_id = sample["chunk_id"]
  18. content = sample["content"]
  19. output_lines.append("=" * 80)
  20. output_lines.append(f"测试样本: {chunk_id}")
  21. output_lines.append(f"章节: {sample['section_label']}")
  22. output_lines.append("=" * 80)
  23. # 截取原文前 500 字
  24. output_lines.append(f"\n【原文摘录 (前500字)】")
  25. output_lines.append(content[:500])
  26. output_lines.append("...")
  27. # 执行管线
  28. result = runner.run_single(content, chunk_id=chunk_id)
  29. # 审查要点
  30. output_lines.append(f"\n{'─' * 60}")
  31. output_lines.append(f"【审查要点提取结果】共 {result.review_point_count} 个要点, 耗时 {result.extract_time:.1f}s")
  32. output_lines.append(f"{'─' * 60}")
  33. if not result.review_points:
  34. output_lines.append(" (提取失败)")
  35. continue
  36. for i, rp in enumerate(result.review_points):
  37. label = rp.get('label', rp.get('entity', ''))
  38. queries = rp.get('search_queries', rp.get('search_keywords', []))
  39. original = rp.get('original_text', rp.get('background', ''))
  40. parameter = rp.get('parameter', '')
  41. output_lines.append(f"\n 要点 [{i+1}] {label}")
  42. output_lines.append(f" ├─ 检索语句:")
  43. for q in queries:
  44. output_lines.append(f" │ • {q}")
  45. output_lines.append(f" ├─ 原文摘录: {original}")
  46. output_lines.append(f" └─ 技术参数: {parameter}")
  47. # 检索结果
  48. output_lines.append(f"\n{'─' * 60}")
  49. output_lines.append(f"【RAG 检索结果】{result.non_empty_pairs}/{result.review_point_count} 个查询对有结果, 耗时 {result.retrieval_time:.1f}s")
  50. output_lines.append(f"{'─' * 60}")
  51. if not result.retrieval_results:
  52. output_lines.append(" (检索失败)")
  53. continue
  54. for i, (rp, results) in enumerate(zip(result.review_points, result.retrieval_results)):
  55. label = rp.get('label', rp.get('entity', ''))
  56. output_lines.append(f"\n ── 要点 [{i+1}] {label} 的检索结果 ──")
  57. if not results:
  58. output_lines.append(" (无结果)")
  59. continue
  60. for j, r in enumerate(results[:3]): # 只显示 top-3
  61. rerank = r.get('rerank_score', 0)
  62. bfp = r.get('bfp_rerank_score', 0)
  63. text = r.get('text_content', '')[:200]
  64. meta = r.get('metadata', {})
  65. file_name = meta.get('file_name', '')
  66. parent_id = meta.get('parent_id', '')
  67. output_lines.append(f"\n [{j+1}] rerank={rerank:.4f}, bfp_rerank={bfp:.4f}")
  68. if file_name:
  69. output_lines.append(f" 来源: {file_name}")
  70. output_lines.append(f" 内容: {text}...")
  71. output_lines.append("\n\n")
  72. # 写入文件
  73. output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "reports", "review_results_detail.txt")
  74. os.makedirs(os.path.dirname(output_path), exist_ok=True)
  75. with open(output_path, "w", encoding="utf-8") as f:
  76. f.write("\n".join(output_lines))
  77. print(f"审查结果已输出: {output_path}")
  78. if __name__ == "__main__":
  79. main()