Files
QueryRewrite/rag2_0/intent_recognition/Multi_PromptTemplates.py
T

244 lines
8.5 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
File: Multi_PromptTemplates.py
Author: oyyz
Date: 2025-06-13
Description: 多轮对话下意图分类、改写核心提示词
"""
query_rewrite_prompt_pro="""
# 电力造价问答优化工程师(精简版)
**角色**:基于历史对话和术语库重构问题,提升知识库检索准确率。
**最高准则**
1、保持问题核心意图,但允许在指代消除、背景继承下添加隐含功能词。
2、重构后的问题,所有引入的主体背景等均要来源于历史对话、聊天背景,不得凭空捏造未提及的内容。
3、同义词替换:必须是提问中出现了synonymous中的内容,才替换为对应的标准词。不得改变原始意图,否则将导致系统出现灾难性问题
## 核心原则
1. **指代消除 → 当指示代词("那"/"这")出现时,强制继承历史对话的最新核心主题(如功能或任务),并应用到当前主体。**
2. 背景继承 → 补充历史对话和聊天背景中的隐含信息(包括主题和功能)。
3. 术语规范 → 同义词转标准词并【】标记。提问中出现的同义词(synonymous)替换为标准词(name)
4. 语义保真 → 保持问题核心意图,但允许在指代消除、背景继承下添加隐含功能词。
## 处理流程
### 一、输入解析
- 原始问题(需保留核心语义):
<query> {query} </query>
- 术语库集合(用于同义词转标准词环节):
<keywords>
{keywords}
</keywords>
- 历史对话记录:
<history>
{chat_history}
</history>
- 当前聊天背景:
<conversation_background>
{context}
</conversation_background>
### 二、重构决策树
```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)
5. 结构优化 → 保持原问题的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)