IndentityYY.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # coding:utf-8
  2. import json
  3. import re
  4. import requests
  5. def replace_province_with_code(response_data, mapping_file_path):
  6. """
  7. 将 response_data 中条件字段的 '单位' 替换为对应的省份代码。
  8. 参数:
  9. response_data (dict): 原始解析结果数据
  10. mapping_file_path (str): 映射 JSON 文件路径(格式为 代码 -> 省份名称)
  11. 返回:
  12. dict: 替换后的 response_data
  13. """
  14. # 加载映射表:代码 -> 名称
  15. with open(mapping_file_path, 'r', encoding='utf-8') as f:
  16. code_to_name = json.load(f)
  17. # 构造反向映射:名称 -> 代码
  18. name_to_code = {v: k for k, v in code_to_name.items()}
  19. # 获取单位原始值
  20. unit_name = response_data.get('条件', {}).get('单位', '')
  21. # 标准化名称(去掉“省”、“市”、“自治区”、“特别行政区”等后缀)
  22. def normalize_name(name):
  23. suffixes = ['省', '市', '自治区', '特别行政区']
  24. for suffix in suffixes:
  25. if name.endswith(suffix):
  26. return name.replace(suffix, '')
  27. return name
  28. normalized_name = normalize_name(unit_name)
  29. # 替换单位为代码
  30. if normalized_name in name_to_code:
  31. response_data['条件']['单位'] = name_to_code[normalized_name]
  32. else:
  33. print(f"⚠️ 未找到“{normalized_name}”对应的代码,保持原值。")
  34. return response_data
  35. def extract_valid_json_outside_think(text):
  36. # 去掉 <think>...</think> 中的内容
  37. cleaned = re.sub(r'<think>[\s\S]*?</think>', '', text)
  38. # 尝试从清理后的内容中提取所有可能的 JSON 块(以 { 开头,以 } 结尾)
  39. brace_stack = []
  40. json_start = None
  41. for i, char in enumerate(cleaned):
  42. if char == '{':
  43. if not brace_stack:
  44. json_start = i
  45. brace_stack.append('{')
  46. elif char == '}':
  47. if brace_stack:
  48. brace_stack.pop()
  49. if not brace_stack:
  50. json_str = cleaned[json_start:i + 1]
  51. try:
  52. return json.loads(json_str)
  53. except json.JSONDecodeError:
  54. continue
  55. raise ValueError("❌ 无法从 think 外部提取合法 JSON")
  56. OLLAMA_URL = 'http://192.168.31.210:11434/api/generate'
  57. model = "deepseek-r1:32b"
  58. # 提交API的地址
  59. MATCH_URL = 'http://192.168.31.19:8352/api/kg/match'
  60. prompt = """
  61. 现在我要让你在一个或者多个问句中抽取出三元组,其中条件包含:年份、月份、日、省份(问句中有哪些条件就写哪些条件,没有的无需添加到结果中),实体包含:送出电量、送出电量占售电量的比、送出均价、受入电量、送出电量占售电量的比、受入均价。注意:实体在问句中的表示可能不那么准确,请你判断出和我给你实体意思最相近的问句中的实体。
  62. 问句如下:
  63. 山东省2023年12月的送电量是多少?
  64. 输出格式为:
  65. {
  66. "问句": 问句,
  67. "实体": ["送出电量"],
  68. "条件": {
  69. "单位":"山东省",
  70. "年":"2024",
  71. "月":"1",
  72. "日":"1"
  73. }
  74. }
  75. 输出结果只显示上述内容,不输出其他任何东西。
  76. """
  77. # 2023年送出均价最高的是哪个省?
  78. # 2022年哪个省的送出平均价格最高?
  79. # 2024年新疆省的送电量是多少?
  80. payload = {
  81. "model": model,
  82. "prompt": prompt,
  83. "stream": False
  84. }
  85. response = requests.post(OLLAMA_URL, json=payload)
  86. result = response.json()
  87. print("完整的 API 返回数据:", result) # 打印整个 API 返回
  88. print("result['response'] 的值:", result["response"]) # 打印 response 的值
  89. print("result['response'] 的类型:", type(result["response"])) # 打印 response 的类型
  90. response_str = result["response"]
  91. # 解析 JSON
  92. try:
  93. response_data = extract_valid_json_outside_think(response_str)
  94. print("✅ 成功解析 JSON:", json.dumps(response_data, indent=2, ensure_ascii=False))
  95. print("解析成功:", response_data)
  96. updated_data = replace_province_with_code(response_data, '省间关系映射.json')
  97. print(updated_data)
  98. # 发送 JSON 到新的接口
  99. match_response = requests.post(MATCH_URL, json=updated_data)
  100. if match_response.status_code == 200:
  101. match_result = match_response.json()
  102. print("成功发送到 match 接口,返回结果:", match_response.json())
  103. # 提取并检查 match 接口的 'data'
  104. if match_result.get("code") == 200 and "data" in match_result:
  105. query_payload = match_result["data"]
  106. # 发送到 query 接口
  107. query_url = "http://localhost:5000/query"
  108. query_response = requests.post(query_url, json=query_payload)
  109. if query_response.status_code == 200:
  110. print("成功发送到 query 接口,返回结果:", query_response.json())
  111. else:
  112. print("发送到 query 接口失败,状态码:", query_response.status_code)
  113. print("返回内容:", query_response.text)
  114. else:
  115. print("match 接口返回的结果无效或缺少 'data' 字段:", match_result)
  116. else:
  117. print("发送到 match 接口失败,状态码:", match_response.status_code)
  118. print("返回内容:", match_response.text)
  119. except json.JSONDecodeError as e:
  120. print("JSON 解析失败:", e)
  121. print("原始字符串:", repr(response_str))