From 20a2ee4651f98bef8a330077a59d2beec711571f Mon Sep 17 00:00:00 2001 From: weiweiw <14335254+weiweiw22@user.noreply.gitee.com> Date: Sun, 11 May 2025 17:04:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=BD=E5=B7=A5=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E7=AE=A1=E7=90=86=E5=B9=B3=E5=8F=B0=E7=9A=84=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=84=8F=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/main.py | 97 +++++++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 43 deletions(-) diff --git a/api/main.py b/api/main.py index 9163860..08af9fe 100644 --- a/api/main.py +++ b/api/main.py @@ -15,11 +15,8 @@ from config import * from globalData import GlobalData from apscheduler.schedulers.background import BackgroundScheduler -# MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-25910" -# MODEL_UIE_PATH = R"../uie/output/checkpoint-32750" - -MODEL_ERNIE_PATH = R"../ernie/output_temp/checkpoint-25627" -MODEL_UIE_PATH = R"../uie/output_temp/checkpoint-36320" +MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-14672" +MODEL_UIE_PATH = R"../uie/output/checkpoint-18190" # 类别名称列表 labels = [ @@ -281,14 +278,14 @@ def extract_multi_chat(messages): latest_user_question = latest_message.content if latest_message.role == "user" else "" time_prefixes = ["当前","今天", "昨天", "本周", "下周", "明天", "今日","打开"] - history_messages = [] if any(prefix in latest_user_question and prefix != latest_user_question for prefix in time_prefixes) else messages[:-1] + history_messages = [] if any(prefix in latest_user_question and len(latest_user_question) > 3 for prefix in time_prefixes) else messages[:-1] logger.info(f"len(history_messages):{len(history_messages)}") #最新问题的上一个问题里如果含有时间,则清空最老的历史对话 last_two_messages = history_messages[-2:] has_time_prefix = any( - msg.role == "user" and any(prefix in msg.content and prefix != msg.content for prefix in time_prefixes) + msg.role == "user" and any(prefix in msg.content and len(msg.content) > 3 for prefix in time_prefixes) for msg in last_two_messages ) last_chat_history = "\n".join([f"{msg.role}: {msg.content}" for msg in last_two_messages]) @@ -303,65 +300,78 @@ def extract_multi_chat(messages): --- 【规则判断与补全流程】 - - 第一步:用户最新问题是否以“公司”为主语?→ 原样返回,无需补全 - - 若用户最新问题主语是“公司”,直接返回原句,无需补全。 - - 主语为“公司”的典型句式: - - 以“公司”开头; - - 以“今天”“昨天”“本周”“下周”等时间词开头,紧跟“公司”作为主语; - - 示例: - - 用户的最新问题:“今天公司有多少四级风险作业计划?” - - 用户的最新问题:“今天公司有多少作业计划” - - 用户的最新问题:“公司今天有多少4级风险的作业面?” - - 最终提问均为: 原句不变。 - - 第二步:用户最新问题是否是完整的问题?→ 原样返回,无需补全 - - 若用户最新问题中包含下列之一:具体的项目部名、工程名、分公司名、班组名、地区名等信息,且同时出现作业计划、作业面、班组等查询对象,视为完整问题,直接返回原句,无需补全。 - - 示例: - - 用户最新问题:“今天张三班组有多少作业计划?” - - 用户最新问题:“今天绿雪莲塘工程有多少作业计划” - - 最终提问均为: 原句不变。 - - 第三步:用户最新问题是否存在指代词?→ 结合用户最新问题和最新对话历史进行补全 - - 若用户最新问题问题中出现模糊表达,如“具体是哪些项”、“是哪两个”、“作业计划分别是什么”、“合肥中心变工程呢”、“具体是哪20项”等,请只使用紧邻最新问题之前的用户问题和AI回复补全问题信息。 + + 第一步:用户最新问题是否存在指代词?→ 结合用户最新问题和历史用户问题进行补全 + - 若用户最新问题中出现模糊表达,如“具体是哪些项”、“是哪两个”、“作业计划分别是什么”、“合肥中心变工程呢”、“具体是哪20项”、“考勤人数呢”等,请根据需要结合最新对话历史和最老对话历史的补全问题信息; + - 需要补全的信息包括时间、主语、查询对象等; + - **特别地,若最新用户问题中未提及时间,但最新对话历史中的用户问题中出现“今天”“昨日”“本周”等时间词,则需要将其补全进最终问题中;** + - **特别地,若最新用户问题中未提及时间,但最老对话历史中的用户问题中出现“今天”“昨日”“本周”等时间词,则需要将其补全进最终问题中;** - 示例1: - - 用户最新问题:“具体的作业计划分别是什么” - - 紧邻最新问题的对话历史的用户问题:“今天公司有多少项作业计划” - - 紧邻最新问题的对话历史的AI回答:“2025-04-25公司一共有421项作业计划,分别如下:风险等级为2级的有15项,3级的有144项,4级的有262项,5级的有0项” - - 则最终提问应为: - “今天公司的421项作业计划分别是什么” - - 示例2: - 用户最新问题:“具体的作业内容是什么” - - 最新对话历史的用户问题:今天送一分公司第一项目部有多少项作业计划 - - 最新对话历史的AI回答:今天送电一分公司第一项目管理部有21项作业计划 + - 最新对话历史的用户问题:“送一分公司第一项目部今天有多少项作业计划” + - 最新对话历史的AI回答:“送电一分公司第一项目管理部有21项作业计划” - 则最终提问应为: “今天送电一分公司第一项目管理部的21项作业计划分别是什么” - 第四步:用户最新问题是否为序号指代(第一个/第2个)?→ 用完整工程/项目/公司名替换补全 + - 示例2: + - 用户最新问题:“2项作业计划是什么” + - 最老对话历史的用户问题:“宋1分公司第一项目部今天有多少作业计划” + - 最老对话历史的AI回答:“未匹配到您说的分公司名:宋1分公司,请提供更准确的分公司名” + - 最新对话历史的用户问题:“送一分公司” + - 最新对话历史的AI回答:“送电一分公司第一项目管理部有2项作业计划” + - 则最终提问应为: + “今天送电一分公司第一项目管理部的2项作业计划是什么” + + - 示例3: + - 用户最新问题:“具体的班组详情” + - 最新对话历史的用户问题:“送一分公司第一项目部今天有多少班组” + - 最新对话历史的AI回答:“送电一分公司第一项目部(金上)有20个班组” + - 则最终提问应为: + “送电一分公司第一项目部(金上)今天具体的20个班组详情” + + + 第二步:用户最新问题是否为序号指代(第一个/第2个)?→ 用完整工程/项目/公司名替换补全 - 精确提取用户所指的序号(如“第3个”指第3个工程名、公司名或项目部名); - 将该工程、公司或项目部的完整名称(包括括号中的编号)提取出来; - - 用完整名称替换掉最新对话历史的用户问题中出现的简称或模糊表达; - - 必须保留最新对话历史的用户问题中的所有其他关键信息(包括但不限于:项目部名称、时间、计划数、内容如"进度情况""作业计划""作业内容"等); + - 用完整工程、公司或项目部的名称替换掉最新对话历史的用户问题中出现的简称或模糊表达,但保留其他信息不变; + - 必须保留最新对话历史的用户问题中的所有其他关键信息(如具体的动作和操作的内容包括但不限于:项目部名称、时间、计划数、内容如"进度情况""作业计划""作业内容"“摄像头”“视频”等); + - 禁止添加用户原始问题中未出现的动作性动词(例如:“打开”“查看”“查询”“显示”“展示”等); - 示例1: - 用户最新问题:"第二个" 或"第2个" - 最新对话历史的用户问题:"2025年南苑调相机检修(PROJ-2023-0179)今天有多少作业计划"" - 最新对话历史的AI回答:你说的工程名可能是,第一个:检修公司调相机一二次设备检修维护和改造服务框架-2025年南苑调相机检修(PROJ-2023-0179),第二个:黄阳-仙河110kV线路工程(PROJ-2024-0047),请确认您要选择哪一个? - 则最终提问应为: - `黄阳-仙河110kV线路工程(PROJ-2024-0047))今天有多少作业计划` + "黄阳-仙河110kV线路工程(PROJ-2024-0047))今天有多少作业计划" + - 示例2: - 用户最新问题:"第2个" 或"第二个" - - 紧最新对话历史的用户问题:"请帮我查一下今天芦集变电站的进度情况" + - 最新对话历史的用户问题:"请帮我查一下今天芦集变电站的进度情况" - 最新对话历史的AI回答:你说的工程名可能是,第1个:芦集-古沟π入潘集变电站220kV线路工程(PROJ-2024-0189),第二个:淮南芦集220千伏变电站220千伏配电装置改造工程(PROJ-2024-0265),请确认您要选择哪一个? - 则最终提问应为: "请帮我查一下今天淮南芦集220千伏变电站220千伏配电装置改造工程(PROJ-2024-0265)的进度情况" - - 示例3(新增关键保留示例): + + - 示例3: - 用户最新问题:"第2个" - 最新对话历史的用户问题:"宏源电力公司第三项目部今天有多少项作业计划" - 最新对话历史的AI回答:您说的实施组织名可能是,第1个:安徽宏源电力建设有限公司(线路),第2个:安徽宏源电力建设有限公司(变电),请选择哪一个 - 则最终提问应为: "安徽宏源电力建设有限公司(变电)第三项目部今天有多少项作业计划" - 第五步:输出最终问题 + - 示例4: + - 用户最新问题:"第2个" + - 最新对话历史的用户问题:"打开中心变摄像头" + - 最新对话历史的AI回答:您说的工程名可能是,第1个:锦绣-常青π入中心变电站220kV架空线路工程(PROJ-2024-1206),第2个:合肥中心变B包(PROJ-2024-0176),请选择哪一个 + - 则最终提问应为: + "打开合肥中心变B包(PROJ-2024-0176)摄像头" + + - 示例5: + - 最新对话历史的用户问题:“今天循环园工程有多少项作业计划” + - 最新对话历史的AI回答:“您说的工程名可能是:第1个... 第2个... 第3个:黄山巷联-水西220kV线路工程(PROJ-2024-0220),请确认您要选择哪一个?” + - 用户最新问题:“第3个” + - 错误输出(不要这样):“打开黄山巷联-水西220kV线路工程(PROJ-2024-0220)今天有多少项作业计划” + - 正确输出(你应该输出):“黄山巷联-水西220kV线路工程(PROJ-2024-0220)今天有多少项作业计划” + + 第三步:输出最终问题 - 直接输出最终问题(无解释、无多余前缀或后缀) - 保持句式自然清晰 @@ -381,6 +391,7 @@ def extract_multi_chat(messages): {"role": "user", "content": prompt} ] + # logger.info(f"*********messages:{prompt}") response = client.chat.completions.create( messages=message, model=model_name,