work_face_parser.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 WorkFaceParser(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. working_face_name 工作面名称
  31. max_control_distance 中间架最大控顶距离(单位米)
  32. min_control_distance 中间架最小控顶距离(单位米)
  33. face_length 工作面切眼长度(单位米)
  34. avg_mining_height 平均采高(单位米)
  35. avg_section_area 工作面平均断面(单位平方米)
  36. 填充规则:
  37. 1. 文本无对应数据时,字符串填空文本"",数值统一填0,严禁使用null
  38. 2. 数值只提取纯数字,自动剔除米、m等单位
  39. 3. 必须严格按照上述英文键名输出,字段顺序不可更改
  40. 4. 最终只返回纯净JSON格式,无任何额外内容
  41. 输出示例
  42. {{
  43. "working_face_name": "xxxx工作面",
  44. "max_control_distance": 0,
  45. "min_control_distance": 0,
  46. "face_length": 0,
  47. "avg_mining_height": 0,
  48. "avg_section_area": 0
  49. }}
  50. '''),
  51. ("human", "请解析以下煤矿工作面作业规程文档内容:\n{text}")
  52. ])
  53. # 调用大模型(唯一一次)
  54. chain = prompt | self.llm
  55. response = chain.invoke({"text": text}) # 控制在安全长度内
  56. elapsed_time = round(time.time() - start_time, 2)
  57. # 日志输出
  58. print(f"文档解析完成| 总耗时: {elapsed_time} 秒")
  59. return json.loads(response.content)
  60. if __name__ == '__main__':
  61. parser = WorkFaceParser()
  62. result = parser.parse("C:\\Users\ky\Desktop\配风计划研判\布尔台\布尔台煤矿12204综采工作面作业规程doc. -0507.pdf")
  63. print(json.dumps(result, ensure_ascii=False, indent=2))