vent_report_parser.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import logging
  2. import time
  3. from langchain_openai import ChatOpenAI
  4. from langchain_core.prompts import ChatPromptTemplate
  5. from typing import List, Dict, Any
  6. import json
  7. from config.settings import LLM_MODEL, LLM_API_KEY, LLM_BASE_URL, LLM_TEMPERATURE, LLM_TIMEOUT
  8. from parser.base_parser import BaseParser
  9. class VentReportParser(BaseParser):
  10. def __init__(self):
  11. super().__init__()
  12. self.llm = ChatOpenAI(
  13. model=LLM_MODEL,
  14. api_key=LLM_API_KEY,
  15. base_url=LLM_BASE_URL,
  16. temperature=LLM_TEMPERATURE,
  17. timeout=LLM_TIMEOUT
  18. )
  19. def parse(self, file_path: str) -> Dict[str, Any]:
  20. documents = self.load_pdf(file_path)
  21. full_text = "\n".join([doc.page_content for doc in documents])
  22. return self._parse(full_text)
  23. def _parse(self, text: str) -> Dict[str, Any]:
  24. start_time = time.time()
  25. prompt = ChatPromptTemplate.from_messages([
  26. ("system", '''
  27. 你是专业煤矿测风报表解析助手。
  28. 请从文档中提取**矿井测风旬报/月报**全部数据,严格仅输出标准JSON,禁止输出任何多余文字、解释、前言后语。
  29. 固定JSON字段(下划线英文简写,严格使用,不可修改):
  30. mine_name 矿井名称
  31. report_no 报表编号
  32. report_date 报表日期
  33. weather 天气
  34. atm_pressure_hpa 大气压力(hPa)
  35. total_eq_area_m2 总等积孔(m²)
  36. ground_temp_c 地面温度(℃)
  37. vent_shafts 风井运行列表(数组)
  38. shaft_name 风井名称
  39. total_inflow_m3min 总进风量(m³/min)
  40. total_outflow_m3min 总回风量(m³/min)
  41. fan_model 风机型号
  42. fan_stator_no 主扇编号
  43. blade_angle_deg 叶片角度(°)
  44. neg_pressure_pa 负压(Pa)
  45. input_power_kw 输入功率(kW)
  46. output_power_kw 输出功率(kW)
  47. efficiency_pct 效率(%)
  48. power_factor_pct 功率因数(%)
  49. voltage_kv 电压(kV)
  50. current_a 电流(A)
  51. mine_total_outflow_m3min 矿井总回风量(m³/min)
  52. mine_total_outflow_calc_m3min 矿井总排风量计算值(m³/min)
  53. total_inflow_m3min 总进风量(m³/min)
  54. planned_air_volume_m3min 计划风量(m³/min)
  55. effective_air_volume_m3min 有效风量(m³/min)
  56. effective_air_rate_pct 有效风量率(%)
  57. test_points 测风地点列表(数组)
  58. point_name 测风地点
  59. point_desc 测点描述
  60. section_area_m2 巷道断面(m²)
  61. wind_speed_ms 风速(m/s)
  62. air_volume_m3min 实测风量(m³/min)
  63. req_air_volume_m3min 需风量(m³/min)
  64. effective_air_volume_m3min 有效风量(m³/min)
  65. temp_c 温度(℃)
  66. methane_pct 瓦斯浓度(%)
  67. co2_pct 二氧化碳浓度(%)
  68. remark 备注
  69. 填充规则:
  70. 1. 无数据时:字符串填"",数值填0,禁止null
  71. 2. 数字自动剔除单位,只保留数值
  72. 3. test_points 里**绝对不要输出 id 字段**
  73. 4. 严格按给定字段输出,不新增、不减少、不改名
  74. 5. 只输出纯净JSON,无任何其他内容
  75. '''),
  76. ("human", "请解析以下煤矿测风报表文档内容:\n{text}")
  77. ])
  78. # 调用LLM解析
  79. chain = prompt | self.llm
  80. response = chain.invoke({"text": text})
  81. elapsed_time = round(time.time() - start_time, 2)
  82. logging.info(f"测风报表解析完成 | 总耗时: {elapsed_time} 秒")
  83. # 安全解析JSON
  84. try:
  85. return json.loads(response.content)
  86. except:
  87. return {"error": "解析失败,返回非标准JSON", "content": response.content}
  88. if __name__ == '__main__':
  89. parser = VentReportParser()
  90. result = parser.parse("D:\\workspace\\py\\vent_agent\\测风报表.pdf")
  91. print(json.dumps(result, ensure_ascii=False, indent=2))