gas_identification_parser.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # parsers/gas_identification_parser.py
  2. from langchain_openai import ChatOpenAI
  3. from langchain_core.prompts import ChatPromptTemplate
  4. from typing import List, Dict, Any
  5. import json
  6. from config.settings import LLM_MODEL, LLM_API_KEY, LLM_BASE_URL, LLM_TIMEOUT
  7. from parser.base_parser import BaseParser
  8. class GasIdentificationParser(BaseParser):
  9. def __init__(self):
  10. super().__init__()
  11. self.llm = ChatOpenAI(
  12. model=LLM_MODEL,
  13. api_key=LLM_API_KEY,
  14. base_url=LLM_BASE_URL,
  15. timeout=LLM_TIMEOUT
  16. )
  17. def parse(self, file_path: str) -> Dict[str, Any]:
  18. """
  19. ✅ 优化点:
  20. 1. 只加载一次PDF
  21. 2. 只调用一次大模型
  22. 3. 一次性返回所有结构
  23. """
  24. # 1. 加载并清洗文本(只做一次)
  25. documents = self.load_pdf(file_path)
  26. full_text = "\n".join([doc.page_content for doc in documents])
  27. prompt = ChatPromptTemplate.from_messages([
  28. ("system", '''
  29. 你是专业的**煤矿瓦斯等级鉴定报告解析专家**。
  30. 请从PDF/文档内容中**一次性精准提取所有数据**,严格输出标准JSON,**禁止任何多余文字、解释、前言、后语**。
  31. 需要提取的字段如下:
  32. === 报告主表信息 ===
  33. - mine_name:矿井名称
  34. - n_year:鉴定年度(数字,如2024)
  35. - report_month:鉴定报告所属月份(格式:yyyy-MM)
  36. - mine_abs_ch4:矿井绝对瓦斯涌出量(m³/min)
  37. - mine_rel_ch4:矿井相对瓦斯涌出量(m³/t)
  38. - return_max_abs_ch4:采面最大绝对瓦斯涌出量(m³/min)
  39. - return_max_rel_ch4:采面最大相对瓦斯涌出量(m³/t)
  40. - dig_max_abs_ch4:掘进最大绝对瓦斯涌出量(m³/min)
  41. - dig_max_rel_ch4:掘进最大相对瓦斯涌出量(m³/t)
  42. - mine_abs_co2:矿井绝对CO₂涌出量(m³/min)
  43. - mine_rel_co2:矿井相对CO₂涌出量(m³/t)
  44. - return_max_abs_co2:采面最大绝对CO₂涌出量(m³/min)
  45. - return_max_rel_co2:采面最大相对CO₂涌出量(m³/t)
  46. - dig_max_abs_co2:掘进面最大绝对CO₂涌出量(m³/min)
  47. - dig_max_rel_co2:掘进面最大相对CO₂涌出量(m³/t)
  48. - coal_and_gas_outburst:煤与瓦斯突出情况
  49. - gas_blow_out:瓦斯喷出情况
  50. - iden_month_product_state:鉴定月矿井生产状况
  51. - last_year_gas_level:上年度瓦斯等级
  52. - gas_level:本年度瓦斯等级
  53. - report_date:编制日期(yyyy-MM-dd)
  54. - iden_date:鉴定日期(yyyy-MM-dd)
  55. - iden_unit:鉴定单位
  56. === 各用风地点明细表(数组,可多条) ===
  57. - face_name:工作面/巷道/硐室名称
  58. - face_type:地点类型:采煤/掘进/回风巷/硐室
  59. - avg_abs_gas:月平均绝对瓦斯涌出量 m³/min
  60. - max_abs_gas:月最大绝对瓦斯涌出量
  61. - avg_abs_co2:月平均绝对CO₂涌出量
  62. - max_abs_co2:月最大绝对CO₂涌出量
  63. - gas_uneven_coeff:瓦斯涌出不均衡系数
  64. - co2_uneven_coeff:CO₂涌出不均衡系数
  65. - daily_production:日产量 t/d
  66. - remark:备注
  67. ==============================================
  68. 输出JSON格式(严格遵守,不可修改):
  69. {{
  70. "main_info": {{
  71. "mine_name": "",
  72. "n_year": 0,
  73. "report_month": "",
  74. "mine_abs_ch4": 0.00,
  75. "mine_rel_ch4": 0.00,
  76. "return_max_abs_ch4": 0.00,
  77. "return_max_rel_ch4": 0.00,
  78. "dig_max_abs_ch4": 0.00,
  79. "dig_max_rel_ch4": 0.00,
  80. "mine_abs_co2": 0.00,
  81. "mine_rel_co2": 0.00,
  82. "return_max_abs_co2": 0.00,
  83. "return_max_rel_co2": 0.00,
  84. "dig_max_abs_co2": 0.00,
  85. "dig_max_rel_co2": 0.00,
  86. "coal_and_gas_outburst": 0.00,
  87. "gas_blow_out": "",
  88. "iden_month_product_state": "",
  89. "last_year_gas_level": "",
  90. "gas_level": "",
  91. "report_date": "2025-01-01",
  92. "iden_date": "2025-01-01",
  93. "iden_unit": ""
  94. }},
  95. "detail_list": [
  96. {{
  97. "face_name": "",
  98. "face_type": "",
  99. "avg_abs_gas": 0.0000,
  100. "max_abs_gas": 0.0000,
  101. "avg_rel_gas": 0.0000,
  102. "avg_abs_co2": 0.0000,
  103. "max_abs_co2": 0.0000,
  104. "gas_uneven_coeff": 0.0000,
  105. "co2_uneven_coeff": 0.0000,
  106. "daily_production": 0.00,
  107. "remark": ""
  108. }}
  109. ]
  110. }}
  111. 解析规则:
  112. 1. 找不到的字段:字符串用"",数字用0/0.00/0.0000,禁止null
  113. 2. report_month 格式必须为 yyyy-MM
  114. 3. 日期必须为 yyyy-MM-dd
  115. 4. 文档中出现多个工作面/巷道/硐室,detail_list 输出多条
  116. 5. 只输出JSON,无任何其他内容,不要写markdown语法
  117. 6. 仔细从瓦斯等级鉴定基础数据计算表中寻找月上中下旬的的瓦斯/二氧化碳涌出总量,并计算三旬平均作为月平均绝对涌出量,找出最大值作为月最大绝对涌出量,计算最大值与月平均值的比值作为不均衡系数
  118. '''),
  119. ("human", "请解析以下瓦斯等级鉴定报告内容:\n{text}")
  120. ])
  121. chain = prompt | self.llm
  122. response = chain.invoke({"text": full_text})
  123. return json.loads(response.content)
  124. if __name__ == '__main__':
  125. parser = GasIdentificationParser()
  126. result = parser.parse("C:\\Users\ky\Desktop\配风计划研判\布尔台\附件5:布尔台煤矿2024-2025年度瓦斯等级鉴定报告.pdf")
  127. print(json.dumps(result, ensure_ascii=False, indent=2))