#!/usr/bin/env python # -*- coding: utf-8 -*- """ File: Multi_PromptTemplates.py Author: oyyz Date: 2025-06-13 Description: 多轮对话下意图分类、改写核心提示词 """ intent_and_slot_prompt = """ # 你是一个专业的电力造价领域智能助手,负责对用户输入进行意图分类识别和关键信息槽位填充。 {classification_info} {slot_mapping_doc} ## 【软件名称规范】 支持的软件名称及其别名: - **配网工程计价通D3软件**:别名包括配网D3、D3软件、配网工程软件等 - **新型储能电站建设计价通C1软件**:别名包括储能C1、C1软件、储能电站软件、储能软件等 - **西藏电力工程计价通Z1软件**:别名包括西藏Z1、Z1软件、西藏电力软件等 - **技改检修工程计价通T1软件**:别名包括技改T1、T1软件、技改检修软件等 - **技改检修清单计价通T1软件**:别名包括技改清单T1、T1清单软件、技改检修清单软件等 - **主网电力建设计价通软件**:别名包括主网软件、电力建设软件、主网建设软件、博微电力建设计价通等 不在上述软件之列的,使用用户输入中的软件名称 ## 【任务要求】 1. **会话理解**:综合考虑会话背景、历史对话和之前的槽位信息来理解当前用户输入 2. **意图分类**:准确识别用户输入属于哪个垂直领域和子分类 3. **槽位填充**:从当前用户问题中提取关键信息,并结合历史槽位信息进行补充完善 4. **信息融合**: - 优先使用当前用户输入中的明确信息 - 当前输入缺失但历史槽位存在的信息,可适当继承 - 历史对话中的上下文信息有助于理解当前输入的真实意图 5. **槽位处理**: - 对于必填槽位,必须尽力从当前输入和历史信息中提取 - 对于选填槽位,如果能从当前输入或历史信息中提取则填写 - 如果当前输入与历史信息存在冲突,以当前输入为准 6. **输出格式**:只输出符合格式的JSON数据,不要有任何额外的解释 ## 【会话背景信息】 {conversation_context} ## 【历史对话记录】 {chat_history} ## 【历史槽位信息】 {previous_slots} ## 【当前用户输入】 {user_input} ## 【输出格式】 {output_format} """ output_example=""" ## 【综合分析示例】 **示例1:利用历史对话理解当前输入** 会话背景: 用户正在咨询软件使用问题 历史对话: - 用户: "我在使用配网D3软件" - 助手: "好的,请问您遇到什么问题?" 历史槽位:{"software_name": "配网工程计价通D3软件"} 当前用户输入: "新建工程按钮找不到" 输出: ```json { "classification": { "vertical_classification": "软件问题", "sub_classification": "软件功能" }, "slot_filling": { "software_name": "配网工程计价通D3软件", "function_name": "新建工程", "operation": "查找新建工程按钮位置", "software_version": null, "operation_steps": null } } ``` **示例2:继承和更新槽位信息** 会话背景: 用户遇到软件报错,正在进行故障排查 历史对话: - 用户: "西藏Z1软件报错了" - 助手: "请详细描述一下报错信息" 历史槽位: {"software_name": "西藏电力工程计价通Z1软件"} 当前用户输入: "提示找不到许可证,是在新建工程的时候" 输出: ```json { "classification": { "vertical_classification": "软件问题", "sub_classification": "故障排查" }, "slot_filling": { "software_name": "西藏电力工程计价通Z1软件", "function_name": "新建工程", "error_message": "提示找不到许可证", "software_version": null, "os_version": null, "reproduction_steps": "新建工程时出现错误" } } ``` **示例3:信息冲突处理** 会话背景: 用户在多个软件间切换咨询 历史对话: - 用户: "配网D3的费用计算" - 助手: "好的,关于配网D3的费用计算..." 历史槽位: {"software_name": "配网工程计价通D3软件"} 当前用户输入: "不对,我说的是技改T1软件的材料费怎么算" 输出: ```json { "classification": { "vertical_classification": "业务问题", "sub_classification": "数据问题" }, "slot_filling": { "expense_type": "材料费", "operation_purpose": "了解费用计算方法", "software_name": "技改检修工程计价通T1软件", "project_type": null } } ``` """ def generate_slot_mapping_doc() -> str: """ 生成分类与槽位模型对应关系的文档 Returns: str: 格式化的文档字符串 """ mapping = { "软件问题": { "软件功能": "SoftwareFunctionSlots", "故障排查": "SoftwareTroubleShootingSlots" }, "业务问题": { "专业咨询": "ProfessionalConsultingSlots", "数据问题": "DataProblemSlots" }, "安装下载注册": { "后缀名咨询": "FileExtensionConsultingSlots", "软件锁类": "SoftwareLockSlots", "安装下载类": "InstallationDownloadSlots", "问题排查类": "ProblemDiagnosisSlots" }, "其他": { "其他": "OtherSlots" } } doc = ["## 【分类与槽位模型对应关系】"] for vertical, sub_classes in mapping.items(): doc.append(f"\n{vertical}:") for sub_class, slot_model in sub_classes.items(): doc.append(f"- {sub_class} -> {slot_model}") doc.append("\n## 【注意事项】") doc.append("1. 分类与槽位模型必须严格对应。严格遵守,不得违背") doc.append("2. 每个分类只能使用其对应的槽位模型") doc.append("3. 不允许混用不同分类的槽位模型") return "\n".join(doc)