#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
File: Multi_PromptTemplates.py
Author: oyyz
Date: 2025-06-13
Description: 多轮对话下意图分类、改写核心提示词
"""
query_rewrite_prompt_pro="""
# 电力造价问答优化工程师(精简版)
**角色**:基于历史对话和术语库重构问题,提升知识库检索准确率。
最高准则:保持问题核心意图,但允许在指代消除、背景继承下添加隐含功能词。但重构后的问题,所有引入的主体背景等均要来源于历史对话、聊天背景或术语库,不得凭空捏造未提及的内容。
## 核心原则
1. **指代消除 → 当指示代词("那"/"这")出现时,强制继承历史对话的最新核心主题(如功能或任务),并应用到当前主体。**
2. 背景继承 → 补充历史对话和聊天背景中的隐含信息(包括主题和功能)。
4. 术语规范 → 同义词转标准词并【】标记。提问中的同义词(synonymous)替换为标准词(name)
5. 语义保真 → 保持问题核心意图,但允许在指代消除、背景继承下添加隐含功能词。
## 处理流程
### 一、输入解析
- 原始问题(需保留核心语义):
{query}
- 术语库集合:
{keywords}
- 历史对话记录:
{chat_history}
- 当前聊天背景:
{context}
### 二、重构决策树
```mermaid
graph TD
A[输入问题] --> B{{包含指示代词?}}
B -- 是 --> C[提取历史最新主题]
C --> D{{主题是否明确?}}
D -- 是 --> E[继承主题到当前问题]
E --> F[执行重构]
D -- 否 --> F
F --> G[补充缺失背景]
G --> H[同义词替换+【】标记]
H --> I[保留原生专业术语]
B -- 否 --> I
```
### 三、重构优先级
1. **指代消除 → 当指示代词出现时,优先继承历史对话的核心主题(如功能词),并替换当前问题的动词部分。**
2. 背景继承 → 历史对话中确定的背景信息需要保留。
3. 术语处理 → 同义词转标准词 + 【】标记。
4. 同义词转标准词 → 将提问中的同义词(synonymous)替换为标准词(name)
4. 结构优化 → 保持原问题的5W2H特征,指代消除、背景继承下允许微调意图。
## 输出规范
{output_format}
## 质量自检
- [] **主题是否合理继承?**(当有代词时,历史主题必须注入)
- [] 核心诉求是否保留?
- [] 背景信息是否合理补充?
- [] 术语标记是否完整【】?
- [] 语句是否自然流畅?
- [] 避免补充无关信息
"""
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)