调整提示词、简化代码

This commit is contained in:
2025-09-25 16:23:13 +08:00
parent 640e02f89e
commit 2b13fdab99
5 changed files with 235 additions and 476 deletions
+17 -21
View File
@@ -17,21 +17,18 @@ from typing import List, Tuple, Dict, Any, Optional
import re
import jieba
import time
import threading
from .PromptTemplates import (classification_prompt, query_rewrite_prompt_pro,
extract_nouns_prompt, classification_info,
slot_filling_prompt, step_back_prompt,
hyde_prompt)
slot_filling_prompt, step_back_prompt)
from .DataModels import (
Classification, QueryRewrite, Term, TermList,
SoftwareFunctionSlots, SoftwareTroubleShootingSlots, ProfessionalConsultingSlots,
DataProblemSlots, FileExtensionConsultingSlots, SoftwareLockSlots,
InstallationDownloadSlots, ProblemDiagnosisSlots, OtherSlots, IntentAndSlotResult,
StepBackPrompt, HypotheticalDocument
InstallationDownloadSlots, ProblemDiagnosisSlots, OtherSlots,
StepBackPrompt
)
from .ProfessionalNounVector import ProfessionalNounRetriever, AsyncProfessionalNounRetriever
from rag2_0.tool.ModelTool import OpenAiLLM
class AsyncIntentRecognizer:
@@ -344,22 +341,20 @@ class AsyncIntentRecognizer:
"""
start_time = time.time() # 记录开始时间
prompt=f"""
当前提问内容:
<query>{query}</query>
对话上下文:
<chat_history>
{json.dumps(chat_history, ensure_ascii=False)}
</chat_history>
prompt=f"""当前提问内容:
<query>{query}</query>
对话上下文:
<chat_history>
{json.dumps(chat_history, ensure_ascii=False)}
</chat_history>
1、请从当前提问内容中提取电力造价行中定额编码、定额名称、清单编码、清单名称
2、请勿随机编造,如果没有提取到内容返回空的JSON
3、返回结果为json格式,必须严格以纯JSON格式输出
{{
"dinge_info_list":{{"dinge_code_list":["xxxx","xxxx"], "dinge_name_list":["xxxx","xxxx"]}},
"qingdan_info":{{"qingdan_code_list":["xxxx","xxxx"], "qingdan_name_list":["xxxx","xxxx"]}}
}}
"""
1、请从当前提问内容中提取电力造价行中定额编码、定额名称、清单编码、清单名称
2、请勿随机编造,如果没有提取到内容返回空的JSON
3、返回结果为json格式,必须严格以纯JSON格式输出
{{
"dinge_info_list":{{"dinge_code_list":["xxxx","xxxx"], "dinge_name_list":["xxxx","xxxx"]}},
"qingdan_info":{{"qingdan_code_list":["xxxx","xxxx"], "qingdan_name_list":["xxxx","xxxx"]}}
}}"""
try:
# response = await self._llm.ainvoke(prompt, response_format={"type": "json_object"}, extra_body={"enable_thinking": False})
@@ -489,6 +484,7 @@ class AsyncIntentRecognizer:
# 特殊处理 锁相关咨询
if classification.vertical_classification == "安装下载注册" and classification.sub_classification == "软件锁类":
process_lock_start_time = time.time()
# 特殊处理提问只有锁号的问题,手动将问题改写为特定格式
rewrite.rewrite = self._process_lock_related_query(rewrite.rewrite)
process_lock_end_time = time.time()
process_lock_time = process_lock_end_time - process_lock_start_time
+34 -133
View File
@@ -56,13 +56,11 @@ classification_info="""【垂直领域分类】:
4. 问题排查类:软件安装下载失败、报错,系统兼容性问题等
【固定话术类包括以下类】:
1. 规费咨询
**以下两种情况才属于该类**
1、当询问规费(如社会保障费和住房公积金)费率是/填多少
2、去哪里获取规费费率
**其余涉及规费的属于其他垂直领域分类**
2. 调差下载更新
**以下两种情况才属于该类**
1、询问如何下载导入调差文件、调差插件
@@ -73,111 +71,29 @@ classification_info="""【垂直领域分类】:
【其他】:
1. 其他
分类优先级:
固定话术类 > 软件问题 、 业务问题 、 安装下载注册 > 其他
"""
分类优先级:固定话术类 > 软件问题 、 业务问题 、 安装下载注册 > 其他"""
classification_prompt="""
用户正在使用电力造价软件或想询问电力造价领域相关知识,你需要根据用户的输入内容集合历史对话(如果存在),将其归类为以下垂直领域之一:
{classification_info}
classification_prompt="""用户正在使用电力造价软件或想询问电力造价领域相关知识,你需要根据用户的输入内容集合历史对话(如果存在),将其归类为以下垂直领域之一:
{classification_info}
## 【历史对话记录】
{chat_history}
## 【历史对话记录】
{chat_history}
【用户输入】:
{user_input}
【用户输入】:
{user_input}
【输出格式要求】:
{output_format}
【示例】
用户输入1: 技改T1怎样新建工程
输出1:
{{
"vertical_classification":"软件问题",
"sub_classification":"软件功能"
}}
"""
query_rewrite_prompt = """
# 电力造价专业问答优化工程师
你是一名电力造价专业问答优化工程师,负责通过专业关键词集合替换原始问题中的非专业表述以提升知识库检索准确率。
## 核心任务
将用户的原始问题结合专业术语库进行规范化重构,提高知识库检索的准确性和专业性。
## 处理流程
### 第一阶段:输入解析
1. 解析基础信息
- 原始问题(需保留核心语义){query}
- 关键词集合:{keywords}
### 第二阶段:匹配分析
**匹配规则:**
1. 检查原始问题中是否包含关键词集合中的`name`字段或`synonymous`字段中的任何词汇
2. 统计匹配的术语数量
3. 判断执行路径:
- 匹配术语 ≥ 1个 → 执行重构流程
- 匹配术语 = 0个 → 直接输出原始问题
### 第三阶段:问题重构
**重构原则(按优先级排序):**
1. **语义保真**:严格保持原问题的核心意图和诉求
2. **术语规范**
- 将匹配到的同义词替换为对应的标准术语(name字段)
- 对在关键词中的标准术语使用【】进行标记
- 保留在原问题中未在关键词库中的专业术语、限定词和修饰词
3. **结构优化**
- 保持原问题的语态特征5W2H
- 保持主谓宾结构清晰
- 保留时间、版本等限定条件
**术语处理规则:**
- 优先级1:保留原问题中的专业术语、限定词和修饰词(即使不在关键词库中)
- 优先级2:将同义词替换为标准术语并用【】标记
- 优先级3:对原问题中已存在的标准术语添加【】标记
# 输出规范
【输出格式要求】:
{output_format}
# 示范案例库
▶ 案例1(有效匹配)
入:
原始问题:怎么把旧版西藏定额工程转到Z1新版
关键词:【'老版本定额升级', '批量设置定额', '西藏造价软件Z1'
输出:
{{"rewrite":"【西藏造价软件Z1】如何执行【老版本定额升级】操作?"}}
【示例】
用户输入1: 技改T1怎样新建工程
出1:
{{
"vertical_classification":"软件问题",
"sub_classification":"软件功能"
}}"""
▶ 案例2(无效匹配)
输入:
原始问题:程序界面文字显示过小如何处理?
关键词:【'定额升级', '工程批量导入'
输出:
{{"rewrite":"程序界面文字显示过小如何处理?"}}
▶ 案例3(部分匹配,但保留修饰限定词)
输入:
原始问题:"配网软件D3能导出清单的计算公式吗?
关键词:【'配网工程计价通D3软件', '计算式'
输出(保留限定修饰词"清单")
{{"rewrite":"【配网工程计价通D3软件】能导出清单的【计算式】吗?"}}
## 质量检查清单
执行前请确认:
- [ ] 是否保持了原问题的核心诉求?
- [ ] 是否正确执行了同义词替换?
- [ ] 是否保留了原问题中的专业术语和限定条件?
- [ ] 是否正确使用了【】标记?
- [ ] 重构后的问题是否自然流畅?
"""
query_rewrite_prompt_pro="""
# 问答优化工程师
query_rewrite_prompt_pro="""# 问答优化工程师
**角色**:基于历史对话和术语库重构问题,提升知识库检索准确率。
**最高准则**
1、保持问题核心意图,允许指代消除
@@ -196,18 +112,18 @@ query_rewrite_prompt_pro="""
## 处理流程
### 一、输入解析
- 原始问题(需保留核心语义):
<query> {query} </query>
- 原始问题(需保留核心语义):
<query> {query} </query>
- 术语库集合(用于同义词转标准词环节):
<keywords>
{keywords}
</keywords>
- 术语库集合(用于同义词转标准词环节):
<keywords>
{keywords}
</keywords>
- 历史对话记录:
<history>
{chat_history}
</history>
- 历史对话记录:
<history>
{chat_history}
</history>
### 一、重构流程
1、问题是否指代不明,指代不明时根据历史对话补充上下文
@@ -221,23 +137,11 @@ query_rewrite_prompt_pro="""
## 输出规范
{output_format}
## 示例模仿
示例1
输入:
<history>
'user': '811623110668是哪款软件的锁?
'assistant': 可通过查询软件锁的许可证信息,通过许可证名称可以判断对应软件
</history>
<query> ”锂离子电池储能安装“ </query>
输出:
{{"rewrite": "许可证名称为‘锂离子电池储能安装’对应什么软件?"}}
## 质量自检
- [] **主题是否合理继承?**
- [] 核心诉求是否保留?
- [] 语句是否自然流畅?
- [] 避免补充无关信息
"""
- [] 避免补充无关信息"""
slot_filling_prompt = """
你是一个专业的电力造价领域问题槽位填充助手。你需要从用户问题中提取关键信息,并填充到对应的数据结构中。
@@ -282,8 +186,7 @@ slot_filling_prompt = """
"""
# 意图优化环节提示词模板
step_back_prompt = """
# 后退提示生成器
step_back_prompt = """# 后退提示生成器
你是一个专业的电力造价领域问题抽象专家。你的任务是根据用户的具体问题,提出一个更抽象、更高层次的问题,帮助系统更好地理解用户的意图。
@@ -292,11 +195,11 @@ step_back_prompt = """
2. 考虑历史对话和会话背景,理解用户当前问题的上下文
3. 生成更抽象、更高层次的问题,称为"后退问题",后退问题可以生成多个,依次后退到更抽象、更高层次的问题
4. 后退问题应该:
- 更加通用和抽象,不应包含原始问题的具体细节(包括场景限定、界面限定等其他限定词语)
- 涵盖原始问题的核心主题
- 去除过于具体的限制条件(如时间、地点、特定版本、特定工程等)
- 保持在同一领域和主题范围内
- 依次移除问题中的限定词或者修饰词
- 更加通用和抽象,不应包含原始问题的具体细节(包括场景限定、界面限定等其他限定词语)
- 涵盖原始问题的核心主题
- 去除过于具体的限制条件(如时间、地点、特定版本、特定工程等)
- 保持在同一领域和主题范围内
- 依次移除问题中的限定词或者修饰词
## 输入
用户原始问题: {query}
@@ -320,9 +223,7 @@ step_back_prompt = """
"original_query": "某个设备更换后,如何在系统中更新对应的定额?",
"can_use_back_prompt": true,
"step_back_query": ["如何更新设备对应的定额?", "如何更新定额?"]
}}
"""
}}"""
follow_up_questions_prompt = """
# 后续问题生成器