From 9109890fcac0bbb7d9a05c58eb72a9fed28b81e9 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Thu, 27 Feb 2025 16:33:26 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=BF=85=E9=A1=BB=E6=A7=BD=E4=BD=8D?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/mian.py | 78 ++++++++++++++++++++++++++++++---------------------- uie/train.py | 6 ++-- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/api/mian.py b/api/mian.py index b2fe016..ec9fdbd 100644 --- a/api/mian.py +++ b/api/mian.py @@ -9,12 +9,12 @@ import paddle.nn.functional as F # 用于 Softmax from typing import List, Dict from pydantic import ValidationError -from api.intentRecognition import IntentRecognition -from api.slotRecognition import SlotRecognition +from intentRecognition import IntentRecognition +from slotRecognition import SlotRecognition # 常量 -MODEL_ERNIE_PATH = R"E:\workingSpace\PycharmProjects\Intention_dev\ernie\output\checkpoint-4160" -MODEL_UIE_PATH = R"E:\workingSpace\PycharmProjects\Intention_dev\uie\uie_ner\checkpoint-4320" +MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-4160" +MODEL_UIE_PATH = R"../uie/output/checkpoint-4320" # 类别名称列表 labels = [ @@ -36,7 +36,6 @@ label_map = { 10: 'B-riskLevel', 20: 'I-riskLevel' } - # 初始化工具类 intent_recognizer = IntentRecognition(MODEL_ERNIE_PATH, labels) @@ -45,6 +44,7 @@ slot_recognizer = SlotRecognition(MODEL_UIE_PATH, label_map) # 设置Flask应用 app = Flask(__name__) + # 统一的异常处理函数 @app.errorhandler(Exception) def handle_exception(e): @@ -117,7 +117,7 @@ def intent_reco(): return user_validation_error # 调用predict方法进行意图识别 - predicted_label, predicted_probability,predicted_id = intent_recognizer.predict(text) + predicted_label, predicted_probability, predicted_id = intent_recognizer.predict(text) return jsonify( code=200, @@ -190,19 +190,30 @@ def agent(): predicted_label, predicted_probability, predicted_id = intent_recognizer.predict(query) # 再进行槽位抽取 entities = slot_recognizer.recognize(query) - status, sk = check_lost(predicted_label, entities) - # 返回意图和槽位识别的结果 - return jsonify({ - "code": 200, - "msg": "成功", - "answer": { - "int": predicted_id, - "label": predicted_label, - "probability": predicted_probability, - "slot": entities - }, - }) + print(f"意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") + #必须槽位缺失检查 + status, sk = check_lost(predicted_id, entities) + if status == 1: + return jsonify({ + "code": 200, + "msg": "成功", + "answer": { + "miss": sk + }, + }) + + else: + return jsonify({ + "code": 200, + "msg": "成功", + "answer": { + "int": predicted_id, + "label": predicted_label, + "probability": predicted_probability, + "slot": entities + }, + }) # 如果是后续轮次(多轮对话),这里只做示例,可能需要根据具体需求进行处理 else: @@ -219,27 +230,24 @@ def agent(): return jsonify({"error": str(e)}), 500 # 捕捉其他错误并返回 +# def check_lost(int_res, slot): +# return 0, "" def check_lost(int_res, slot): - # mapping = { - # "页面切换":[['页面','应用']], - # "作业计划数量查询":[['时间']], - # "周计划查询":[['时间']], - # "作业内容":[['时间']], - # "施工人数":[['时间']], - # "作业考勤人数":[['时间']], - # } + #labels: ["天气查询","互联网查询","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容","施工人数","作业考勤人数","知识问答"] mapping = { - 1: [['date', 'area']], - 3: [['page'], ['app'], ['module']], + 2: [['page'], ['app'], ['module']], + 3: [['date']], 4: [['date']], 5: [['date']], 6: [['date']], 7: [['date']], - 8: [[]], - 9: [[]], + 8: [['date']], } + #3:"页面切换", + intention_mapping = {2: "页面切换", 3: "日计划数量查询", 4: "周计划数量查询", 5: "日计划作业内容", + 6: "周计划作业内容",7: "施工人数",8: "作业考勤人数"} if not mapping.__contains__(int_res): - return 0, [] + return 0, "" cur_k = list(slot.keys()) idx = -1 idx_len = 99 @@ -258,8 +266,12 @@ def check_lost(int_res, slot): if idx_len == 0: # 匹配通过 return 0, cur_k left = [x for x in mapping[int_res][idx] if x not in cur_k] - return 1, left # mapping[int_res][idx] + apologize_str = "非常抱歉," + if int_res == 2: + return 1, f"{apologize_str}请问你想查询哪个页面?" + elif int_res in [3, 4, 5, 6, 7, 8]: + return 1, f"{apologize_str}请问你想查询什么时间的{intention_mapping[int_res]}?" if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) + app.run(host='0.0.0.0', port=18074, debug=True) diff --git a/uie/train.py b/uie/train.py index 269ed31..491b160 100644 --- a/uie/train.py +++ b/uie/train.py @@ -63,8 +63,8 @@ def preprocess_function(example, tokenizer): # === 3. 加载 UIE 预训练模型 === -model = ErnieForTokenClassification.from_pretrained("uie-base", num_classes=21) # 3 类 (O, B, I) -tokenizer = ErnieTokenizer.from_pretrained("uie-base") +model = ErnieForTokenClassification.from_pretrained(r"/mnt/d/weiweiwang/intention/models/uie-base", num_classes=21) # 3 类 (O, B, I) +tokenizer = ErnieTokenizer.from_pretrained(r"/mnt/d/weiweiwang/intention/models/uie-base") # === 4. 加载数据集 === train_dataset = load_dataset("data/data_part1.json") # 训练数据集 @@ -81,7 +81,7 @@ data_collator = DataCollatorForTokenClassification(tokenizer, padding=True) # === 7. 训练参数 === training_args = TrainingArguments( - output_dir="./uie_ner", + output_dir="./output", evaluation_strategy="epoch", save_strategy="epoch", per_device_train_batch_size=16, # 你的显存较大,可调整 batch_size From 823c6ebafab18cd46f01aaef69923fc06b503121 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Thu, 27 Feb 2025 17:32:47 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=BF=85=E9=A1=BB=E6=A7=BD=E4=BD=8D?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/mian.py | 17 +- api/standard_data/standard_program.txt | 16750 +++++++++++++++++++++++ api/standard_data/standard_project.txt | 199 + api/utils.py | 18 + 4 files changed, 16982 insertions(+), 2 deletions(-) create mode 100644 api/standard_data/standard_program.txt create mode 100644 api/standard_data/standard_project.txt create mode 100644 api/utils.py diff --git a/api/mian.py b/api/mian.py index ec9fdbd..7d01b0d 100644 --- a/api/mian.py +++ b/api/mian.py @@ -11,6 +11,8 @@ from pydantic import ValidationError from intentRecognition import IntentRecognition from slotRecognition import SlotRecognition +from fuzzywuzzy import process +import utils # 常量 MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-4160" @@ -42,6 +44,11 @@ intent_recognizer = IntentRecognition(MODEL_ERNIE_PATH, labels) # 初始化槽位识别工具类 slot_recognizer = SlotRecognition(MODEL_UIE_PATH, label_map) # 设置Flask应用 + +#标准工程名 +standard_project_name_list = utils.load_standard_name('./standard_data/standard_project.txt') +#标准项目名 +standard_program_name_list = utils.load_standard_name('./standard_data/standard_program.txt') app = Flask(__name__) @@ -230,8 +237,6 @@ def agent(): return jsonify({"error": str(e)}), 500 # 捕捉其他错误并返回 -# def check_lost(int_res, slot): -# return 0, "" def check_lost(int_res, slot): #labels: ["天气查询","互联网查询","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容","施工人数","作业考勤人数","知识问答"] mapping = { @@ -273,5 +278,13 @@ def check_lost(int_res, slot): return 1, f"{apologize_str}请问你想查询什么时间的{intention_mapping[int_res]}?" +#标准化工程名 +def check_project_standard_slot(int_res, slot)->tuple: + return 0, '' + +def fuzzy_match(user_input, standard_name): + result = process.extract(user_input, standard_name) + return result[0], result[1]/100 + if __name__ == '__main__': app.run(host='0.0.0.0', port=18074, debug=True) diff --git a/api/standard_data/standard_program.txt b/api/standard_data/standard_program.txt new file mode 100644 index 0000000..609a9f5 --- /dev/null +++ b/api/standard_data/standard_program.txt @@ -0,0 +1,16750 @@ +所属项目部 +第八项目管理部(淮北宿州) +第七项目管理部(阜阳) +第十一项目管理部(马鞍山) +第四项目管理部(安庆) +第九项目管理部(合肥轨道线) +第五项目管理部(合肥) +第一项目管理部(池州黄山) +第十项目管理部(特高压) +第二项目管理部(宣城) +第六项目管理部(滁州) +第三项目管理部(芜湖) +第四项目管理部(六安变电) +第七项目管理部(淮南线路) +第十项目管理部(亳州变电) +第九项目管理部(亳州线路) +第五项目管理部(蚌埠线路) +第十一项目管理部(萧砀线路) +第三项目管理部(张店线路) +第三项目管理部(岳西线路) +第八项目管理部(淮南变电) +第六项目管理部(蚌埠变电) +第十一项目管理部(宿州线路) + +第二项目管理部(合肥变电) +第三项目管理部(谯城变、亳州楼) +第五项目管理部(金牛变) +第二项目管理部(合州站、阜四变) +第一项目管理部(萧砀变、锁库变) +第七项目管理部(合肥中心变) +第二项目管理部(修试) +第三项目管理部(香鹭东段) +第二项目管理部(香鹭西段) +第五项目管理部(阜阳) +第十三项目管理部(黄山) +第八项目管理部(芜湖) +第九项目管理部(马鞍山) +第四项目管理部(甘浙) +第十一项目管理部(宣城) +第九项目管理部(淮北) +第十二项目管理部(陕皖) +第一项目管理部(肥东) +第四项目管理部(池州) +第二项目管理部(紫蓬) +第六项目管理部(安庆) +第八项目管理部(宿州分部) +第七项目管理部(安庆四) +第三项目管理部(庐江) +第三项目管理部(六安线路) +第六项目管理部(阜阳综合楼、省营销楼) +第四项目管理部(安庆四、明生楼) +第一项目管理部(金上) +第一项目管理部(修试) +第五项目管理部(铜陵) +第八项目管理部(宿州) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +所属项目部 +第八项目管理部(淮北宿州) +第七项目管理部(阜阳) +第十一项目管理部(马鞍山) +第四项目管理部(安庆) +第九项目管理部(合肥轨道线) +第五项目管理部(合肥) +第一项目管理部(池州黄山) +第十项目管理部(特高压) +第二项目管理部(宣城) +第六项目管理部(滁州) +第三项目管理部(芜湖) +第四项目管理部(六安变电) +第七项目管理部(淮南线路) +第十项目管理部(亳州变电) +第九项目管理部(亳州线路) +第五项目管理部(蚌埠线路) +第十一项目管理部(萧砀线路) +第三项目管理部(张店线路) +第三项目管理部(岳西线路) +第八项目管理部(淮南变电) +第六项目管理部(蚌埠变电) +第十一项目管理部(宿州线路) + +第二项目管理部(合肥变电) +第三项目管理部(谯城变、亳州楼) +第五项目管理部(金牛变) +第二项目管理部(合州站、阜四变) +第一项目管理部(萧砀变、锁库变) +第七项目管理部(合肥中心变) +第二项目管理部(修试) +第三项目管理部(香鹭东段) +第二项目管理部(香鹭西段) +第五项目管理部(阜阳) +第十三项目管理部(黄山) +第八项目管理部(芜湖) +第九项目管理部(马鞍山) +第四项目管理部(甘浙) +第十一项目管理部(宣城) +第九项目管理部(淮北) +第十二项目管理部(陕皖) +第一项目管理部(肥东) +第四项目管理部(池州) +第二项目管理部(紫蓬) +第六项目管理部(安庆) +第八项目管理部(宿州分部) +第七项目管理部(安庆四) +第三项目管理部(庐江) +第三项目管理部(六安线路) +第六项目管理部(阜阳综合楼、省营销楼) +第四项目管理部(安庆四、明生楼) +第一项目管理部(金上) +第一项目管理部(修试) +第五项目管理部(铜陵) +第八项目管理部(宿州) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +第八项目管理部(淮北宿州) +第七项目管理部(阜阳) +第十一项目管理部(马鞍山) +第四项目管理部(安庆) +第九项目管理部(合肥轨道线) +第五项目管理部(合肥) +第一项目管理部(池州黄山) +第十项目管理部(特高压) +第二项目管理部(宣城) +第六项目管理部(滁州) +第三项目管理部(芜湖) +第四项目管理部(六安变电) +第七项目管理部(淮南线路) +第十项目管理部(亳州变电) +第九项目管理部(亳州线路) +第五项目管理部(蚌埠线路) +第十一项目管理部(萧砀线路) +第三项目管理部(张店线路) +第三项目管理部(岳西线路) +第八项目管理部(淮南变电) +第六项目管理部(蚌埠变电) +第十一项目管理部(宿州线路) + +第二项目管理部(合肥变电) +第三项目管理部(谯城变、亳州楼) +第五项目管理部(金牛变) +第二项目管理部(合州站、阜四变) +第一项目管理部(萧砀变、锁库变) +第七项目管理部(合肥中心变) +第二项目管理部(修试) +第三项目管理部(香鹭东段) +第二项目管理部(香鹭西段) +第五项目管理部(阜阳) +第十三项目管理部(黄山) +第八项目管理部(芜湖) +第九项目管理部(马鞍山) +第四项目管理部(甘浙) +第十一项目管理部(宣城) +第九项目管理部(淮北) +第十二项目管理部(陕皖) +第一项目管理部(肥东) +第四项目管理部(池州) +第二项目管理部(紫蓬) +第六项目管理部(安庆) +第八项目管理部(宿州分部) +第七项目管理部(安庆四) +第三项目管理部(庐江) +第三项目管理部(六安线路) +第六项目管理部(阜阳综合楼、省营销楼) +第四项目管理部(安庆四、明生楼) +第一项目管理部(金上) +第一项目管理部(修试) +第五项目管理部(铜陵) +第八项目管理部(宿州) + + + + + + + + + + + diff --git a/api/standard_data/standard_project.txt b/api/standard_data/standard_project.txt new file mode 100644 index 0000000..49ab46c --- /dev/null +++ b/api/standard_data/standard_project.txt @@ -0,0 +1,199 @@ +杨柳220kV变电站220kV南坪间隔扩建工程 +阜阳东坡110kV变电站新建工程 +杨柳圩110kV变电站110kV配电装置改造工程 +阜阳太和城南110kV变电站新建工程 +安庆石化110kV变电站新建 工程 +华南城220kV变电站新建工程 +马鞍山万济220kV变电站新建工程 +紫蓬500kV变电站间隔扩建工程 +安徽阜阳阜四500kV变电站新建工程 +安徽合肥杜岗220kV开关站新建工程 +庐北220kV变电站新建工程 +渝北±800千伏换流站工程电气安装A包 +宿州城东220kV变电站新建工程 +马鞍山金河口110kV变电站新建工程 +安庆四500kV变电站新建工程 +合肥循环园220kV变电站新建工程 +马鞍山郑蒲220kV变电站新建工程 +国网安徽宣城供电公司500kV河沥变加装固定融冰装置 +滁州堰陈110千伏变电站新建工程 +安徽河沥500kV变电站3号主变扩建工程 +安徽合肥义兴220kV变电站新建工程 +宣城中港110kV变电站新建工程 +安庆城南110kV变电站新建工程 +国网安徽安庆供电公司500kV双岭变电站加装固定融冰装置 +芜湖蛟矶220kV变电站新建工程 +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造 +马鞍山横龙110kV变电站新建工程 +金牛500kV变电站新建工程 +安庆双港220kV变电站新建工程 +安庆银山220kV变电站新建工程 +芜湖高村220kV变电站新建工程 +滁州红桥220kV变电站新建工程 +安徽合肥方兴II110kV变电站新建工程 +银联黄山园区220kV变电站工程 +陕北-安徽±800千伏特高压直流输电工程陶大庄村接地极工程 +松滋-安丰220kV线路工程 +伯阳500千伏变电站220千伏间隔扩建工程 +道轩汇流站-伯阳 220kV 线路工程 +香涧-梨花220kV线路工程 +埇桥-萧砀Ⅰ回500千伏线路工程 +埇桥-萧砀Ⅱ回500千伏线路工程 +石岗-施桥110kV线路工程 +芦集-古沟π入潘集变电站220kV线路工程 +黄阳-仙河110kV线路工程 +淮南芦集220千伏变电站220千伏配电装置改造工程 +伯阳-谯城500kV线路工程 +魏武-桐花π入祝集变电站110kV线路工程 +耿皇-焦楼220kV线路工程 +蕴山-沙埂110kV线路工程 +蚌埠孝仪220kV变电站新建工程(建筑安装部分) +安徽六安春秋塘-山七π入汤池变电站110kV线路工程 +亳州城北110kV变电站新建工程 +蚌埠潼河110kV变电站新建工程 +沪宁合高铁安徽段500kV清同5737线等2处电力线路迁改工程 +伯阳-涡阳π入真源变电站220kV线路工程 +濉淮5379濉洪5380线147#-148#跨阜淮铁路迁改工程 +汤庄-平圩500kV线路工程 +换流站-金牛500kV线路工程 +包河10kV玉龙18网架结构化工程施工 +淮南安丰220千伏变电站新建工程 +祝集220kV变电站新建工程 +田家庵电厂秦集改接孝仪变电站220kV线路工程 +谯城500千伏变电站新建工程(建筑) +金牛500kV变电站新建工程(建筑) +陕北-安徽直流工程合州±800千伏换流站土建A包 +锁库500kV变电站新建工程 +安徽宿州萧砀500千伏变电站新建工程(建筑部分) +合肥中心变B包 +中心500kV变电站新建工程(A包) +国网北京检修公司2024年±500kV延庆换流站直流主设备及辅助设备不停电检修维护 +香涧-鹭岛500kV线路工程(一般线路东段) +香涧-鹭岛500kV线路工程(淮河大跨越段) +安徽滁州清流-环漪220kV线路改造工程 +香涧-鹭岛500kV线路工程(一般线路西段) +谢桥电厂-原鹿220kV线路工程 +阜四-椿树220千伏线路工程 +寨西-苦竹溪T接金桥变电站110kV线路工程 +韦寨-范兴集π入阜四变电站220kV线路工程 +金牛-福渡500kV线路工程(巢湖、无为段) +金牛-福渡500kV线路工程(庐江段) +安徽马鞍山当涂-万济220kV线路工程 +黄山巷联-水西220kV线路工程 +苍山-横龙110kV架空线路工程 +安徽马鞍山围屏-万济220kV线路工程 +甘肃-浙江±800千伏特高压直流输电线路工程(皖3标段) +广德-敬亭π入桂花(广五)变220kV线路工程 +绿雪-莲塘220kV线路工程 +芜湖福渡-蛟矶220kV线路工程 +塔岗-西梁山T接杨柳圩变电站110kV架空线路工程 +芜湖江北-通江π入蛟矶变电站220kV线路工程 +含山-环峰T接横龙110kV架空线路工程 +安徽宣城莲塘-敬亭220kV线路改造工程 +月桥-火龙岗π入高村变电站220kV线路工程 +太和-李腰π入城南变电站110kV架空线路工程 +文昌宫-淮北西牵引站220kV线路工程 +杨柳四铺π入况楼变110kV电缆线路工程 +陕北-安徽±800kV特高压直流输电线路工程(皖2标) +安徽合肥晶合220kV外部供电工程(合肥杜岗Ⅱ220kV输变电工程) +肥西-中心500kV线路工程(电缆部分) +池州电厂二期-涓桥220kV线路工程 +陶楼-下塘、陶楼-航锂(凯博)π入下塘变电站220kV电缆线路工程 +显通-白杨(T接刘桥)、显通-溪河(T接刘桥)π入凌云变电站110kV架空线路工程 +南屏-蓬莱路π入派河变电站110kV线路工程 +茗南-熙湖T接城南变电站110kV架空线路工程 +显通-碱河π入凌云变电站220kV电缆线路工程 +灵泗-奎河220kV线路工程 +合肥二电厂-长临河π入循环园变电站220kV线路工程 +安徽合肥铭传-华南城220kV线路工程 +孔店-龙门500kV线路增容改造工程 +游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV电缆线路工程 +桐城-独秀π入双港变电站220kV线路工程 +杨柳-南坪改接至双堆集牵引站220kV线路工程 +合肥二电厂-彭郢π入长临河变电站220kV线路工程 +合肥长临河-义兴220kV架空线路工程 +陂塘-草庙乡牵引站220kV架空线路工程 +安徽官山-涓桥I、II回π入池州二变500千伏线路工程 +南坪-双堆集牵引站220kV线路工程 +肥西-中心500kV线路工程(架空部分) +先锋-泉河π入安庆四变电站220kV线路工程 +况楼-杨柳220kV线路工程 +安庆四-涓桥500kV线路工程(一般线路段) +藕池-漆园π入杨柳变电站220kV线路工程 +金牛-紫蓬500kV线路工程 +合肥金牛-庐江π入庐江北变电站220KV线路工程 +独秀-谭桥牵引站π入和平变电站220kV线路工程 +龙门500kV变电站间隔扩建工程 +安徽合肥下塘220kV变电站新建工程 +芜湖潘坛220kV变电站新建工程 +安徽滁州护桥220kV变电站2号主变扩建工程 +岩歙220kV变电站新建工程 +安徽淮北凌云220千伏变电站新建工程 +六安汤池 110kV 变电站新建工程 +白莲-邵岗π入尧塘变电站35kV架空线路工程 +淮南至桐城高速公路淮南段500kV电力迁改工程 +国网安徽电力营销服务计量用房 +国网安徽亳州供电公司运检营销综合用房 +安庆四500kV变电站新建工程(建筑) +安徽沙河变至原鹿变500kV双回线路开断接入阜四变工程 +黄栗树-儒林π入堰陈变电站110kV线路工程 +金上-湖北线路工程(川12标) +安徽阜阳薛桥-花园220kV线路改造工程 +章塘-邰桥、石桥-邰桥π入万济变电站110kV线路工程 +围屏-石桥π入万济变电站110kV线路工程 +安庆-龙山π入安庆四变电站220kV线路工程 +夏湖-华都改接入真源变电站110kV线路工程 +蓼城-冯井π入尧塘变电站110kV线路工程 +汤池-河棚35kV架空线路工程 +埇桥-萧砀回500千伏线路工程 +安徽官山-涓桥、回π入池州二变500千伏线路工程 +众兴-草庙乡牵引站220kV架空线路工程 +湖站1000千伏1号主变A相局放配合项目 +肥西-繁昌Ⅰ、Ⅱ回500kV线路改造工程 +宁芜铁扩能改造(安徽段)涉及500kV线路跨越宁芜铁路迁改工程 +S334峨山路东延伸(沿江高速至芜宣高速)新建工程二期500kV电力迁改工程 +芜湖抖音220kV线路涉500kV峨峰5914、峨廻5904线改造工程 +包河10kV延安30与兴集18网架结构优化工程施工 +国网安徽马鞍山供电公司500kV峨廻5904线#92等拉线杆塔改造工程 +国网安徽合肥供电公司2024年500kV肥西变电站一键顺控系统完善提升 +淮南芦集 220千伏变电站220千伏配电装置改造工程 +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造 +和襄高速机电工程总承包项目500kV-1100kV特高压电力线路迁建工程 +阜四500千伏变电站新建工程(建筑部分) +蚌埠孝仪220kV变电站新建工程 +陕北~安徽±800千伏特高压直流输电工程受端换流站四通一平工程 +无人机智能巡检技术实验室项目 +国网安徽淮北供电公司500kV濉溪变电站1号主变5022电流互感器改造 +况楼220kV变电站间隔扩建工程 +国网北京检修公司2024年±500kV延庆换流站阀冷系统设备驻站 +安庆武昌220kV变电站220kV江调间隔扩建工程 +香涧-梨花π入固镇南牵引站220kV线路工程 +安徽合肥杜岗Ⅱ220kV开关站新建工程 +国网安徽合肥供电公司2024年220kV板桥变电站一键顺控系统完善提升 +科学城-长岗Ⅰ回π入塘稍变电站110kV架空线路工程 +牛草山风电场-仙河T接黄阳变电站110kV线路 工程 +世袭庄园二期居配工程 +谷岭220kV变电站220kV蕲城电厂、埇南间隔扩建工程 +官塘-燕山π入孝仪变电站220kV线路工程 +甘肃-浙江线路工程施工包1(芜湖市无为市-芜湖市南陵县) +新河-建阳、明都-建阳π入红桥变电站220kV线路工程 +霸王-厉阳T接金河口110kV线路工程 +双港-独秀π入和平变电站220kV线路工程 +程集-牛庄π入阜四变220千伏线路工程 +合州换流站-文都500千伏线路工程 +安庆四-涓桥500kV线路工程(长江大跨越段) +和平-邓村π入双港变电站220kV线路工程 +安徽合肥包河区10kV王郢19开关网架结构优化工程施工 +合肥二电厂-彭郢π入长临河变电站 220kV 线路工程 +安徽合肥肥西-游乐π入华南城变220kV架空线路工程 +安徽阜阳颍上县110kV半岗-润河35kV线路工程 +游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV架空线路工程 +合肥轨道7号线10kV杆线迁改工程 +科学城-长岗(双回T接空港)改接塘稍变电站110kV架空线路工程 +安徽蚌埠濠州220kV变电站220千伏大唐凤阳红心镇光伏间隔扩建工程(电气安装) +余桥-银山220kV线路工程 +六庆城际铁路穿±500kV宜华线改造工程 +魏岗-古井π入祝集110kV线路工程 +灵泗500kV变电站新建工程 +蚌埠大唐滁州电厂220kV送出工程 +国网北京检修公司2024年±500kV延庆换流站直流主设备年度检修维护 diff --git a/api/utils.py b/api/utils.py new file mode 100644 index 0000000..083a32d --- /dev/null +++ b/api/utils.py @@ -0,0 +1,18 @@ +def load_standard_name(file_path:str): + try: + # f = open(file_path, 'r', encoding='utf-8') + with open(file_path, 'r', encoding='utf-8') as f: + data = f.read() + data = data.split('\n') + works = {} + for d in data: + wk = d[:d.find('(')] + works[wk] = d + keys = list(works.keys()) + return keys + except FileNotFoundError: + print(f"错误:文件 {file_path} 不存在") + raise FileNotFoundError(f"错误:文件 {file_path} 不存在") + except Exception as e: + print(f"读取文件时发生错误:{e}") + raise Exception(f"错误:文件 {file_path} 不存在") From 2411eba2f0c892c121044e712e7f8cfea08bc92e Mon Sep 17 00:00:00 2001 From: weiweiw <14335254+weiweiw22@user.noreply.gitee.com> Date: Thu, 27 Feb 2025 19:51:17 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E5=92=8C=E9=A1=B9=E7=9B=AE=E5=90=8D=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E5=8C=96=E5=92=8C=E5=A4=9A=E8=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/constants.py | 21 +++++++++++++ api/mian.py | 82 +++++++++++++++++++++++++++++++----------------- api/utils.py | 14 +++++++++ 3 files changed, 88 insertions(+), 29 deletions(-) create mode 100644 api/constants.py diff --git a/api/constants.py b/api/constants.py new file mode 100644 index 0000000..0e7fd56 --- /dev/null +++ b/api/constants.py @@ -0,0 +1,21 @@ +# constants.py +#日期 +DATE = "date" +#工程名称 +PROJECT_NAME = "projectName" +#工程性质 +PROJECT_TYPE = "projectType" +#建管单位 +CONSTRUCTION_UNIT = "constructionUnit" +#分公司 +IMPLEMENTATION_ORG = "implementationOrganization" +#项目部 +PROJECT_DEPARTMENT = "projectDepartment" +#项目经理 +PROJECT_MANAGER = "projectManager" +#分包商 +SUBCONTRACTOR = "subcontractor" +#班组 +TEAM_LEADER = "teamLeader" +#风险 +RISK_LEVEL = "riskLevel" diff --git a/api/mian.py b/api/mian.py index 7d01b0d..b17726f 100644 --- a/api/mian.py +++ b/api/mian.py @@ -12,7 +12,8 @@ from pydantic import ValidationError from intentRecognition import IntentRecognition from slotRecognition import SlotRecognition from fuzzywuzzy import process -import utils +from utils import CheckResult, StandardType +from constants import PROJECT_NAME, PROJECT_DEPARTMENT # 常量 MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-4160" @@ -199,28 +200,26 @@ def agent(): entities = slot_recognizer.recognize(query) print(f"意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") + #必须槽位缺失检查 status, sk = check_lost(predicted_id, entities) - if status == 1: + if status == CheckResult.NEEDS_MORE_ROUNDS: + return jsonify({"code": 10001, "msg": "成功", + "answer": { "miss": sk}, + }) + + #工程名和项目名标准化 + result, information = check_project_standard_slot(predicted_id, entities) + if result == CheckResult.NEEDS_MORE_ROUNDS: return jsonify({ - "code": 200, - "msg": "成功", - "answer": { - "miss": sk - }, + "code": 10001, "msg": "成功", + "answer": {"miss": information}, }) - else: - return jsonify({ - "code": 200, - "msg": "成功", - "answer": { - "int": predicted_id, - "label": predicted_label, - "probability": predicted_probability, - "slot": entities - }, - }) + return jsonify({ + "code": 200,"msg": "成功", + "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability, "slot": entities }, + }) # 如果是后续轮次(多轮对话),这里只做示例,可能需要根据具体需求进行处理 else: @@ -248,39 +247,64 @@ def check_lost(int_res, slot): 7: [['date']], 8: [['date']], } - #3:"页面切换", + intention_mapping = {2: "页面切换", 3: "日计划数量查询", 4: "周计划数量查询", 5: "日计划作业内容", 6: "周计划作业内容",7: "施工人数",8: "作业考勤人数"} if not mapping.__contains__(int_res): return 0, "" + #提取的槽位信息 cur_k = list(slot.keys()) idx = -1 idx_len = 99 for i in range(len(mapping[int_res])): sk = mapping[int_res][i] - left = [x for x in sk if x not in cur_k] - more = [x for x in cur_k if x not in sk] - if len(more) >= 0 and len(left) == 0: + #不在提取的槽位信息里,但是在必须槽位表里 + miss_params = [x for x in sk if x not in cur_k] + #不在必须槽位表里,但是在提取的槽位信息里 + extra_params = [x for x in cur_k if x not in sk] + if len(extra_params) >= 0 and len(miss_params) == 0: idx = i idx_len = 0 break - if len(left) < idx_len: + if len(miss_params) < idx_len: idx = i - idx_len = len(left) + idx_len = len(miss_params) if idx_len == 0: # 匹配通过 - return 0, cur_k + return CheckResult.NO_MATCH, cur_k + #符合当前意图的的必须槽位,但是不在提取的槽位信息里 left = [x for x in mapping[int_res][idx] if x not in cur_k] + print(f"符合当前意图的的必须槽位,但是不在提取的槽位信息里, {left}") apologize_str = "非常抱歉," if int_res == 2: - return 1, f"{apologize_str}请问你想查询哪个页面?" + return CheckResult.NEEDS_MORE_ROUNDS, f"{apologize_str}请问你想查询哪个页面?" elif int_res in [3, 4, 5, 6, 7, 8]: - return 1, f"{apologize_str}请问你想查询什么时间的{intention_mapping[int_res]}?" + return CheckResult.NEEDS_MORE_ROUNDS, f"{apologize_str}请问你想查询什么时间的{intention_mapping[int_res]}?" #标准化工程名 -def check_project_standard_slot(int_res, slot)->tuple: - return 0, '' +def check_project_standard_slot(int_res, slot) -> tuple: + intention_list = {3, 4, 5, 6, 7, 8} + if int_res not in intention_list: + return CheckResult.NO_MATCH,"" + + for key, value in slot.items(): + if key == PROJECT_NAME: + match_project, match_possibility = fuzzy_match(value, standard_project_name_list) + if match_possibility >= 0.9: + slot[key] = match_project + else: + return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的工程名是{match_project}吗" + + if key == PROJECT_DEPARTMENT: + match_program, match_possibility = fuzzy_match(value, standard_program_name_list) + if match_possibility >= 0.9: + slot[key] = match_program + else: + return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的项目名是{match_program}吗" + + return CheckResult.NO_MATCH,"" + def fuzzy_match(user_input, standard_name): result = process.extract(user_input, standard_name) diff --git a/api/utils.py b/api/utils.py index 083a32d..711d7be 100644 --- a/api/utils.py +++ b/api/utils.py @@ -1,3 +1,4 @@ +from enum import Enum def load_standard_name(file_path:str): try: # f = open(file_path, 'r', encoding='utf-8') @@ -16,3 +17,16 @@ def load_standard_name(file_path:str): except Exception as e: print(f"读取文件时发生错误:{e}") raise Exception(f"错误:文件 {file_path} 不存在") + + +class CheckResult(Enum): + NO_MATCH = 0 # 不符合检查条件 + MATCH_FOUND = 1 # 匹配到了值 + NEEDS_MORE_ROUNDS = 2 # 需要多轮 + + +class StandardType(Enum): + #工程名检查 + PROJECT_CHECK = 0 + #项目名检查 + PROGRAM_CHECK = 1 From 487d12b45f65bd396e2c6b7e0962b1eb01cf05e4 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Thu, 27 Feb 2025 20:22:00 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=A4=9A=E8=BD=AE=E9=97=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/mian.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/api/mian.py b/api/mian.py index b17726f..882630d 100644 --- a/api/mian.py +++ b/api/mian.py @@ -12,7 +12,7 @@ from pydantic import ValidationError from intentRecognition import IntentRecognition from slotRecognition import SlotRecognition from fuzzywuzzy import process -from utils import CheckResult, StandardType +from utils import CheckResult, StandardType, load_standard_name from constants import PROJECT_NAME, PROJECT_DEPARTMENT # 常量 @@ -47,9 +47,9 @@ slot_recognizer = SlotRecognition(MODEL_UIE_PATH, label_map) # 设置Flask应用 #标准工程名 -standard_project_name_list = utils.load_standard_name('./standard_data/standard_project.txt') +standard_project_name_list = load_standard_name('./standard_data/standard_project.txt') #标准项目名 -standard_program_name_list = utils.load_standard_name('./standard_data/standard_program.txt') +standard_program_name_list = load_standard_name('./standard_data/standard_program.txt') app = Flask(__name__) @@ -209,7 +209,9 @@ def agent(): }) #工程名和项目名标准化 + print(f"start to check_project_standard_slot") result, information = check_project_standard_slot(predicted_id, entities) + print(f"end check_project_standard_slot,{result},{information}") if result == CheckResult.NEEDS_MORE_ROUNDS: return jsonify({ "code": 10001, "msg": "成功", @@ -286,11 +288,12 @@ def check_lost(int_res, slot): def check_project_standard_slot(int_res, slot) -> tuple: intention_list = {3, 4, 5, 6, 7, 8} if int_res not in intention_list: - return CheckResult.NO_MATCH,"" + return CheckResult.NO_MATCH, "" for key, value in slot.items(): if key == PROJECT_NAME: match_project, match_possibility = fuzzy_match(value, standard_project_name_list) + print(f"fuzzy_match project result:{match_project}, {match_possibility}") if match_possibility >= 0.9: slot[key] = match_project else: @@ -298,17 +301,18 @@ def check_project_standard_slot(int_res, slot) -> tuple: if key == PROJECT_DEPARTMENT: match_program, match_possibility = fuzzy_match(value, standard_program_name_list) + print(f"fuzzy_match program result:{match_program}, {match_possibility}") if match_possibility >= 0.9: slot[key] = match_program else: return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的项目名是{match_program}吗" - return CheckResult.NO_MATCH,"" + return CheckResult.NO_MATCH, "" def fuzzy_match(user_input, standard_name): result = process.extract(user_input, standard_name) - return result[0], result[1]/100 + return result[0][0], result[0][1]/100 if __name__ == '__main__': app.run(host='0.0.0.0', port=18074, debug=True) From 4bc78e36fcccfabe10aebc569353b8bf0bb8bed3 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Fri, 28 Feb 2025 07:49:40 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=A4=9A=E8=BD=AE=E9=97=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/constants.py | 1 + api/mian.py | 8 +++++--- api/standard_data/standard_program.txt | 2 -- api/utils.py | 13 +++---------- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/api/constants.py b/api/constants.py index 0e7fd56..f2fb00b 100644 --- a/api/constants.py +++ b/api/constants.py @@ -1,4 +1,5 @@ # constants.py +SIMILARITY_VALUE = 0.7 #日期 DATE = "date" #工程名称 diff --git a/api/mian.py b/api/mian.py index 882630d..6d2e100 100644 --- a/api/mian.py +++ b/api/mian.py @@ -13,7 +13,7 @@ from intentRecognition import IntentRecognition from slotRecognition import SlotRecognition from fuzzywuzzy import process from utils import CheckResult, StandardType, load_standard_name -from constants import PROJECT_NAME, PROJECT_DEPARTMENT +from constants import PROJECT_NAME, PROJECT_DEPARTMENT, SIMILARITY_VALUE # 常量 MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-4160" @@ -50,6 +50,8 @@ slot_recognizer = SlotRecognition(MODEL_UIE_PATH, label_map) standard_project_name_list = load_standard_name('./standard_data/standard_project.txt') #标准项目名 standard_program_name_list = load_standard_name('./standard_data/standard_program.txt') + +print(f":standard_project_name_list:{standard_project_name_list}") app = Flask(__name__) @@ -294,7 +296,7 @@ def check_project_standard_slot(int_res, slot) -> tuple: if key == PROJECT_NAME: match_project, match_possibility = fuzzy_match(value, standard_project_name_list) print(f"fuzzy_match project result:{match_project}, {match_possibility}") - if match_possibility >= 0.9: + if match_possibility >= SIMILARITY_VALUE: slot[key] = match_project else: return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的工程名是{match_project}吗" @@ -302,7 +304,7 @@ def check_project_standard_slot(int_res, slot) -> tuple: if key == PROJECT_DEPARTMENT: match_program, match_possibility = fuzzy_match(value, standard_program_name_list) print(f"fuzzy_match program result:{match_program}, {match_possibility}") - if match_possibility >= 0.9: + if match_possibility >= SIMILARITY_VALUE: slot[key] = match_program else: return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的项目名是{match_program}吗" diff --git a/api/standard_data/standard_program.txt b/api/standard_data/standard_program.txt index 609a9f5..68ee1f7 100644 --- a/api/standard_data/standard_program.txt +++ b/api/standard_data/standard_program.txt @@ -1,4 +1,3 @@ -所属项目部 第八项目管理部(淮北宿州) 第七项目管理部(阜阳) 第十一项目管理部(马鞍山) @@ -21,7 +20,6 @@ 第八项目管理部(淮南变电) 第六项目管理部(蚌埠变电) 第十一项目管理部(宿州线路) - 第二项目管理部(合肥变电) 第三项目管理部(谯城变、亳州楼) 第五项目管理部(金牛变) diff --git a/api/utils.py b/api/utils.py index 711d7be..5f1bb47 100644 --- a/api/utils.py +++ b/api/utils.py @@ -1,16 +1,9 @@ from enum import Enum def load_standard_name(file_path:str): try: - # f = open(file_path, 'r', encoding='utf-8') - with open(file_path, 'r', encoding='utf-8') as f: - data = f.read() - data = data.split('\n') - works = {} - for d in data: - wk = d[:d.find('(')] - works[wk] = d - keys = list(works.keys()) - return keys + with open(file_path, 'r', encoding='utf-8') as file: + lines = [line.strip() for line in file if line.strip()] + return lines except FileNotFoundError: print(f"错误:文件 {file_path} 不存在") raise FileNotFoundError(f"错误:文件 {file_path} 不存在") From 62db786d2bac141c4b3fd005f59106c7606c2819 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Mon, 3 Mar 2025 10:58:46 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=A4=9A=E8=BD=AE=E9=97=AE=E8=AF=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/mian.py | 81 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/api/mian.py b/api/mian.py index 6d2e100..8acbf60 100644 --- a/api/mian.py +++ b/api/mian.py @@ -201,45 +201,74 @@ def agent(): # 再进行槽位抽取 entities = slot_recognizer.recognize(query) - print(f"意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") - - #必须槽位缺失检查 - status, sk = check_lost(predicted_id, entities) - if status == CheckResult.NEEDS_MORE_ROUNDS: - return jsonify({"code": 10001, "msg": "成功", - "answer": { "miss": sk}, - }) - - #工程名和项目名标准化 - print(f"start to check_project_standard_slot") - result, information = check_project_standard_slot(predicted_id, entities) - print(f"end check_project_standard_slot,{result},{information}") - if result == CheckResult.NEEDS_MORE_ROUNDS: - return jsonify({ - "code": 10001, "msg": "成功", - "answer": {"miss": information}, - }) - - return jsonify({ - "code": 200,"msg": "成功", - "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability, "slot": entities }, - }) + print(f"第一轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") # 如果是后续轮次(多轮对话),这里只做示例,可能需要根据具体需求进行处理 else: query = messages[0].content # 使用 Message 对象的 .content 属性 + # 先进行意图识别 + predicted_label, predicted_probability, predicted_id = intent_recognizer.predict(query) + entities = multi_slot_recognizer(predicted_id, messages) + + print(f"多轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") + + #必须槽位缺失检查 + status, sk = check_lost(predicted_id, entities) + if status == CheckResult.NEEDS_MORE_ROUNDS: + return jsonify({"code": 10001, "msg": "成功", + "answer": { "miss": sk}, + }) + + #工程名和项目名标准化 + print(f"start to check_project_standard_slot") + result, information = check_project_standard_slot(predicted_id, entities) + print(f"end check_project_standard_slot,{result},{information}") + if result == CheckResult.NEEDS_MORE_ROUNDS: return jsonify({ - "user_id": user_id, - "query": query, - "message_count": len(messages) + "code": 10001, "msg": "成功", + "answer": {"miss": information}, }) + return jsonify({ + "code": 200,"msg": "成功", + "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability, "slot": entities }, + }) + except ValidationError as e: return jsonify({"error": e.errors()}), 400 # 捕捉 Pydantic 错误并返回 except Exception as e: return jsonify({"error": str(e)}), 500 # 捕捉其他错误并返回 +def multi_slot_recognizer(intention_id, messages): + from openai import OpenAI + final_slot = {} + api_base_url = "http://36.33.26.201:27861/v1" + api_key = 'EMPTY' + model_name = 'qwen2.5-instruct' + client = OpenAI(base_url = api_base_url, api_key = api_key) + + prompt = f''' + 根据用户的输入{messages},抽取出用户想了解的问题,要求:保持客观真实,简单明了,不要多余解释和阐述 + ''' + + message = [{"role": "system", "content": prompt}] + message.extend(messages) + # print(message) + response = client.chat.completions.create( + messages=message, + model=model_name, + max_tokens=1000, + temperature=0.001, + stream=False + ) + res = response.choices[0].message.content + + print(f"多轮意图后用户想要的问题是{res}") + entries = slot_recognizer.recognize(res) + + return entries + def check_lost(int_res, slot): #labels: ["天气查询","互联网查询","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容","施工人数","作业考勤人数","知识问答"] mapping = { From 857b3feb34f20986c515d902187811466ebcbf64 Mon Sep 17 00:00:00 2001 From: weiweiw Date: Mon, 3 Mar 2025 11:03:48 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=A4=9A=E8=BD=AE=E9=97=AE=E8=AF=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/config.py | 3 +++ api/mian.py | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 api/config.py diff --git a/api/config.py b/api/config.py new file mode 100644 index 0000000..3218cbf --- /dev/null +++ b/api/config.py @@ -0,0 +1,3 @@ +api_base_url = "http://36.33.26.201:27861/v1" +api_key = 'EMPTY' +model_name = 'qwen2.5-instruct' \ No newline at end of file diff --git a/api/mian.py b/api/mian.py index 8acbf60..9bc99da 100644 --- a/api/mian.py +++ b/api/mian.py @@ -15,6 +15,7 @@ from fuzzywuzzy import process from utils import CheckResult, StandardType, load_standard_name from constants import PROJECT_NAME, PROJECT_DEPARTMENT, SIMILARITY_VALUE +from config import * # 常量 MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-4160" MODEL_UIE_PATH = R"../uie/output/checkpoint-4320" @@ -242,10 +243,6 @@ def agent(): def multi_slot_recognizer(intention_id, messages): from openai import OpenAI - final_slot = {} - api_base_url = "http://36.33.26.201:27861/v1" - api_key = 'EMPTY' - model_name = 'qwen2.5-instruct' client = OpenAI(base_url = api_base_url, api_key = api_key) prompt = f'''